美文网首页
微信小程序AES/CBC/PKCS7Padding解密encry

微信小程序AES/CBC/PKCS7Padding解密encry

作者: IT男的假智慧 | 来源:发表于2020-09-17 18:36 被阅读0次

// 算法名

publicstaticfinalString KEY_NAME ="AES";

// 加解密算法/模式/填充方式

// ECB模式只用密钥即可对数据进行加密解密,CBC模式需要添加一个iv

publicstaticfinalString CIPHER_ALGORITHM ="AES/CBC/PKCS7Padding";

/**

    * 微信 数据解密<br/>

    * 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充<br/>

    * 对称解密的目标密文:encrypted=Base64_Decode(encryptData)<br/>

    * 对称解密秘钥:key = Base64_Decode(session_key),aeskey是16字节<br/>

    * 对称解密算法初始向量:iv = Base64_Decode(iv),同样是16字节<br/>

    *

*@paramencrypted 目标密文

*@paramsession_key 会话ID

*@paramiv 加密算法的初始向量

    */

publicstaticStringwxDecrypt(String encrypted, String session_key, String iv){

String json =null;

byte[] encrypted64 = Base64.decodeBase64(encrypted);

byte[] key64 = Base64.decodeBase64(session_key);

byte[] iv64 = Base64.decodeBase64(iv);

byte[] data;

try{

            init();

json =newString(decrypt(encrypted64, key64, generateIV(iv64)));

}catch(Exception e) {

            e.printStackTrace();

        }

returnjson;

    }

/**

    * 初始化密钥

    */

publicstaticvoidinit()throwsException{

Security.addProvider(neworg.bouncycastle.jce.provider.BouncyCastleProvider());

KeyGenerator.getInstance(KEY_NAME).init(128);

    }

/**

    * 生成iv

    */

publicstaticAlgorithmParametersgenerateIV(byte[] iv)throwsException{

// iv 为一个 16 字节的数组,这里采用和 iOS 端一样的构造方法,数据全为0

// Arrays.fill(iv, (byte) 0x00);

        AlgorithmParameters params = AlgorithmParameters.getInstance(KEY_NAME);

params.init(newIvParameterSpec(iv));

returnparams;

    }

/**

    * 生成解密

    */

publicstaticbyte[] decrypt(byte[] encryptedData,byte[] keyBytes, AlgorithmParameters iv)

throwsException {

Key key =newSecretKeySpec(keyBytes, KEY_NAME);

        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);

// 设置为解密模式

        cipher.init(Cipher.DECRYPT_MODE, key, iv);

returncipher.doFinal(encryptedData);

    }

/**

    * 微信小程序解密

*@paramencryptedData

*@paramsessionKey

*@paramiv

*@return

    */

publicstaticStringgetUserInfo(String encryptedData, String sessionKey, String iv){

String result ="";

// 被加密的数据

byte[] dataByte = Base64.decodeBase64(encryptedData);

// 加密秘钥

byte[] keyByte = Base64.decodeBase64(sessionKey);

// 偏移量

byte[] ivByte = Base64.decodeBase64(iv);

try{

// 如果密钥不足16位,那么就补足. 这个if 中的内容很重要

intbase =16;

if(keyByte.length % base !=0) {

intgroups = keyByte.length / base

+ (keyByte.length % base !=0?1:0);

byte[] temp =newbyte[groups * base];

Arrays.fill(temp, (byte)0);

System.arraycopy(keyByte,0, temp,0, keyByte.length);

                keyByte = temp;

            }

// 初始化

Security.addProvider(newBouncyCastleProvider());

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding","BC");

SecretKeySpec spec =newSecretKeySpec(keyByte,"AES");

            AlgorithmParameters parameters = AlgorithmParameters

.getInstance("AES");

parameters.init(newIvParameterSpec(ivByte));

cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化

byte[] resultByte = cipher.doFinal(dataByte);

if(null!= resultByte && resultByte.length >0) {

result =newString(resultByte,"UTF-8");

            }

}catch(NoSuchAlgorithmException e) {

            e.printStackTrace();

}catch(NoSuchPaddingException e) {

            e.printStackTrace();

}catch(InvalidParameterSpecException e) {

            e.printStackTrace();

}catch(IllegalBlockSizeException e) {

            e.printStackTrace();

}catch(BadPaddingException e) {

            e.printStackTrace();

}catch(UnsupportedEncodingException e) {

            e.printStackTrace();

}catch(InvalidKeyException e) {

            e.printStackTrace();

}catch(InvalidAlgorithmParameterException e) {

            e.printStackTrace();

}catch(NoSuchProviderException e) {

            e.printStackTrace();

        }

returnresult;

    }

相关文章

网友评论

      本文标题:微信小程序AES/CBC/PKCS7Padding解密encry

      本文链接:https://www.haomeiwen.com/subject/vwzwektx.html