zoukankan      html  css  js  c++  java
  • 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();
        }
    }
    『愿你我既可以朝九晚五,又能够浪迹天涯』
  • 相关阅读:
    react-project(二)
    JS--轻松设置获取表单数据
    C#基础---Queue(队列)的应用
    C#基础---Attribute(标签) 和 reflect(反射) 应用二
    C#基础---Attribute(标签) 和 reflect(反射) 应用
    基于Cordova的博客园三方App
    Vue站点的搭建之旅
    移动端浏览器问题汇总
    C#基础---浅谈XML读取以及简单的ORM实现
    WebSite---前台系统图片验证码心得
  • 原文地址:https://www.cnblogs.com/zjwwljty/p/9328810.html
Copyright © 2011-2022 走看看