加密内容为长度为12个字符长度时,使用cipher解密:const output = await cipher.doFinal(null); 这一步会被 catch,没有error信息。
例子:使用testContent1进行cipher加密,字符长度为12,key为AES256类型,加密解密都可以。
const testContent1 = "aaa_bbb_ccc_";
加密后的数据:19D2CF481514BA7C3D08F80D5A8960C35AD01F54DEEC6453AF9B42538FEECF96使用testContent2进行cipher加密,字符长度为16,key为AES256类型,加密可以,解密被catch没有错误信息。
const testContent2 = "aaa_bbb_ccc_ddd_";
加密后的数据: 203A2C904532ED37C1F25958895E901B8972477F03049230298ED9FCB2F9CCA7
// 解密代码
const AES256 = 'AES256';
const AES_CBC_INIT = 'AES|CBC|PKCS5';
const IV_PARAMETER_LENGTH = 32;
try {
let symKeyGenerator = cryptoFramework.createSymKeyGenerator(AES256);
let skeySpec = await symKeyGenerator.convertKey({ data: aesKey });
let cipher = cryptoFramework.createCipher(AES_CBC_INIT);
let ivParameter = content.substring(0, IV_PARAMETER_LENGTH);
const ivparam: cryptoFramework.IvParamsSpec = {
algName: "IvParamsSpec",
iv: {
data: parseHexStr2Byte(ivParameter)
}
};
await cipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, skeySpec, ivparam);
await cipher.update({
data: parseHexStr2Byte(content.substring(IV_PARAMETER_LENGTH))
});
const output = await cipher.doFinal(null);
const ciphertextBytes = output.data;
return bufferToString(ciphertextBytes);
} catch (e) {
LogUtil.error(e);
}
代码使用错误,使用update之后自己做完dofinal需要将所有的结果拼接起来得到最后的结果,如果数据量较少,建议不使用update直接使用dofinal。这个地方报错是因为使用update解密后正好解密完dofinal里面没有结果导致对空数据做解密。