Java 小程序开发中PKCS7填充解密数据方法的实现
小程序开发
浏览:1339 次

问题
最近,服务器需要将小程序的用户信息数据保存到数据库。getUserInfo小程序api返回的数据encryptedData将被解密
解密算法应为AES-128-CBC,数据应填充KCS7Padding。
在实际使用中,会抛出异常,解决方案需要使用BouncyCastle组件来实现。
解决过程
maven配置
<依赖关系>
依赖性>
源代码
解密用户敏感数据以获取用户信息封装了一个方法,返回值是对象的用户信息
/**
*解密用户敏感数据以获取用户信息
*
*@作者免费砖
*@param encryptedData完整用户信息的加密数据,包括敏感数据
*@param sessionKey加密和签名数据的密钥
*@param iv加密算法的初始矢量
*@return JSONObject
*/
私有JSONObject getUserInfo(String encryptedData,String sessionKey,String iv){

//加密的数据
byte[]dataByte=Base64Utils.decodeFromString(加密数据);
//加密密钥
byte[]keyByte=Base64Utils.decodeFromString(sessionKey);
//偏移量
byte[]ivByte=Base64Utils.decodeFromString(iv);
尝试{
//如果密钥小于16位,则对其进行补充。If中的内容非常重要
整数基数=16;
如果(keyByte.length%base!=0){
int groups=keyByte。长度/基数+(keyByte.length%基数!=0?1:0);
byte[]temp=新字节[groups*base];
阵列。填充(温度,(字节)0);
系统arraycopy(keyByte,0,temp,0,keyByte.length);
keyByte=温度;
}
//初始化
安全addProvider(新BouncyCastleProvider);
Cipher-Cipher=Cipher.getInstance(“AES/CBC/PKCS7Padding”,“BC”);
SecretKeySpec规范=新的SecretKey规范(keyByte,“AES”);
AlgorithmParameters参数=AlgorithParameters.getInstance(“AES”);
参数。init(新的IvParameterSpec(ivByte));
cipher.init(cipher.DECRYPT_MODE,规范,参数);
byte[]resultByte=cipher.doFinal(数据字节);

如果(null!=resultByte&&resultByte.length>0){
字符串结果=新字符串(resultByte,“UTF-8”);
返回JSONUtil.parseObj(结果);
}
}catch(NoSuchAlgorithmException e){
log.error(e.getMessage(),e);
}catch(NoSuchPaddingException e){
log.error(e.getMessage(),e);
}catch(InvalidParameterSpecException e){
log.error(e.getMessage(),e);
}catch(IllegalBlockSizeException e){
log.error(e.getMessage(),e);
}catch(BadPaddingException e){
log.error(e.getMessage(),e);
}catch(不支持的EncodingException e){
log.error(e.getMessage(),e);
}catch(InvalidKeyException e){
log.error(e.getMessage(),e);
}catch(InvalidAlgorithmParameterException e){
log.error(e.getMessage(),e);
}catch(NoSuchProviderException e){
log.error(e.getMessage(),e);
}
返回null;

}