轻源码

  • QingYuanMa.com
  • 全球最大的互联网技术和资源下载平台
搜索
一起源码网 门户 终极进阶 查看主题

java微信小程序解密AES/CBC/PKCS7Padding

发布者: 天花乱坠 | 发布时间: 2018-4-17 13:42| 查看数: 5285| 评论数: 1|帖子模式

微信小程序解密 
建议使用1.6及以上的环境 
使用maven下载jar包

  1. <!-- -->
  2. <dependency>
  3. <groupId>org.bouncycastle</groupId>
  4. <artifactId>bcprov-jdk15on</artifactId>
  5. <version>1.55</version>
  6. </dependency>

加密类代码

  1. import org.bouncycastle.jce.provider.BouncyCastleProvider;
  2. import org.bouncycastle.util.Arrays;
  3. import javax.crypto.Cipher;
  4. import javax.crypto.NoSuchPaddingException;
  5. import javax.crypto.spec.IvParameterSpec;
  6. import javax.crypto.spec.SecretKeySpec;
  7. import java.security.Key;
  8. import java.security.NoSuchAlgorithmException;
  9. import java.security.NoSuchProviderException;
  10. import java.security.Security;
  11. /**
  12. * Created by wind on 2016/12/24.
  13. */
  14. /**
  15. *
  16. * @author ngh
  17. * AES128 算法
  18. *
  19. * CBC 模式
  20. *
  21. * PKCS7Padding 填充模式
  22. *
  23. * CBC模式需要添加一个参数iv--对称解密算法初始向量 iv
  24. *
  25. * 介于java 不支持PKCS7Padding,只支持PKCS5Padding 但是PKCS7Padding 和 PKCS5Padding 没有什么区别
  26. * 要实现在java端用PKCS7Padding填充,需要用到bouncycastle组件来实现
  27. */
  28. public class Pkcs7Encoder {
  29. // 算法名称
  30. static final String KEY_ALGORITHM = "AES";
  31. // 加解密算法/模式/填充方式
  32. static final String algorithmStr = "AES/CBC/PKCS7Padding";
  33. private static Key key;
  34. private static Cipher cipher;
  35. boolean isInited = false;
  36. //默认对称解密算法初始向量 iv
  37. static byte[] iv = { 0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, 0x30, 0x36, 0x30, 0x37, 0x30, 0x38 };
  38. public static void init(byte[] keyBytes) {
  39. // 如果密钥不足16位,那么就补足. 这个if 中的内容很重要
  40. int base = 16;
  41. if (keyBytes.length % base != 0) {
  42. int groups = keyBytes.length / base + (keyBytes.length % base != 0 ? 1 : 0);
  43. byte[] temp = new byte[groups * base];
  44. Arrays.fill(temp, (byte) 0);
  45. System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length);
  46. keyBytes = temp;
  47. }
  48. // 初始化
  49. Security.addProvider(new BouncyCastleProvider());
  50. // 转化成JAVA的密钥格式
  51. key = new SecretKeySpec(keyBytes, KEY_ALGORITHM);
  52. try {
  53. // 初始化cipher
  54. cipher = Cipher.getInstance(algorithmStr, "BC");
  55. } catch (NoSuchAlgorithmException e) {
  56. // TODO Auto-generated catch block
  57. e.printStackTrace();
  58. } catch (NoSuchPaddingException e) {
  59. // TODO Auto-generated catch block
  60. e.printStackTrace();
  61. } catch (NoSuchProviderException e) {
  62. // TODO Auto-generated catch block
  63. e.printStackTrace();
  64. }
  65. }
  66. /**
  67. * 加密方法
  68. * --使用默认iv时
  69. * @param content
  70. * 要加密的字符串
  71. * @param keyBytes
  72. * 加密密钥
  73. * @return
  74. */
  75. public static byte[] encrypt(byte[] content, byte[] keyBytes) {
  76. byte[] encryptedText = encryptOfDiyIV(content,keyBytes,iv);
  77. return encryptedText;
  78. }
  79. /**
  80. * 解密方法
  81. * --使用默认iv时
  82. * @param encryptedData
  83. * 要解密的字符串
  84. * @param keyBytes
  85. * 解密密钥
  86. * @return
  87. */
  88. public static byte[] decrypt(byte[] encryptedData, byte[] keyBytes) {
  89. byte[] encryptedText = decryptOfDiyIV(encryptedData,keyBytes,iv);
  90. return encryptedText;
  91. }
  92. /**
  93. * 加密方法
  94. * ---自定义对称解密算法初始向量 iv
  95. * @param content
  96. * 要加密的字符串
  97. * @param keyBytes
  98. * 加密密钥
  99. * @param ivs
  100. * 自定义对称解密算法初始向量 iv
  101. * @return 加密的结果
  102. */
  103. public static byte[] encryptOfDiyIV(byte[] content, byte[] keyBytes, byte[] ivs) {
  104. byte[] encryptedText = null;
  105. init(keyBytes);
  106. System.out.println("IV:" + new String(ivs));
  107. try {
  108. cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(ivs));
  109. encryptedText = cipher.doFinal(content);
  110. } catch (Exception e) {
  111. // TODO Auto-generated catch block
  112. e.printStackTrace();
  113. }
  114. return encryptedText;
  115. }
  116. /**
  117. * 解密方法
  118. *
  119. * @param encryptedData
  120. * 要解密的字符串
  121. * @param keyBytes
  122. * 解密密钥
  123. * @param ivs
  124. * 自定义对称解密算法初始向量 iv
  125. * @return
  126. */
  127. public static byte[] decryptOfDiyIV(byte[] encryptedData, byte[] keyBytes,byte[] ivs) {
  128. byte[] encryptedText = null;
  129. init(keyBytes);
  130. System.out.println("IV:" + new String(ivs));
  131. try {
  132. cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(ivs));
  133. encryptedText = cipher.doFinal(encryptedData);
  134. } catch (Exception e) {
  135. // TODO Auto-generated catch block
  136. e.printStackTrace();
  137. }
  138. return encryptedText;
  139. }
  140. }

测试类

  1. public class Test {
  2. public static void main(String[] args) throws Exception {
  3. String encryptedData = "CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZMQmRzooG2xrDcvSnxIMXFufNstNGTyaGS9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+3hVbJSRgv+4lGOETKUQz6OYStslQ142dNCuabNPGBzlooOmB231qMM85d2/fV6ChevvXvQP8Hkue1poOFtnEtpyxVLW1zAo6/1Xx1COxFvrc2d7UL/lmHInNlxuacJXwu0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn/Hz7saL8xz+W//FRAUid1OksQaQx4CMs8LOddcQhULW4ucetDf96JcR3g0gfRK4PC7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns/8wR2SiRS7MNACwTyrGvt9ts8p12PKFdlqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYVoKlaRv85IfVunYzO0IKXsyl7JCUjCpoG20f0a04COwfneQAGGwd5oa+T8yO5hzuyDb/XcxxmK01EpqOyuxINew==";
  4. String iv="r7BXXKkLb8qrSNn05n0qiA==";
  5. String sessionKey = "tiihtNczf5v6AKRyjwEUhQ==";
  6. toStr(sessionKey,encryptedData,iv);
  7. }
  8. private static void toStr(String sessionKey,String encryptedData ,String iv) throws Exception{
  9. byte[] sessionKeyBy = BASE64.decryptBASE64(sessionKey.getBytes());
  10. byte[] encryptedDataBy = BASE64.decryptBASE64(encryptedData.getBytes());
  11. byte[] ivBy = BASE64.decryptBASE64(iv.getBytes());
  12. byte[] dec = Pkcs7Encoder.decryptOfDiyIV(encryptedDataBy, sessionKeyBy,ivBy);
  13. System.out.println(new String(dec));
  14. }
  15. }

测试类中的Base64 带测试方法

  1. import org.apache.commons.codec.binary.Base64;
  2. /** * BASE64加密解密 */
  3. public class BASE64 {
  4. /** * BASE64解密 * @param key * @return * @throws Exception */
  5. public static byte[] decryptBASE64(byte[] key) throws Exception {
  6. return (new Base64()).decode(key);
  7. }
  8. /** * BASE64加密 * @param key * @return * @throws Exception */
  9. public static byte[] encryptBASE64(byte[] key) throws Exception {
  10. return (new Base64()).encode(key);
  11. }
  12. public static void main(String[] args) throws Exception {
  13. byte[] data = BASE64.encryptBASE64("".getBytes());
  14. System.out.println("加密前:" + new String(data));
  15. byte[] byteArray = BASE64.decryptBASE64(data);
  16. System.out.println("解密后:" + new String(byteArray));
  17. }
  18. }

完成

会出现的一些错误: 
cannot load mian class 
打包成jar包以后,在正式运行执行:Java bcprov-jdk150on-1.55.jar之前,需要删除 .jar包中的一个文件:META-INF/BCKEY.DSA 
no such provider: BC 
在jdk中的jre\lib\security修改java.security文件, security.provider.6=com.sun.security.sasl.Provider 下面添加 security.provider.7=org.bouncycastle.jce.provider.BouncyCastleProvider 
在\jre\lib\ext中添加bcprov-jdk15-135.jar的jar包 
bcprov-jdk16-143.jar提供加密,解密,生成密钥对等方法

下载网址: 
文件下载:bcprov-jdk15(16)-135(143).rar

文章大部分代码来自

最新评论

15160334112 发表于 2022-6-9 08:24
手游源码买卖平台

浏览过的版块

轻源码让程序更轻更快

QingYuanMa.com

工作时间 周一至周六 8:00-17:30

侵权处理

客服QQ点击咨询

关注抖音号

定期抽VIP

Copyright © 2016-2021 https://www.171739.xyz/ 滇ICP备13200218号

快速回复 返回顶部 返回列表