网络请求的数据需要加密,服务器给的他们那一套在Android一直报错,自己写了一个;

  1. package com.cc.common.util;
  2. import javax.crypto.Cipher;
  3. import java.security.*;
  4. import java.security.spec.PKCS8EncodedKeySpec;
  5. import java.security.spec.X509EncodedKeySpec;
  6. import sun.misc.BASE64Decoder;
  7. import sun.misc.BASE64Encoder;
  8. /**
  9. * RSA加解密工具类
  10. */
  11. public class RSAUtils {
  12. //公钥加密
  13. public static String encrypt(String content, PublicKey publicKey) {
  14. try{
  15. Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");//java默认"RSA"="RSA/ECB/PKCS1Padding"
  16. cipher.init(Cipher.ENCRYPT_MODE, publicKey);
  17. byte[] output = cipher.doFinal(content.getBytes());
  18. BASE64Encoder encoder = new BASE64Encoder();
  19. return encoder.encode(output);
  20. }catch (Exception e){
  21. e.printStackTrace();
  22. }
  23. return null;
  24. }
  25. //公钥加密
  26. public static byte[] encrypt(byte[] content, PublicKey publicKey) {
  27. try{
  28. Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");//java默认"RSA"="RSA/ECB/PKCS1Padding"
  29. cipher.init(Cipher.ENCRYPT_MODE, publicKey);
  30. return cipher.doFinal(content);
  31. }catch (Exception e){
  32. e.printStackTrace();
  33. }
  34. return null;
  35. }
  36. //私钥解密
  37. public static byte[] decrypt(byte[] content, PrivateKey privateKey) {
  38. try {
  39. Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
  40. cipher.init(Cipher.DECRYPT_MODE, privateKey);
  41. return cipher.doFinal(content);
  42. } catch (Exception e){
  43. e.printStackTrace();
  44. return null;
  45. }
  46. }
  47. //私钥解密
  48. public static String decrypt(String content, PrivateKey privateKey) {
  49. try {
  50. Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
  51. cipher.init(Cipher.DECRYPT_MODE, privateKey);
  52. byte [] b = cipher.doFinal(content.getBytes());
  53. BASE64Encoder encoder = new BASE64Encoder();
  54. return encoder.encode(b);
  55. } catch (Exception e){
  56. e.printStackTrace();
  57. return null;
  58. }
  59. }
  60. /**
  61. * String转公钥PublicKey
  62. * @param key
  63. * @return
  64. * @throws Exception
  65. */
  66. public static PublicKey getPublicKey(String key) throws Exception {
  67. byte[] keyBytes;
  68. keyBytes = (new BASE64Decoder()).decodeBuffer(key);
  69. X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
  70. KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  71. PublicKey publicKey = keyFactory.generatePublic(keySpec);
  72. return publicKey;
  73. }
  74. /**
  75. * String转私钥PrivateKey
  76. * @param key
  77. * @return
  78. * @throws Exception
  79. */
  80. public static PrivateKey getPrivateKey(String key) throws Exception {
  81. byte[] keyBytes;
  82. keyBytes = (new BASE64Decoder()).decodeBuffer(key);
  83. PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
  84. KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  85. PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
  86. return privateKey;
  87. }
  88. }

如果你的 BASE64Decoder()一直报错,请添加Base64.jar;

链接: https://pan.baidu.com/s/1-pXV7xpFwqhv54DHGGbliw 密码: tcge

附:ResCoder

  1. public class RSACoder {
  2. private static final String KEY_ALGORITHM = "RSA";
  3. private static final String CIPHER_TYPE = "RSA/None/PKCS1Padding"; // Android端加密算法
  4. private static final String SIGNATURE_ALGORITHM = "MD5withRSA";
  5. private static final String PUBLIC_KEY = "RSAPublicKey";
  6. private static final String PRIVATE_KEY = "RSAPrivateKey";
  7. /**
  8. * RSA最大加密明文大小
  9. */
  10. private static final int MAX_ENCRYPT_BLOCK = 117;
  11. /**
  12. * RSA最大解密密文大小
  13. */
  14. private static final int MAX_DECRYPT_BLOCK = 128;
  15. public static byte[] decryptBASE64(String key) {
  16. return Base64.decode(key, Base64.NO_WRAP);
  17. // return Base64.getDecoder().decode(key);
  18. }
  19. public static String encryptBASE64(byte[] bytes) {
  20. return Base64.encodeToString(bytes, Base64.NO_WRAP);
  21. // return Base64.getEncoder().encodeToString(bytes);
  22. }
  23. /**
  24. * 用私钥对信息生成数字签名
  25. *
  26. * @param data 加密数据
  27. * @param privateKey 私钥
  28. * @return
  29. * @throws Exception
  30. */
  31. public static String sign(byte[] data, String privateKey) throws Exception {
  32. // 解密由base64编码的私钥
  33. byte[] keyBytes = decryptBASE64(privateKey);
  34. // 构造PKCS8EncodedKeySpec对象
  35. PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
  36. // KEY_ALGORITHM 指定的加密算法
  37. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  38. // 取私钥匙对象
  39. PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);
  40. // 用私钥对信息生成数字签名
  41. Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
  42. signature.initSign(priKey);
  43. signature.update(data);
  44. return encryptBASE64(signature.sign());
  45. }
  46. /**
  47. * 校验数字签名
  48. *
  49. * @param data 加密数据
  50. * @param publicKey 公钥
  51. * @param sign 数字签名
  52. * @return 校验成功返回true 失败返回false
  53. * @throws Exception
  54. */
  55. public static boolean verify(byte[] data, String publicKey, String sign) throws Exception {
  56. // 解密由base64编码的公钥
  57. byte[] keyBytes = decryptBASE64(publicKey);
  58. // 构造X509EncodedKeySpec对象
  59. X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
  60. // KEY_ALGORITHM 指定的加密算法
  61. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  62. // 取公钥匙对象
  63. PublicKey pubKey = keyFactory.generatePublic(keySpec);
  64. Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
  65. signature.initVerify(pubKey);
  66. signature.update(data);
  67. // 验证签名是否正常
  68. return signature.verify(decryptBASE64(sign));
  69. }
  70. /**
  71. * 私钥解密
  72. *
  73. * @param data
  74. * @param key
  75. * @return
  76. * @throws Exception
  77. */
  78. public static byte[] decryptByPrivateKey(byte[] data, String key) throws Exception {
  79. // 对密钥解密
  80. byte[] keyBytes = decryptBASE64(key);
  81. // 取得私钥
  82. PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
  83. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  84. Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
  85. // 对数据解密
  86. Cipher cipher = Cipher.getInstance(CIPHER_TYPE);
  87. cipher.init(Cipher.DECRYPT_MODE, privateKey);
  88. int inputLen = data.length;
  89. ByteArrayOutputStream out = new ByteArrayOutputStream();
  90. int offSet = 0;
  91. byte[] cache;
  92. int i = 0;
  93. // 对数据分段解密
  94. while (inputLen - offSet > 0) {
  95. if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
  96. cache = cipher.doFinal(data, offSet, MAX_DECRYPT_BLOCK);
  97. } else {
  98. cache = cipher.doFinal(data, offSet, inputLen - offSet);
  99. }
  100. out.write(cache, 0, cache.length);
  101. i++;
  102. offSet = i * MAX_DECRYPT_BLOCK;
  103. }
  104. byte[] decryptedData = out.toByteArray();
  105. out.close();
  106. return decryptedData;
  107. }
  108. /**
  109. * 解密<br>
  110. * 用私钥解密
  111. *
  112. * @param data
  113. * @param key
  114. * @return
  115. * @throws Exception
  116. */
  117. public static byte[] decryptByPrivateKey(String data, String key) throws Exception {
  118. return decryptByPrivateKey(decryptBASE64(data), key);
  119. }
  120. /**
  121. * 解密<br>
  122. * 用公钥解密
  123. *
  124. * @param data
  125. * @param key
  126. * @return
  127. * @throws Exception
  128. */
  129. public static byte[] decryptByPublicKey(byte[] data, String key) throws Exception {
  130. // 对密钥解密
  131. byte[] keyBytes = decryptBASE64(key);
  132. // 取得公钥
  133. X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
  134. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  135. Key publicKey = keyFactory.generatePublic(x509KeySpec);
  136. // 对数据解密
  137. Cipher cipher = Cipher.getInstance(CIPHER_TYPE);
  138. cipher.init(Cipher.DECRYPT_MODE, publicKey);
  139. int inputLen = data.length;
  140. ByteArrayOutputStream out = new ByteArrayOutputStream();
  141. int offSet = 0;
  142. byte[] cache;
  143. int i = 0;
  144. // 对数据分段解密
  145. while (inputLen - offSet > 0) {
  146. if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
  147. cache = cipher.doFinal(data, offSet, MAX_DECRYPT_BLOCK);
  148. } else {
  149. cache = cipher.doFinal(data, offSet, inputLen - offSet);
  150. }
  151. out.write(cache, 0, cache.length);
  152. i++;
  153. offSet = i * MAX_DECRYPT_BLOCK;
  154. }
  155. byte[] decryptedData = out.toByteArray();
  156. out.close();
  157. return decryptedData;
  158. }
  159. /**
  160. * 加密<br>
  161. * 用公钥加密
  162. *
  163. * @param data
  164. * @param key
  165. * @return
  166. * @throws Exception
  167. */
  168. public static byte[] encryptByPublicKey(String data, String key) throws Exception {
  169. // 对公钥解密
  170. byte[] keyBytes = decryptBASE64(key);
  171. // 取得公钥
  172. X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
  173. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  174. Key publicKey = keyFactory.generatePublic(x509KeySpec);
  175. // 对数据加密(分段)
  176. Cipher cipher = Cipher.getInstance(CIPHER_TYPE);
  177. cipher.init(Cipher.ENCRYPT_MODE, publicKey);
  178. byte[] dataByteArray = data.getBytes();
  179. int inputLen = dataByteArray.length;
  180. ByteArrayOutputStream out = new ByteArrayOutputStream();
  181. int offSet = 0;
  182. byte[] cache;
  183. int i = 0;
  184. // 对数据分段加密
  185. while (inputLen - offSet > 0) {
  186. if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
  187. cache = cipher.doFinal(dataByteArray, offSet, MAX_ENCRYPT_BLOCK);
  188. } else {
  189. cache = cipher.doFinal(dataByteArray, offSet, inputLen - offSet);
  190. }
  191. out.write(cache, 0, cache.length);
  192. i++;
  193. offSet = i * MAX_ENCRYPT_BLOCK;
  194. }
  195. byte[] encryptedData = out.toByteArray();
  196. out.close();
  197. return encryptedData;
  198. }
  199. /**
  200. * 加密<br>
  201. * 用私钥加密
  202. *
  203. * @param data
  204. * @param key
  205. * @return
  206. * @throws Exception
  207. */
  208. public static byte[] encryptByPrivateKey(byte[] data, String key) throws Exception {
  209. // 对密钥解密
  210. byte[] keyBytes = decryptBASE64(key);
  211. // 取得私钥
  212. PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
  213. KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
  214. Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
  215. // 对数据加密
  216. Cipher cipher = Cipher.getInstance(CIPHER_TYPE);
  217. cipher.init(Cipher.ENCRYPT_MODE, privateKey);
  218. int inputLen = data.length;
  219. ByteArrayOutputStream out = new ByteArrayOutputStream();
  220. int offSet = 0;
  221. byte[] cache;
  222. int i = 0;
  223. // 对数据分段加密
  224. while (inputLen - offSet > 0) {
  225. if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
  226. cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
  227. } else {
  228. cache = cipher.doFinal(data, offSet, inputLen - offSet);
  229. }
  230. out.write(cache, 0, cache.length);
  231. i++;
  232. offSet = i * MAX_ENCRYPT_BLOCK;
  233. }
  234. byte[] encryptedData = out.toByteArray();
  235. out.close();
  236. return encryptedData;
  237. }
  238. /**
  239. * 取得私钥
  240. *
  241. * @param keyMap
  242. * @return
  243. * @throws Exception
  244. */
  245. public static String getPrivateKey(Map<String, Key> keyMap) {
  246. Key key = keyMap.get(PRIVATE_KEY);
  247. return encryptBASE64(key.getEncoded());
  248. }
  249. /**
  250. * 取得公钥
  251. *
  252. * @param keyMap
  253. * @return
  254. * @throws Exception
  255. */
  256. public static String getPublicKey(Map<String, Key> keyMap) {
  257. Key key = keyMap.get(PUBLIC_KEY);
  258. return encryptBASE64(key.getEncoded());
  259. }
  260. /**
  261. * 初始化密钥
  262. *
  263. * @return
  264. * @throws Exception
  265. */
  266. public static Map<String, Key> initKey() throws NoSuchAlgorithmException {
  267. KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
  268. keyPairGen.initialize(1024);
  269. KeyPair keyPair = keyPairGen.generateKeyPair();
  270. Map<String, Key> keyMap = new HashMap<>(2);
  271. keyMap.put(PUBLIC_KEY, keyPair.getPublic());// 公钥
  272. keyMap.put(PRIVATE_KEY, keyPair.getPrivate());// 私钥
  273. return keyMap;
  274. }
  275. }

RSA加密解密,String转PublicKey、PrivateKey;附Base64.JAR的更多相关文章

  1. 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输

    Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...

  2. iOS使用Security.framework进行RSA 加密解密签名和验证签名

    iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...

  3. C# 与JAVA 的RSA 加密解密交互,互通,C#使用BouncyCastle来实现私钥加密,公钥解密的方法

    因为C#的RSA加密解密只有公钥加密,私钥解密,没有私钥加密,公钥解密.在网上查了很久也没有很好的实现.BouncyCastle的文档少之又少.很多人可能会说,C#也是可以的,通过Biginteger ...

  4. C# Java间进行RSA加密解密交互

    原文:C# Java间进行RSA加密解密交互 这里,讲一下RSA算法加解密在C#和Java之间交互的问题,这两天纠结了很久,也看了很多其他人写的文章,颇受裨益,但没能解决我的实际问题,终于,还是被我捣 ...

  5. C# Java间进行RSA加密解密交互(二)

    原文:C# Java间进行RSA加密解密交互(二) 接着前面一篇文章C# Java间进行RSA加密解密交互,继续探讨这个问题. 在前面,虽然已经实现了C# Java间进行RSA加密解密交互,但是还是与 ...

  6. C# Java间进行RSA加密解密交互(三)

    原文:C# Java间进行RSA加密解密交互(三) 接着前面一篇C# Java间进行RSA加密解密交互(二)说吧,在上篇中为了实现 /** * RSA加密 * @param text--待加密的明文 ...

  7. C# RSA加密/解密

    RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的.RSA取名来自开发他们三者的名字.RSA是目前最有影响力的公钥加密算法, ...

  8. RSA加密解密及数字签名Java实现--转

    RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院 ...

  9. RSA加密解密和读取公钥、私钥

    /// <summary>     /// RSA加密解密及RSA签名和验证    /// </summary>     public class RSADE    {    ...

  10. RSA加密解密及RSA加签验签

    RSA安全性应用场景说明 在刚接触RSA的时候,会混淆RSA加密解密和RSA加签验签的概念.简单来说加密解密是公钥加密私钥解密,持有公钥(多人持有)可以对数据加密,但是只有持有私钥(一人持有)才可以解 ...

随机推荐

  1. AIX系统日志

    1.系统错误日志 存放路径:/var/adm/ras/errlog 说明:该日志记录了系统所检测到的软硬件故障和错误,尤其对系统的硬件故障有很大的参考价值,是AIX提供的最有价值的日志之一, errl ...

  2. JMeterPlugins插件监听器学习-监听器

    JMeterPlugins插件监听器学习-监听器 1.jp@gc - Actiive Threads Over Time:不同时间活动用户数量展示(图表)2.jp@gc - AutoStop List ...

  3. JQuery 树状结构 jQuery-treeview.js 插件

    由简入繁实现Jquery树状结构 在项目中,我们经常会需要一些树状结构的样式来显示层级结构等,比如下图的样式,之前在学.net的时候可以直接拖个服务端控件过来直接使用非常方便.但是利用Jquery的一 ...

  4. c# 一些细节

    1.动态对象和匿名对象偶然看到一个语法,觉得特别方便然后频繁使用,但是没有深究,直到今天忽然发现我潜意思中对它的认知居然是错误的. var data=new { State=1,Message=&qu ...

  5. piwik优化之定时任务生成统计数据

    piwik的ui界面,使用起来是无比的慢,让苏南大叔不得不对比wordpress的使用体验.当然了,如果你的服务器足够强大,这些都是小事儿.官方对此给出了一系列的优化建议,大家可以读一下:https: ...

  6. 关于AXI_Quad_SPI的寄存器配置

    关于AXI_Quad_SPI的寄存器配置 1.核初始化配置 首先是: 40:0000_000A 1C:8000_0000 28:0000_0004 2.命令与dummy_data 60:000001E ...

  7. Delphi实现菜单项上出现提示

    type TMenuHintWindow = class(THintWindow) private FTimerShow: TTimer; FTimerHide: TTimer; procedure ...

  8. ubuntu 阿里云 常出问题 运维工作日志

    一.2015-8.26(数据库 error—28) tmp文件临时数据写入不了----解决办法 1.查看临时文件 ls -l 找到了 2.由此可以查看得出来tmp文件有的权限是有的 3.查看tmp 存 ...

  9. ThinkPHP 3.1.2 视图 MVC-V -5

    一.模板的使用        (重点) a.规则 模板文件夹下[TPL]/[分组文件夹/][模板主题文件夹/]和模块名同名的文件夹[Index]/和方法名同名的文件[index].html(.tpl) ...

  10. Java第01次实验提纲(基本概念+编程环境入门+PTA)

    0. 控制台下编译.运行 在Notepad++编写Java程序 学会使用控制台,javac.java 学会使用Notepad++ 参考资料: 控制台-cmd应用基础 扫盲教程 使用命令行编译并运行ja ...