Java实现微信加密数据解密算法
最近小翔接收到一个新的任务---->微信解密
下面一起来看看吧,话不多说现附上一个截图,这是微信小程序开发文档中的截图片段
点击下载后各种
就是没有java的解密demo, so 我的活来了........
附上我解决各种报错之后整合的代码
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.StringUtils;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import javax.validation.constraints.NotNull;
import java.security.Security;
import java.security.spec.AlgorithmParameterSpec;
/**
* @Author xiang
* @CreatTime 2020/11/18
* @Describe
*/
@Slf4j
public class AESUtils {
// 加密模式
private static final String ALGORITHM = "AES/CBC/PKCS7Padding";
private static final String CHARSET_NAME = "UTF-8";
private static final String AES_NAME = "AES";
//解决java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/PKCS7Padding
static {
Security.addProvider(new BouncyCastleProvider());
}
/**
* 解密
*
* @param content 目标密文
* @param key 秘钥
* @param iv 偏移量
* @return
*/
public static String decrypt(@NotNull String content, @NotNull String key, @NotNull String iv) {
try {
Cipher cipher = Cipher.getInstance(ALGORITHM);
byte[] sessionKey = java.util.Base64.getDecoder().decode(key);
SecretKeySpec keySpec = new SecretKeySpec(sessionKey, AES_NAME);
byte[] ivByte = java.util.Base64.getDecoder().decode(iv);
AlgorithmParameterSpec paramSpec = new IvParameterSpec(ivByte);
cipher.init(Cipher.DECRYPT_MODE, keySpec, paramSpec);
return new String(cipher.doFinal(Base64.decodeBase64(content)), CHARSET_NAME);
} catch (Exception e) {
log.error("解密失败:{}", e);
e.printStackTrace();
}
return StringUtils.EMPTY;
}
public static void main(String[] args) {
//接口传入的参数
String appid = "wx4f4bc4dec97d474b";
String sessionKey = "tiihtNczf5v6AKRyjwEUhQ==";
String encryptedData = "CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZMQmRzooG2xrDcvSnxIMXFufNstNGTyaGS9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+3hVbJSRgv+4lGOETKUQz6OYStslQ142dNCuabNPGBzlooOmB231qMM85d2/fV6ChevvXvQP8Hkue1poOFtnEtpyxVLW1zAo6/1Xx1COxFvrc2d7UL/lmHInNlxuacJXwu0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn/Hz7saL8xz+W//FRAUid1OksQaQx4CMs8LOddcQhULW4ucetDf96JcR3g0gfRK4PC7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns/8wR2SiRS7MNACwTyrGvt9ts8p12PKFdlqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYVoKlaRv85IfVunYzO0IKXsyl7JCUjCpoG20f0a04COwfneQAGGwd5oa+T8yO5hzuyDb/XcxxmK01EpqOyuxINew==";
String iv = "r7BXXKkLb8qrSNn05n0qiA==";
String decrypt = AESUtils.decrypt(encryptedData, sessionKey, iv);
System.out.println("解密后:" + decrypt);
}
}
这里的代码你们复制之后直接运行main方法即可得出结果
解密后:{
"openId": "oGZUI0egBJY1zhBYw2KhdUfwVJJE",
"nickName": "Band",
"gender": 1,
"language": "zh_CN",
"city": "Guangzhou",
"province": "Guangdong",
"country": "CN",
"avatarUrl": "http://wx.qlogo.cn/mmopen/vi_32/aSKcBBPpibyKNicHNTMM0qJVh8Kjgiak2AHWr8MHM4WgMEm7GFhsf8OYrySdbvAMvTsw3mo8ibKicsnfN5pRjl1p8HQ/0",
"unionId": "ocMvos6NjeKLIBqg5Mr9QjxrP1FA",
"watermark": {
"timestamp": 1477314187,
"appid": "wx4f4bc4dec97d474b"
}
}
初次运行可能会报 :java.security.InvalidKeyException: Illegal key size
如果报java.security.InvalidKeyException: Illegal key size
原因:JRE中自带的“local_policy.jar ”和“US_export_policy.jar”是支持128位密钥的加密算法,而当我们要使用256位密钥算法的时候,已经超出它的范围,无法支持,所以才会报:“java.security.InvalidKeyException: Illegal key size or default parameters”的异常。
链接:https://pan.baidu.com/s/1dtkygPFPCrAbpi4HQaraIA
提取码:koi6
将两个jar文件放到%JAVE_HOME%\jre\lib\security目录下覆盖原来文件。
具体的报错详细可以查看 https://blog.csdn.net/zhuwangxiangbie/article/details/105124612
这个是其他 博主的解密文章你们可以看下
https://blog.csdn.net/weixin_39722651/article/details/90523286
https://blog.csdn.net/weixin_43790584/article/details/98179309
但是我运行时有java.security.InvalidAlgorithmParameterException: IV must be 16 bytes long.这个问题 会指向偏移量iv有时也会指向key,解析时 长度不是16个字节
AES 的密钥长度为128、192、256 位,也就是16 字节、24字节、32字节。
所以我参照Python中的代码比葫芦画瓢也是用Base64,进行字节转换
//偏离量 解码
byte[] ivByte = java.util.Base64.getDecoder().decode(iv);
//key 秘钥 解码
byte[] sessionKey = java.util.Base64.getDecoder().decode(key);
好了 本片文章到此结束啦 谢谢观看如有什么问题欢迎在评论区呼叫小翔 ! 我随时都在 0v0
本文地址:https://blog.csdn.net/cdliker/article/details/109775914