在进行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. “不给力啊,老湿!”: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. ****ural 1141. 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. UIScrollView的封装

    UIScrollView的封装 效果 特点 1.用法简单,尺寸大小,随意设置位置 2.可以有多个数据源的数据,可以定制不通的界面(如同上图,一个有文字,一个没有文字) 3.能够实现点击事件 用法 1. ...

  2. 【代码笔记】iOS-自定义导航条颜色

    一,效果图. 二,工程图. 三,代码. AppDelegate.m - (BOOL)application:(UIApplication *)application didFinishLaunchin ...

  3. PHP对象在内存堆栈中的分配

    对象在PHP里面和整型.浮点型一样,也是一种数据类,都是存储不同类型数据用的, 在运行的时候都要加载到内存中去用,那么对象在内存里面是怎么体现的呢?内存从逻辑上说大体上是分为4段,栈空间段.堆空间段. ...

  4. js动态获取子复选项并设计全选及提交

    在做项目的时候,会遇到根据父选项,动态的获取子选项,并列出多个复选框,提交时,把选中的合并成一个字符提交后台 本章将讲述如何通过js控制实现该操作: 1:设计父类别为radio,为每一个radio都加 ...

  5. 一键准备Oracle安装

    在Linux下安装Oracle软件之前,有相当工作需要准备,包括建立用户.配置内核参数.配置资源限制参数.配置Oracle用户环境等,十分繁琐.即便十分熟悉,也需要花费一定的精力来准备.说白了,做这些 ...

  6. java.lang.UnsatisfiedLinkError: %1 不是有效的 Win32 应用程序。

    JNA 调用 dll 库时,保错: ///////////////// 通过 JNA 引入 DLL 库 //////////// /** * ID_FprCap.dll 负责指纹的采集, 指纹仪的初始 ...

  7. Python学习笔记3-字符串

    格式化字符串/复合字段名 >>> import humansize >>> si_suffixes = humansize.SUFFIXES[1000] >& ...

  8. db2学习笔记--数据类型对表的影响

    创建表的时为列选择合适的数据类型,可以提高数据库性能. 1.选择合适的数据类型,避免出现数据类型转换.例如日期,有人使用字符串来存放日期.时间戳,最后我们还要在程序中使用to_date做数据类型转换, ...

  9. CANopen学习——同步

    在发送和接收之间必须相互协调和同步,为此,CANopen引入同步的概念. 同步报文:包含一个数据字节或者不含数据字节的CAN报文.数据字节中包含一个从1开始递增计数的同步计数器.溢出值可在参数(索引1 ...

  10. LeetCode题解-----Wildcard Matching

    题目描述: '?' Matches any single character. '*' Matches any sequence of characters (including the empty ...