RSA加密例子和中途遇到的问题

时间:2023-02-05 17:14:29

在进行RSA加密例子

  1. package test;
  2. import java.io.IOException;
  3. import java.security.Key;
  4. import java.security.KeyFactory;
  5. import java.security.KeyPair;
  6. import java.security.KeyPairGenerator;
  7. import java.security.PrivateKey;
  8. import java.security.PublicKey;
  9. import java.security.Signature;
  10. import java.security.interfaces.RSAPrivateKey;
  11. import java.security.interfaces.RSAPublicKey;
  12. import java.security.spec.PKCS8EncodedKeySpec;
  13. import java.security.spec.X509EncodedKeySpec;
  14. import sun.misc.BASE64Decoder;
  15. import sun.misc.BASE64Encoder;
  16. import java.util.HashMap;
  17. import java.util.Map;
  18. import javax.crypto.Cipher;
  19. public abstract class RSACoder {
  20. public static final String KEY_ALGORITHM = "RSA";
  21. public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
  22. private static final String PUBLIC_KEY = "RSAPublicKey";
  23. private static final String PRIVATE_KEY = "RSAPrivateKey";
  24. public static byte[] decryptBASE64(String privateKey){
  25. byte[] output = null;
  26. try {
  27. output = (new BASE64Decoder()).decodeBuffer(privateKey);
  28. return  output;
  29. } catch (IOException e) {
  30. e.printStackTrace();
  31. }
  32. return output;
  33. }
  34. public static String encryptBASE64( byte[] keyBytes){
  35. String s = (new BASE64Encoder()).encode(keyBytes);
  36. return s;
  37. }
  38. /**
  39. * 用私钥对信息生成数字签名
  40. *
  41. * @param data
  42. *            加密数据
  43. * @param privateKey
  44. *            私钥
  45. *
  46. * @return
  47. * @throws Exception
  48. */
  49. public static String sign(byte[] data, String privateKey) throws Exception {
  50. // 解密由base64编码的私钥
  51. byte[] keyBytes = decryptBASE64(privateKey);
  52. // 构造PKCS8EncodedKeySpec对象
  53. PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
  54. // KEY_ALGORITHM 指定的加密算法
  55. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  56. // 取私钥匙对象
  57. PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);
  58. // 用私钥对信息生成数字签名
  59. Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
  60. signature.initSign(priKey);
  61. signature.update(data);
  62. return encryptBASE64(signature.sign());
  63. }
  64. /**
  65. * 校验数字签名
  66. *
  67. * @param data
  68. *            加密数据
  69. * @param publicKey
  70. *            公钥
  71. * @param sign
  72. *            数字签名
  73. *
  74. * @return 校验成功返回true 失败返回false
  75. * @throws Exception
  76. *
  77. */
  78. public static boolean verify(byte[] data, String publicKey, String sign)
  79. throws Exception {
  80. // 解密由base64编码的公钥
  81. byte[] keyBytes = decryptBASE64(publicKey);
  82. // 构造X509EncodedKeySpec对象
  83. X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
  84. // KEY_ALGORITHM 指定的加密算法
  85. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  86. // 取公钥匙对象
  87. PublicKey pubKey = keyFactory.generatePublic(keySpec);
  88. Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
  89. signature.initVerify(pubKey);
  90. signature.update(data);
  91. // 验证签名是否正常
  92. return signature.verify(decryptBASE64(sign));
  93. }
  94. /**
  95. * 解密<br>
  96. * 用私钥解密
  97. *
  98. * @param data
  99. * @param key
  100. * @return
  101. * @throws Exception
  102. */
  103. public static byte[] decryptByPrivateKey(byte[] data, String key)
  104. throws Exception {
  105. // 对密钥解密
  106. byte[] keyBytes = decryptBASE64(key);
  107. // 取得私钥
  108. PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
  109. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  110. Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
  111. // 对数据解密
  112. Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
  113. cipher.init(Cipher.DECRYPT_MODE, privateKey);
  114. return cipher.doFinal(data);
  115. }
  116. /**
  117. * 解密<br>
  118. * 用公钥解密
  119. *
  120. * @param data
  121. * @param key
  122. * @return
  123. * @throws Exception
  124. */
  125. public static byte[] decryptByPublicKey(byte[] data, String key)
  126. throws Exception {
  127. // 对密钥解密
  128. byte[] keyBytes = decryptBASE64(key);
  129. // 取得公钥
  130. X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
  131. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  132. Key publicKey = keyFactory.generatePublic(x509KeySpec);
  133. // 对数据解密
  134. Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
  135. cipher.init(Cipher.DECRYPT_MODE, publicKey);
  136. return cipher.doFinal(data);
  137. }
  138. /**
  139. * 加密<br>
  140. * 用公钥加密
  141. *
  142. * @param data
  143. * @param key
  144. * @return
  145. * @throws Exception
  146. */
  147. public static byte[] encryptByPublicKey(byte[] data, String key)
  148. throws Exception {
  149. // 对公钥解密
  150. byte[] keyBytes = decryptBASE64(key);
  151. // 取得公钥
  152. X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
  153. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  154. Key publicKey = keyFactory.generatePublic(x509KeySpec);
  155. // 对数据加密
  156. Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
  157. cipher.init(Cipher.ENCRYPT_MODE, publicKey);
  158. return cipher.doFinal(data);
  159. }
  160. /**
  161. * 加密<br>
  162. * 用私钥加密
  163. *
  164. * @param data
  165. * @param key
  166. * @return
  167. * @throws Exception
  168. */
  169. public static byte[] encryptByPrivateKey(byte[] data, String key)
  170. throws Exception {
  171. // 对密钥解密
  172. byte[] keyBytes = decryptBASE64(key);
  173. // 取得私钥
  174. PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
  175. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  176. Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
  177. // 对数据加密
  178. Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
  179. cipher.init(Cipher.ENCRYPT_MODE, privateKey);
  180. return cipher.doFinal(data);
  181. }
  182. /**
  183. * 取得私钥
  184. *
  185. * @param keyMap
  186. * @return
  187. * @throws Exception
  188. */
  189. public static String getPrivateKey(Map<String, Object> keyMap)
  190. throws Exception {
  191. Key key = (Key) keyMap.get(PRIVATE_KEY);
  192. return encryptBASE64(key.getEncoded());
  193. }
  194. /**
  195. * 取得公钥
  196. *
  197. * @param keyMap
  198. * @return
  199. * @throws Exception
  200. */
  201. public static String getPublicKey(Map<String, Object> keyMap)
  202. throws Exception {
  203. Key key = (Key) keyMap.get(PUBLIC_KEY);
  204. return encryptBASE64(key.getEncoded());
  205. }
  206. /**
  207. * 初始化密钥
  208. *
  209. * @return
  210. * @throws Exception
  211. */
  212. public static Map<String, Object> initKey() throws Exception {
  213. KeyPairGenerator keyPairGen = KeyPairGenerator
  214. .getInstance(KEY_ALGORITHM);
  215. keyPairGen.initialize(1024);
  216. KeyPair keyPair = keyPairGen.generateKeyPair();
  217. // 公钥
  218. RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
  219. // 私钥
  220. RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
  221. Map<String, Object> keyMap = new HashMap<String, Object>(2);
  222. keyMap.put(PUBLIC_KEY, publicKey);
  223. keyMap.put(PRIVATE_KEY, privateKey);
  224. return keyMap;
  225. }
  226. }

测试类

  1. package test;
  2. import java.util.Map;
  3. import java.util.regex.Matcher;
  4. import java.util.regex.Pattern;
  5. import sun.misc.BASE64Decoder;
  6. import sun.misc.BASE64Encoder;
  7. public class RSACoderTest {
  8. package com;
  9. import java.util.Map;
  10. import sun.misc.BASE64Encoder;
  11. public class RSACoderTest {
  12. static String privateKey ;
  13. static String publicKey ;
  14. public static void getKey() throws Exception {
  15. Map<String, Object> keyMap = RSACoder.initKey();
  16. publicKey = RSACoder.getPublicKey(keyMap);
  17. privateKey = RSACoder.getPrivateKey(keyMap);
  18. //公钥生成
  19. System.out.println("public : "+publicKey);
  20. //私钥生成
  21. System.out.println("private : "+privateKey);
  22. }
  23. public static void main(String[] args) throws Exception {
  24. getKey() ;
  25. //      System.err.println("公钥加密——私钥解密");
  26. //将明文转换为字节数组
  27. byte[] data = "serricee1".getBytes();
  28. //用公钥加密
  29. byte[] encodedData = RSACoder.encryptByPublicKey(data, publicKey);
  30. //打印加密字符串 为什么使用BASE64Encoder 因为在RSACoder里加密用的是 BASE64Encoder 加密
  31. String s = (new BASE64Encoder()).encode(encodedData);
  32. System.err.println("加密: " +s);
  33. //                //用私钥解密
  34. byte[] decodedData = RSACoder.decryptByPrivateKey(RSACoder.decryptBASE64(s),privateKey);
  35. //
  36. //
  37. System.out.println( "解密后: " + new String(decodedData));
  38. }
  39. }

遇到的问题在

解密的时候 用new BASE64Encoder()).encode(keyBytes); 获得明文发现明文长度只能是4的倍数而且不支持特殊字符串和中文不然解密出来不是多出来 就是解密不对 后面解密

直接用.getBytes() 和new String(decodedData)不用Base64的就好了

RSA加密例子和中途遇到的问题的更多相关文章

  1. &OpenCurlyDoubleQuote;不给力啊,老湿!”:RSA加密与破解

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 加密和解密是自古就有技术了.经常看到侦探电影的桥段,勇敢又机智的主角,拿着一长串毫 ...

  2. iOS中RSA加密详解

    先贴出代码的地址,做个说明,因为RSA加密在iOS的代码比较少,网上开源的也很少,最多的才8个星星.使用过程中发现有错误.然后我做了修正,和另一个库进行了整合,然后将其支持CocoaPod. http ...

  3. iOS动态部署之RSA加密传输Patch补丁

    概要:这一篇博客主要说明下iOS客户端动态部署方案中,patch(补丁)是如何比较安全的加载到客户端中. 在整个过程中,需要使用RSA来加密(你可以选择其它的非对称加密算法),MD5来做校验(同样,你 ...

  4. 利用openssl进行RSA加密解密

    openssl是一个功能强大的工具包,它集成了众多密码算法及实用工具.我们即可以利用它提供的命令台工具生成密钥.证书来加密解密文件,也可以在利用其提供的API接口在代码中对传输信息进行加密. RSA是 ...

  5. javaWeb RSA加密使用

      加密算法在各个网站运用很平常,今天整理代码的时候看到了我们项目中运用了RSA加密,就了解了一下. 先简单说一下RSA加密算法原理,RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但 ...

  6. &ast;&ast;&ast;&ast;ural 1141&period; RSA Attack(RSA加密,扩展欧几里得算法)

    1141. RSA Attack Time limit: 1.0 secondMemory limit: 64 MB The RSA problem is the following: given a ...

  7. python rsa 加密解密 (编解码,base64编解码)

    最近有需求,需要研究一下RSA加密解密安全:在网上百度了一下例子文章,很少有文章介绍怎么保存.传输.打印加密后的文本信息,都是千篇一律的.直接在一个脚本,加密后的文本信息赋于变量,然后立马调用解密.仔 ...

  8. Python的RSA加密和PBE加密

    最近在写接口的时候,遇到了需要使用RSA加密和PBE加密的情况,对方公司提供的DEMO都是JAVA的,我需要用python来实现. 在网上搜了一下,python的RSA加密这块写的还是比较多的,但是P ...

  9. RSA加密、解密、签名、验签的原理及方法

    一.RSA加密简介 RSA加密是一种非对称加密.可以在不直接传递密钥的情况下,完成解密.这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险.是由一对密钥来进行加解密的过程,分别称为公钥和私 ...

随机推荐

  1. 自定义验证jquery&period;validate

    js中填写 $(function() { validateSysConfigForm(); jQuery.validator.addMethod("validateNum", fu ...

  2. spring源码学习之路---环境搭建(一)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 最近已经开始了spring源 ...

  3. chop函数

    chop() 函数从字符串的末端开始删除空白字符或其他预定义字符. chop(string,charlist) 参数 描述 string 必需.规定要转换的字符串. charlist 可选.规定从字符 ...

  4. crontab 每月最后一天

    0 8 28-31 * * [ `date -d tomorrow +%e` -eq 1 ] && do-something   我觉得能想到这种方法的,都是经验丰富的人.程序员们,想 ...

  5. 微信内移动前端开发抓包调试工具fiddler使用教程

    在朋友圈看到一款疯转的H5小游戏,想要copy,什么?只能在微信里打开?小样,图样图森破,限制了oauth.微信浏览器内打开,照样能看你源码~ 使用fiddler来抓包 需要先做一些简单的准备工作: ...

  6. C&plus;&plus;成员变量与函数内存分配

    关于结构体和C++类的内存地址问题 C++类是由结构体发展得来的,所以他们的成员变量(C语言的结构体只有成员变量)的内存分配机制是一样的.下面我们以类来说明问题,如果类的问题通了,结构体也也就没问题啦 ...

  7. PCA&comma; SVD以及代码示例

    本文是对PCA和SVD学习的整理笔记,为了避免很多重复内容的工作,我会在介绍概念的时候引用其他童鞋的工作和内容,具体来源我会标记在参考资料中. 一.PCA (Principle component a ...

  8. CSS布局-body高度不等于页面高度

    记录采坑: 博客记录问题,用作回忆用,不喜勿喷! html,body{width: 100%; height: 100%}这是初始定义的宽高.在布局越写越复杂的时候,布局很容易出现问题,例如一个页面中 ...

  9. SpringBoot&lpar;2&period;0&period;4&period;RELEASE&rpar;&plus;Elasticsearch&lpar;6&period;2&period;4&rpar;&plus;Gradle简单整合

    记录一下SpringBoot(2.0.4.RELEASE)+Elasticsearch(6.2.4)+Gradle整合的一个小例子. 1.在Gradle内加入相关jar包的依赖: compile('o ...

  10. Hibernate 不同数据库的连接及SQL方言

    <!--MySql 驱动程序 eg. mysql-connector-java-5.0.4-bin.jar-->  <property name="dialect&quot ...