微信小程序——用户信息解解密
1.使用
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64; 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; public class WechatDecryptUtil { static{ //BouncyCastle作为安全提供,防止我们加密解密时候因为jdk内置的不支持改模式运行报错。 Security.addProvider(new BouncyCastleProvider()); } /** * 微信小程序公共信息解密 * @param encryptedData * @param sessionKey * @param iv * @return * @throws Exception */ public static String decrypt(String encryptedData, String sessionKey, String iv) throws Exception { byte[] dataByte = Base64.decode(encryptedData); byte[] keyByte = Base64.decode(sessionKey); byte[] ivByte = Base64.decode(iv); // 如果密钥不足16位,那么就补足。这个if 中的内容很重要 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; } // 生成iv AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES"); parameters.init(new IvParameterSpec(ivByte)); // 解密 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); SecretKeySpec spec = new SecretKeySpec(keyByte, "AES"); cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化 byte[] resultByte = cipher.doFinal(dataByte); if (null != resultByte && resultByte.length > 0) { return new String(resultByte, "UTF-8"); } return null; } }