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

Java中解密微信加密数据工具类

程序员文章站 2022-07-06 13:57:21
当我们开发微信公众号,小程序等,微信返回给我们的数据往往是经过加密的,我们需要使用 sessionkey 配合解密,才能得到我们想要的数据1、引入依赖&l...

当我们开发微信公众号,小程序等,微信返回给我们的数据往往是经过加密的,我们需要使用 sessionkey 配合解密,才能得到我们想要的数据

1、引入依赖

<!-- lombok依赖 -->
<dependency>
    <groupid>org.projectlombok</groupid>
    <artifactid>lombok</artifactid>
    <optional>true</optional>
</dependency>
<!-- alibaba的fastjson -->
<dependency>
    <groupid>com.alibaba</groupid>
    <artifactid>fastjson</artifactid>
    <version>1.2.60</version>
</dependency>
<!-- 工具包 -->
<dependency>
    <groupid>org.apache.commons</groupid>
    <artifactid>commons-lang3</artifactid>
    <version>3.8.1</version>
</dependency>
<!-- rsa加密工具-->
<dependency>
    <groupid>org.bouncycastle</groupid>
    <artifactid>bcprov-jdk15on</artifactid>
    <version>1.55</version>
</dependency>

2、解密工具类

import com.alibaba.fastjson.jsonobject;
import com.sun.org.apache.xerces.internal.impl.dv.util.base64;
import lombok.extern.slf4j.slf4j;
import org.apache.commons.lang3.stringutils;
import org.bouncycastle.jce.provider.bouncycastleprovider;

import javax.crypto.cipher;
import javax.crypto.spec.ivparameterspec;
import javax.crypto.spec.secretkeyspec;
import java.security.algorithmparameters;
import java.security.security;
import java.util.arrays;

/**
 * 解密微信加密数据工具类
 */
@slf4j
public class wechatutils {

    /**
     * 解密微信加密数据
     *
     * @param encrypteddata
     * @param iv
     * @param sessionkey
     * @return
     */
    public static jsonobject decryptwechatdata(string encrypteddata, string iv, string sessionkey) {
        // 被加密的数据
        byte[] databyte = base64.decode(encrypteddata);
        // 加密秘钥
        byte[] keybyte = base64.decode(sessionkey);
        // 偏移量
        byte[] ivbyte = base64.decode(iv);
        try {
            int base = 16;
            if (keybyte.length % base != 0) {
                int groups = keybyte.length / base + (keybyte.length % base != 0 ? 1 : 0);
                byte[] temp = new byte[groups * base];
                arrays.fill(temp, (byte) 0);
                system.arraycopy(keybyte, 0, temp, 0, keybyte.length);
                keybyte = temp;
            }
            security.addprovider(new bouncycastleprovider());
            cipher cipher = cipher.getinstance("aes/cbc/pkcs7padding", "bc");
            secretkeyspec spec = new secretkeyspec(keybyte, "aes");
            algorithmparameters parameters = algorithmparameters.getinstance("aes");
            parameters.init(new ivparameterspec(ivbyte));
            cipher.init(cipher.decrypt_mode, spec, parameters);
            byte[] resultbyte = cipher.dofinal(databyte);
            if (null != resultbyte && resultbyte.length > 0) {
                string result = new string(resultbyte, "utf-8");
                if (stringutils.isnotblank(result)) {
                    log.info("----------解密微信数据成功----------");
                    return jsonobject.parseobject(result);
                }
            }
        } catch (exception e) {
            e.printstacktrace();
            log.info("----------解密微信数据失败----------");
        }
        return null;
    }
}

这样,我们将微信加密的数据,转化成了 json 对象,就得到了我们想要的数据了

以上就是java中解密微信加密数据工具类的详细内容,更多关于java加密解密工具类的资料请关注其它相关文章!