特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过。如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处: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("生成的公钥:\r\n" + publicKey);
  29. RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
  30. keyBs = rsaPrivateKey.getEncoded();
  31. String privateKey = encodeBase64(keyBs);
  32. System.out.println("生成的私钥:\r\n" + 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. }

运行结果:

  1. 生成的公钥:
  2. MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHj1kf4EV0zCVdleIq/3pSm+tV0xuDGaXDzDyjVhDmrSptFv3MkBRY73qxbs/ZHGsVAwsY1kvh5qrFLdUesGMw92PgWwSXrNfBxYBLECweG0iIe8vTtvo824KdrJK3/1jPSXMJ0jYRaWXGr0qtEv5ak81kF/pDMiDG86wLKnq1jQIDAQAB
  3. 生成的私钥:
  4. 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. }

运行结果:

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

3、本文demo下载

数据加密之RSA的更多相关文章

  1. Android数据加密之Rsa加密

    前言: 最近无意中和同事交流数据安全传输的问题,想起自己曾经使用过的Rsa非对称加密算法,闲下来总结一下. 其他几种加密方式: Android数据加密之Rsa加密 Android数据加密之Aes加密 ...

  2. 前后端数据加密传输 RSA非对称加密

    任务需求:要求登陆时将密码加密之后再进行传输到后端. 经过半天查询摸索折腾,于是有了如下成果: 加密方式:RSA非对称加密.实现方式:公钥加密,私钥解密.研究进度:javascript与java端皆已 ...

  3. Android数据加密之异或加密算法

    前言: 这几天被公司临时拉到去做Android IM即时通信协议实现,大致看了下他们定的协议,由于之前没有参与,据说因服务器性能限制,只达成非明文传递,具体原因我不太清楚,不过这里用的加密方式是采用异 ...

  4. Android数据加密之SHA安全散列算法

    前言: 对于SHA安全散列算法,以前没怎么使用过,仅仅是停留在听说过的阶段,今天在看图片缓存框架Glide源码时发现其缓存的Key采用的不是MD5加密算法,而是SHA-256加密算法,这才勾起了我的好 ...

  5. Android数据加密之Base64编码算法

    前言: 前面学习总结了平时开发中遇见的各种数据加密方式,最终都会对加密后的二进制数据进行Base64编码,起到一种二次加密的效果,其实呢Base64从严格意义上来说的话不是一种加密算法,而是一种编码算 ...

  6. Android数据加密之MD5加密

    前言: 项目中无论是密码的存储或者说判断文件是否是同一文件,都会用到MD5算法,今天来总结一下MD5加密算法. 什么是MD5加密? MD5英文全称“Message-Digest Algorithm 5 ...

  7. 4、DES和RSA简介

    DES是分组加密算法,速度快,使用单一密钥,加密解密都使用同一个密钥,一般用于大量数据加密,目前处于半淘汰状态. RSA算法是流式加密算法,速度慢,但是使用成对的密钥,加密解密使用不同的密钥,有利于保 ...

  8. Android数据加密之Aes加密

    前言: 项目中除了登陆,支付等接口采用rsa非对称加密,之外的采用aes对称加密,今天我们来认识一下aes加密. 其他几种加密方式: Android数据加密之Rsa加密 Android数据加密之Aes ...

  9. Android数据加密之Des加密

    前言: 端午节前有个同事咨询我有关Android DES加密的相关实现,简单的实现了一下,今天来总结一下. 其他几种加密方式: Android数据加密之Rsa加密 Android数据加密之Aes加密 ...

随机推荐

  1. Java后端技术面试汇总(第一套)

    面试汇总,整理一波,doc文档可点击[此处下载] 1.基础篇 1.1.Java基础 • 面向对象的特征:继承.封装和多态• final, finally, finalize 的区别• Exceptio ...

  2. JS基础_强制类型转换-Boolean

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. JS基础_基本语法

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. JS基础_js编写位置

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. spring cloud 入门

    某种程度上 软硬件 殊途同归了 (软件模仿硬件 总线设计, 资源定位 (寻址) ) spring 是什么 EDA ( Event-driven architecture ) (SOA , SOAP , ...

  6. nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'enterpriseId' in 'class java.lang.String'

    错误信息: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for p ...

  7. php连接阿里云mysql

    1.开启Mysql远程访问端口 现在服务器控制台,安全组那边开启3306端口 2.修改Mysql配置文件 vim /etc/mysql/mysql.conf.d/mysqld.cnf,找到bind-a ...

  8. 15、Nginx动静分离实战

    1.Nginx动静分离基本概述 动静分离, 通过中间件将动静分离和静态请求进行分离. 那为什么要通过中间件将动态请求和静态请求进行分离? 减少不必要的请求消耗, 同时能减少请求的延时. 通过中间件将动 ...

  9. centos 7 安装 Oracle 12c

    #!/bin/bash #!/usr/bin/expect -f #/etc/sysctl.conf --bash-srcipts-- echo 'net.ipv6.conf.all.disable_ ...

  10. npm install 报错,提示`gyp ERR! stack Error: EACCES: permission denied` 解决方法

    m install 报错,提示gyp ERR! stack Error: EACCES: permission denied 猜测可能是因为没有权限读写,ls -la看下文件权限设置情况 [root@ ...