zoukankan      html  css  js  c++  java
  • 数据加密之RSA

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过。如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/mao2080/

    1、生成公钥私钥对

     1 package com.mao.common.util;
     2 
     3 import java.security.KeyPair;
     4 import java.security.KeyPairGenerator;
     5 import java.security.interfaces.RSAPrivateKey;
     6 import java.security.interfaces.RSAPublicKey;
     7 
     8 import org.apache.tomcat.util.codec.binary.Base64;
     9 
    10 /**
    11  * 
    12  * 描述:密钥生成器
    13  * @author mao2080@sina.com
    14  * @created 2017年4月20日 下午8:32:20
    15  * @since
    16  */
    17 public class Generator {
    18 
    19     public static final String ALGORITHM_RSA = "RSA";
    20 
    21     public static void main(String[] args) throws Exception {
    22         KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(ALGORITHM_RSA);
    23         keyPairGen.initialize(1024);
    24         KeyPair keyPair = keyPairGen.generateKeyPair();
    25         RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
    26         byte[] keyBs = rsaPublicKey.getEncoded();
    27         String publicKey = encodeBase64(keyBs);
    28         System.out.println("生成的公钥:
    " + publicKey);
    29         RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
    30         keyBs = rsaPrivateKey.getEncoded();
    31         String  privateKey = encodeBase64(keyBs);
    32         System.out.println("生成的私钥:
    " + privateKey);
    33     }
    34     
    35     /**
    36      * 
    37      * 描述:byte数组转String
    38      * @author mao2080@sina.com
    39      * @created 2017年4月9日 下午8:43:05
    40      * @since 
    41      * @param source
    42      * @return
    43      * @throws Exception
    44      */
    45     public static String encodeBase64(byte[] source) throws Exception {
    46         return new String(Base64.encodeBase64(source), "UTF-8");
    47     }
    48 
    49     /**
    50      * 
    51      * 描述:String转byte数组
    52      * @author mao2080@sina.com
    53      * @created 2017年4月9日 下午8:42:59
    54      * @since 
    55      * @param target
    56      * @return
    57      * @throws Exception
    58      */
    59     public static byte[] decodeBase64(String target) throws Exception {
    60         return Base64.decodeBase64(target.getBytes("UTF-8"));
    61     }
    62 
    63 }

    运行结果:

    生成的公钥:
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHj1kf4EV0zCVdleIq/3pSm+tV0xuDGaXDzDyjVhDmrSptFv3MkBRY73qxbs/ZHGsVAwsY1kvh5qrFLdUesGMw92PgWwSXrNfBxYBLECweG0iIe8vTtvo824KdrJK3/1jPSXMJ0jYRaWXGr0qtEv5ak81kF/pDMiDG86wLKnq1jQIDAQAB
    生成的私钥:
    MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMePWR/gRXTMJV2V4ir/elKb61XTG4MZpcPMPKNWEOatKm0W/cyQFFjverFuz9kcaxUDCxjWS+HmqsUt1R6wYzD3Y+BbBJes18HFgEsQLB4bSIh7y9O2+jzbgp2skrf/WM9JcwnSNhFpZcavSq0S/lqTzWQX+kMyIMbzrAsqerWNAgMBAAECgYAo33xiof232WRB0cQcCG2WY+cEkhONe4BPJRK6ZZNam9cXtuDOuCfiu1IG62pYzpBEInZwZNvv7d3GOwfunDQEY1Zt6TC6D8E59aRGE+2HofVwA47X3ulXz8EsV9ZXYd/Eq/P0tpDci6DtWC/Gh0UZSgcUhwM6DXwa9ctMo3VxoQJBAPvHQ0SbapSOxqALc9WNrG/dq2wvQaecCnuVqhrl7ZuIeGronQMvsxFHMBp2OPcK/64jESZ9LoAoPnwlYuIs33kCQQDK5/E4YnBjzb6w//l1e1dhIbRwMZHkn8VNMorYjTQemX9m7gsJeAPSBF11lo1XGWR84M0nPMnrnyeG8zl68B21AkEA81Cf+19OYn6QCP7IVGpzaDAKh6QriLTNlJ0QJKprM1FxPa/KfNfN7zaikBAMAQIKENkmq9Fx7Lv3lrXyl6zR0QJAeSLb+kOawZrVm6pWbfMDCbQrm0ecyBcynZHtHre+Q/5z9ylqYW7LKRj+CvOk0jkQqxUypZg/HHJaENEooeK0eQJAVckJuNXO+XQsMo1J+dkthmAbJY1u8ylDW6V/ofpvCIkZwWagbDhqrb2lt0Mc/JaL/+5HtM3boMRXGcleTDFWZQ==

    2、使用加解密方法

      1 package com.mao.common.util;
      2 
      3 import java.security.KeyFactory;
      4 import java.security.PrivateKey;
      5 import java.security.PublicKey;
      6 import java.security.spec.PKCS8EncodedKeySpec;
      7 import java.security.spec.X509EncodedKeySpec;
      8 
      9 import javax.crypto.Cipher;
     10 
     11 import org.apache.tomcat.util.codec.binary.Base64;
     12 
     13 /**
     14  * 
     15  * 描述:安全工具类
     16  * @author mao2080@sina.com
     17  * @created 2017年4月20日 下午8:32:42
     18  * @since
     19  */
     20 public final class SecurityUtil {
     21     
     22     private static final String ALGORITHM_RSA = "RSA";
     23     
     24     /**RSA-charset*/
     25     private static final String RSA_CHARSET = "UTF-8";
     26     
     27     /**
     28      * 
     29      * 描述:将字符串通过RSA算法公钥加密
     30      * @author mao2080@sina.com
     31      * @created 2017年4月9日 上午09:18:51
     32      * @since 
     33      * @param content 需要加密的内容
     34      * @param pubKey 公钥
     35      * @return 加密后字符串
     36      * @throws Exception
     37      */
     38     private static String EncryptByRSAPubKey(String content, String pubKey) throws Exception {
     39         try {
     40             PublicKey publicKey = SecurityUtil.getRSAPubKey(pubKey);
     41             Cipher cipher = Cipher.getInstance(publicKey.getAlgorithm());
     42             cipher.init(Cipher.ENCRYPT_MODE, publicKey);
     43             cipher.update(content.getBytes(SecurityUtil.RSA_CHARSET));
     44             return SecurityUtil.encodeBase64(cipher.doFinal());
     45         } catch (Exception e) {
     46             e.printStackTrace();
     47             throw new Exception();
     48         }
     49     }
     50  
     51     /**
     52      * 
     53      * 描述:将字符串通过RSA算法公钥解密
     54      * @author mao2080@sina.com
     55      * @created 2017年4月9日 上午09:18:51
     56      * @since 
     57      * @param content 需要解密的内容
     58      * @param pubKey 公钥
     59      * @return 解密后字符串
     60      * @throws Exception
     61      */
     62     private static String DecryptByRSAPubKey(String content, String pubKey) throws Exception {
     63         try {
     64             PublicKey publicKey = SecurityUtil.getRSAPubKey(pubKey);
     65             Cipher cipher = Cipher.getInstance(publicKey.getAlgorithm());
     66             cipher.init(Cipher.DECRYPT_MODE, publicKey);
     67             cipher.update(SecurityUtil.decodeBase64(content));
     68             return new String(cipher.doFinal(), RSA_CHARSET);
     69         } catch (Exception e) {
     70             e.printStackTrace();
     71             throw new Exception();
     72         }
     73     }
     74     
     75     /**
     76      * 
     77      * 描述:将字符串通过RSA算法私钥加密
     78      * @author mao2080@sina.com
     79      * @created 2017年4月9日 上午09:18:51
     80      * @since 
     81      * @param content 需要加密的内容
     82      * @param priKey 私钥
     83      * @return 加密后字符串
     84      * @throws Exception
     85      */
     86     public static String EncryptByRSAPriKey(String content, String priKey) throws Exception {
     87         try {
     88             PrivateKey privateKey = SecurityUtil.getRSAPriKey(priKey);
     89             Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm());
     90             cipher.init(Cipher.ENCRYPT_MODE, privateKey);
     91             cipher.update(content.getBytes(SecurityUtil.RSA_CHARSET));
     92             return SecurityUtil.encodeBase64(cipher.doFinal());
     93         } catch (Exception e) {
     94             e.printStackTrace();
     95             throw new Exception();
     96         }
     97     }
     98  
     99     /**
    100      * 
    101      * 描述:将字符串通过RSA算法私钥解密
    102      * @author mao2080@sina.com
    103      * @created 2017年4月9日 上午09:18:51
    104      * @since 
    105      * @param content 需要解密的内容
    106      * @param priKey 私钥
    107      * @return 解密后字符串
    108      * @throws Exception
    109      */
    110     public static String DecryptByRSAPriKey(String content, String priKey) throws Exception {
    111         try {
    112             PrivateKey privateKey = SecurityUtil.getRSAPriKey(priKey);
    113             Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm());
    114             cipher.init(Cipher.DECRYPT_MODE, privateKey);
    115             cipher.update(SecurityUtil.decodeBase64(content));
    116             return new String(cipher.doFinal(), SecurityUtil.RSA_CHARSET);
    117         } catch (Exception e) {
    118             e.printStackTrace();
    119             throw new Exception();
    120         }
    121     }
    122     
    123     /**
    124      * 
    125      * 描述:获取RSA公钥
    126      * @author mao2080@sina.com
    127      * @created 2017年4月9日 上午09:18:51
    128      * @since 
    129      * @param priKey 私钥
    130      * @return PublicKey
    131      * @throws Exception
    132      */
    133     private static PublicKey getRSAPubKey(String pubKey) throws Exception {
    134         try {
    135             X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(SecurityUtil.decodeBase64(pubKey));
    136             KeyFactory keyFactory = KeyFactory.getInstance(SecurityUtil.ALGORITHM_RSA);
    137             return keyFactory.generatePublic(publicKeySpec);
    138         } catch (Exception e) {
    139             e.printStackTrace();
    140             throw new Exception();
    141         }
    142     }
    143 
    144     /**
    145      * 
    146      * 描述:获取RSA私钥
    147      * @author mao2080@sina.com
    148      * @created 2017年4月9日 上午09:18:51
    149      * @since 
    150      * @param priKey 私钥
    151      * @return PrivateKey
    152      * @throws Exception
    153      */
    154     private static PrivateKey getRSAPriKey(String priKey) throws Exception {
    155         try {
    156             PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(SecurityUtil.decodeBase64(priKey));
    157             KeyFactory keyFactory = KeyFactory.getInstance(SecurityUtil.ALGORITHM_RSA);
    158             return keyFactory.generatePrivate(privateKeySpec);
    159         } catch (Exception e) {
    160             e.printStackTrace();
    161             throw new Exception();
    162         }
    163     }
    164     
    165     /**
    166      * base64编码
    167      * @param source
    168      * @return
    169      * @throws Exception
    170      */
    171     public static String encodeBase64(byte[] source) throws Exception {
    172         return new String(Base64.encodeBase64(source), "UTF-8");
    173     }
    174 
    175     /**
    176      * Base64解码
    177      * @param target
    178      * @return
    179      * @throws Exception
    180      */
    181     public static byte[] decodeBase64(String target) throws Exception {
    182         return Base64.decodeBase64(target.getBytes("UTF-8"));
    183     }
    184     
    185     public static void main(String[] args) throws Exception {
    186         String pubKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHj1kf4EV0zCVdleIq/3pSm+tV0xuDGaXDzDyjVhDmrSptFv3MkBRY73qxbs/ZHGsVAwsY1kvh5qrFLdUesGMw92PgWwSXrNfBxYBLECweG0iIe8vTtvo824KdrJK3/1jPSXMJ0jYRaWXGr0qtEv5ak81kF/pDMiDG86wLKnq1jQIDAQAB";
    187         String priKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAMePWR/gRXTMJV2V4ir/elKb61XTG4MZpcPMPKNWEOatKm0W/cyQFFjverFuz9kcaxUDCxjWS+HmqsUt1R6wYzD3Y+BbBJes18HFgEsQLB4bSIh7y9O2+jzbgp2skrf/WM9JcwnSNhFpZcavSq0S/lqTzWQX+kMyIMbzrAsqerWNAgMBAAECgYAo33xiof232WRB0cQcCG2WY+cEkhONe4BPJRK6ZZNam9cXtuDOuCfiu1IG62pYzpBEInZwZNvv7d3GOwfunDQEY1Zt6TC6D8E59aRGE+2HofVwA47X3ulXz8EsV9ZXYd/Eq/P0tpDci6DtWC/Gh0UZSgcUhwM6DXwa9ctMo3VxoQJBAPvHQ0SbapSOxqALc9WNrG/dq2wvQaecCnuVqhrl7ZuIeGronQMvsxFHMBp2OPcK/64jESZ9LoAoPnwlYuIs33kCQQDK5/E4YnBjzb6w//l1e1dhIbRwMZHkn8VNMorYjTQemX9m7gsJeAPSBF11lo1XGWR84M0nPMnrnyeG8zl68B21AkEA81Cf+19OYn6QCP7IVGpzaDAKh6QriLTNlJ0QJKprM1FxPa/KfNfN7zaikBAMAQIKENkmq9Fx7Lv3lrXyl6zR0QJAeSLb+kOawZrVm6pWbfMDCbQrm0ecyBcynZHtHre+Q/5z9ylqYW7LKRj+CvOk0jkQqxUypZg/HHJaENEooeK0eQJAVckJuNXO+XQsMo1J+dkthmAbJY1u8ylDW6V/ofpvCIkZwWagbDhqrb2lt0Mc/JaL/+5HtM3boMRXGcleTDFWZQ==";
    188         String content = "12345678";
    189         String s = EncryptByRSAPubKey(content, pubKey);
    190         System.out.println("公钥加密后:"+s);
    191         System.out.println("私钥解密后:"+DecryptByRSAPriKey(s, priKey));
    192         content = "12345678";
    193         s = EncryptByRSAPriKey(content, priKey);
    194         System.out.println("私钥加密后:"+s);
    195         System.out.println("公钥解密后:"+DecryptByRSAPubKey(s, pubKey));
    196     }
    197 
    198 }

    运行结果:

    公钥加密后:hTsS0vrBpaQgp+T1dyoTQ8jJKt6qAmE5Np3URgYjRuA0vrib9fElFz8BFX5NHOlcmDMZKuudulfehQ3P43DNA0k9dAMStIuofQIA70fY5GQxNjLTu0S7/J510wYPAtopMDqO9eriVg39R3KzJUPwgMKQGELBCOWstK9nO1F6z0w=
    私钥解密后:12345678
    私钥加密后:xaKKEf6eC80Zh3MbrQA13hbpIv57IFvW2N1oMshojZYqGNTbGQvyZcHOkVzAsVlZJDyexDKdD82kP8lfZ/729BC/7EGwtXlND8w68pfOsSDYtknRLrXpflNU7C+EqzUQBUsruj+tUc7m050eZmJw7u6DF3lIIviIICWV/O1OiDw=
    公钥解密后:12345678

    3、本文demo下载

  • 相关阅读:
    【转发】【小程序】微信小程序日常开发中常遇到的错误代码
    正则表达式:看懂正则表达式只需要几个实例就够了
    CSS响应式:根据分辨率加载不同CSS的几个方法,亲测可用
    [微信小程序] 微信小程序获取用户定位信息并加载对应城市信息,wx.getLocation,腾讯地图小程序api,微信小程序经纬度逆解析地理信息
    [NodeJs] 用Nodejs+Express搭建web,nodejs路由和Ajax传数据并返回状态,nodejs+mysql通过ajax获取数据并写入数据库
    [微信小程序] 微信小程序富文本-wxParse的使用
    [AngularJS] “多重路由”嵌套模块——AngularJS“路由”嵌套学习资料教程
    [AngularJS] “路由”的定义概念、使用详解——AngularJS学习资料教程
    学习笔记:JavaScript-进阶篇
    学习笔记:JavaScript-入门篇
  • 原文地址:https://www.cnblogs.com/mao2080/p/6740720.html
Copyright © 2011-2022 走看看