我正在尝试使用CryptoJS解密字符串,但要从SiteMinder提供64个字符串。
解密后的字符串如下:
8yi6XwyLPZq%2FNjV9fmoyHYtC2UUS48KlpPLMl063gPwDDLJYkLeUFAwC8hTcXrPJkShbjJTShlLUoh2y17kwOA%3D%3D
提供给我的密钥是64个字符的十六进制字符串,例如:B55E3CE5E4E335D61E3224B2EAAA79E68AFF43FFAAA85A9D4F2BA07618DF2D67
信息解密后,它应该显示一个字符串,该字符串显示如下内容:
term1;term2
我使用CryptoJS解密的JavaScript代码如下:
CryptoJS.AES.decrypt(
encryptedValue,
64CharacterKeyProvidedAbove
).toString();
但是,解密后的值未按预期返回。我已经阅读了一些有关提供IV以使用预定义密钥的信息,但是我没有任何信息,只有SiteMinder从与其连接的数据库中加密信息时使用的密钥。
我需要更改使用CryptoJS的方式吗?
答案 0 :(得分:0)
假设您的意思是加密的字符串看起来像8yi6XwyLPZq%2FNjV9fmoyHYtC2UUS48KlpPLMl063gPwDDLJYkLeUFAwC8hTcXrPJkShbjJTShlLUoh2y17kwOA%3D%3D
。
鉴于加密是AES256 / CBC / PKCS7。
我们可以进行以下观察:
=
,而Base64通常以=
结尾)因此我们可以使用CryptoJS对其进行解密,如下所示:
var encrypted = CryptoJS.enc.Base64.parse(decodeURIComponent(encryptedStr));
var key = CryptoJS.enc.Hex.parse(hexKey);
var iv = CryptoJS.enc.Hex.parse(CryptoJS.enc.Hex.stringify(encrypted).substr(0, 32));
var ciphertext = CryptoJS.enc.Hex.parse(CryptoJS.enc.Hex.stringify(encrypted).substr(32));
var plaintext = CryptoJS.AES.decrypt({ciphertext: ciphertext}, key, {iv: iv});
这是jsFiddle上的DEMO。
结果:
SERLOGINNAME=T6ATD1F;password=QWERTY!8;