微信加密数据解密算法 Java 版

一。 Maven 配置



    org.bouncycastle
    bcprov-jdk15on
    1.65

二。解密后的数据

{
    "openId": "",
    "nickName": "",
    "gender": 1,
    "language": "",
    "city": "",
    "province": "",
    "country": "",
    "avatarUrl": "",
    "unionId": "",
    "watermark": {
        "timestamp": 1588254098,
        "appid": ""
    }
}

三。相关代码

package com.x5.library.common;

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.spec.InvalidParameterSpecException;
import java.util.Base64;

public class WechatUtil {
    private static final Logger LOGGER = LoggerFactory.getLogger(WechatUtil.class);

    static {
        Security.addProvider(new BouncyCastleProvider());
    }

    private static final String KEY_ALGORITHM = "AES";
    private static final String DEFAULT_CIPHER_ALGORITHM = "AES/CBC/PKCS7Padding";

    private static AlgorithmParameters generateIV(byte[] iv) throws NoSuchAlgorithmException, InvalidParameterSpecException {
        AlgorithmParameters parameters = AlgorithmParameters.getInstance(KEY_ALGORITHM);
        parameters.init(new IvParameterSpec(iv));
        return parameters;
    }

    private static byte[] decrypt(byte[] content, byte[] key, byte[] iv) throws Exception {
        Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
        Key keySpec = new SecretKeySpec(key, KEY_ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, keySpec, generateIV(iv));

        byte[] result = cipher.doFinal(content);
        return result;

    }

    public static String decryptData(String encryptedData, String session_key, String ivStr) throws Exception {
        Base64.Decoder decoder = Base64.getDecoder();

        byte[] content = decoder.decode(encryptedData);
        byte[] key = decoder.decode(session_key);
        byte[] iv = decoder.decode(ivStr);

        byte[] plain = decrypt(content, key, iv);
        String plainStr = new String(plain, StandardCharsets.UTF_8);

        LOGGER.debug("@@@@@@ plainStr {}", plainStr);

        return plainStr;
    }
}

你可能感兴趣的:(微信加密数据解密算法 Java 版)