欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java实现微信加密数据解密算法

程序员文章站 2022-06-21 15:02:17
最近小翔接收到一个新的任务---->微信解密下面一起来看看吧https://blog.csdn.net/zhuwangxiangbie/article/details/105124612...

最近小翔接收到一个新的任务---->微信解密

下面一起来看看吧,话不多说现附上一个截图,这是微信小程序开发文档中的截图片段

Java实现微信加密数据解密算法

 点击下载后各种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

相关标签: 解决方法 java