• RSA 加密 & 解密


    import java.security.Key;
    import java.security.KeyFactory;
    import java.security.KeyPair;
    import java.security.KeyPairGenerator;
    import java.security.PrivateKey;
    import java.security.PublicKey;
    import java.security.interfaces.RSAPrivateKey;
    import java.security.interfaces.RSAPublicKey;
    import java.security.spec.PKCS8EncodedKeySpec;
    import java.security.spec.X509EncodedKeySpec;
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.crypto.Cipher;
    
    import org.apache.commons.codec.binary.Base64;
    
    public class RSAUtils {
        /** 非对称密钥算法 */
        public static final String KEY_ALGORITHM = "RSA";
        /** 密钥长度,DH算法的默认密钥长度是1024 密钥长度必须是64的倍数,在512到65536位之间  */
        private static final int KEY_SIZE = 512;
        /** 公钥 */
        private static final String PUBLIC_KEY = "RSAPublicKey";
        /** 私钥 */
        private static final String PRIVATE_KEY = "RSAPrivateKey";
        
        public static void main(String[] args) throws Exception {
            //初始化密钥,生成密钥对
            Map<String, Object> keyMap = RSAUtils.initKey();
            //公钥
            byte[] publicKey = RSAUtils.getPublicKey(keyMap);
            System.out.println("公钥:" + Base64.encodeBase64String(publicKey));
            //私钥
            byte[] privateKey = RSAUtils.getPrivateKey(keyMap);
            System.out.println("私钥=:"+ Base64.encodeBase64String(privateKey));
            //待加密数据
            String str1 = "RSA私钥加密公钥解密";
            System.out.println("------step1------私钥加密------");
            System.out.println("私钥加密原文:" + str1);
            //私钥加密
            byte[] code1 = RSAUtils.encryptByPrivateKey(str1.getBytes(), privateKey);
            System.out.println("私钥加密后的数据:" + Base64.encodeBase64String(code1));
            //公钥解密
            System.out.println("------step2------公钥解密------");
            byte[] decode1 = RSAUtils.decryptByPublicKey(code1, publicKey);
            System.out.println("公钥解密后的数据:" + new String(decode1));
            System.out.println("------step3------公钥加密------");
            String str2 = "RSA公钥加密私钥解密";
            System.out.println("公钥加密原文:" + str2);
            //乙方使用公钥对数据进行加密
            byte[] code2 = RSAUtils.encryptByPublicKey(str2.getBytes(), publicKey);
            System.out.println("公钥加密后的数据:" + Base64.encodeBase64String(code2));
            System.out.println("------step4------私钥解密------");
            //甲方使用私钥对数据进行解密
            byte[] decode2 = RSAUtils.decryptByPrivateKey(code2, privateKey);
            System.out.println("私钥解密后的数据:" + new String(decode2));
        }
        
        /** 初始化密钥对   */
        public static Map<String, Object> initKey() throws Exception {
            //实例化密钥生成器
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM);
            //初始化密钥生成器
            keyPairGenerator.initialize(KEY_SIZE);
            //生成密钥对
            KeyPair keyPair = keyPairGenerator.generateKeyPair();
            //甲方公钥
            RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
            //甲方私钥
            RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
            //将密钥存储在map中
            Map<String, Object> keyMap = new HashMap<String, Object>();
            keyMap.put(PUBLIC_KEY, publicKey);
            keyMap.put(PRIVATE_KEY, privateKey);
            return keyMap;
        }
    
        /**
         * 私钥加密
         * @param data 待加密数据
         * @param key       密钥
         * @return byte[] 加密数据
         */
        public static byte[] encryptByPrivateKey(byte[] data, byte[] key) throws Exception {
            //实例化密钥工厂
            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
            //密钥材料转换
            PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);
            //生成私钥
            PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
            //数据加密
            Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
            cipher.init(Cipher.ENCRYPT_MODE, privateKey);
            return cipher.doFinal(data);
        }
    
        /**
         * 公钥加密
         * @param data 待加密数据
         * @param key       密钥
         * @return byte[] 加密数据
         */
        public static byte[] encryptByPublicKey(byte[] data, byte[] key) throws Exception {
            //实例化密钥工厂
            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
            //密钥材料转换
            X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);
            //生成公钥
            PublicKey pubKey = keyFactory.generatePublic(x509KeySpec);
            //数据加密
            Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
            cipher.init(Cipher.ENCRYPT_MODE, pubKey);
            return cipher.doFinal(data);
        }
    
        /**
         * 私钥解密
         * @param data 待解密数据
         * @param key  密钥
         * @return byte[] 解密数据
         */
        public static byte[] decryptByPrivateKey(byte[] data, byte[] key) throws Exception {
            //实例化密钥工厂
            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
            //密钥材料转换
            PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);
            //生成私钥
            PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
            //数据解密
            Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            return cipher.doFinal(data);
        }
    
        /**
         * 公钥解密
         * @param data 待解密数据
         * @param key  密钥
         * @return byte[] 解密数据
         */
        public static byte[] decryptByPublicKey(byte[] data, byte[] key) throws Exception {
            //实例化密钥工厂
            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
            //密钥材料转换
            X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);
            //产生公钥
            PublicKey pubKey = keyFactory.generatePublic(x509KeySpec);
            //数据解密
            Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
            cipher.init(Cipher.DECRYPT_MODE, pubKey);
            return cipher.doFinal(data);
        }
    
        /**
         * 取得私钥
         * @param keyMap 密钥map
         * @return byte[] 私钥
         */
        public static byte[] getPrivateKey(Map<String, Object> keyMap) {
            Key key = (Key) keyMap.get(PRIVATE_KEY);
            return key.getEncoded();
        }
    
        /**
         * 取得公钥
         * @param keyMap 密钥map
         * @return byte[] 公钥
         */
        public static byte[] getPublicKey(Map<String, Object> keyMap) throws Exception {
            Key key = (Key) keyMap.get(PUBLIC_KEY);
            return key.getEncoded();
        }
    }
    『愿你我既可以朝九晚五,又能够浪迹天涯』
  • 相关阅读:
    IOS-github优秀开源项目大全
    IOS-UISearchBar
    iOS-资源大全
    基于java的https双向认证,android上亦可用
    三重Des对称加密在Android、Ios 和Java 平台的实现
    Python练习—文件
    C语言文件进阶操作
    C语言文件基本操作
    二叉树模板
    单源最短路——Dijkstra算法
  • 原文地址:https://www.cnblogs.com/zjwwljty/p/9328810.html
Copyright © 2020-2023  润新知