使用 CryptoJS 解密外部 AES256/CBC/PKCS7 数据,提供来自 SiteMinder 的 64 字符十六进制密钥
Decrypt external AES256/CBC/PKCS7 data with CryptoJS, provided 64-char Hex key from SiteMinder
我正在尝试使用 CryptoJS 解密一个字符串,从 SiteMinder 提供了一个 64 个字符的字符串。
解密后的字符串如下所示:
8yi6XwyLPZq%2FNjV9fmoyHYtC2UUS48KlpPLMl063gPwDDLJYkLeUFAwC8hTcXrPJkShbjJTShlLUoh2y17kwOA%3D%3D
提供给我的密钥是一个 64 个字符的十六进制字符串,如下所示:B55E3CE5E4E335D61E3224B2EAAA79E68AFF43FFAAA85A9D4F2BA07618DF2D67
信息解密后,应该会出现一个字符串,内容如下:
term1;term2
我使用 CryptoJS 解密的 JavaScript 代码如下所示:
CryptoJS.AES.decrypt(
encryptedValue,
64CharacterKeyProvidedAbove
).toString();
但是,解密值没有按预期返回。我已经阅读了一些关于提供 IV 以使用预定义密钥的信息,但我没有任何信息,只有当 SiteMinder 从它所连接的数据库中加密信息时使用的密钥。
我需要改变我使用 CryptoJS 的方式吗?
假设您的意思是 加密的 字符串看起来像 8yi6XwyLPZq%2FNjV9fmoyHYtC2UUS48KlpPLMl063gPwDDLJYkLeUFAwC8hTcXrPJkShbjJTShlLUoh2y17kwOA%3D%3D
.
并且假设加密是 AES256/CBC/PKCS7。
我们可以做出这些观察:
- 字符串看起来是URL编码和Base64编码(%3D是
=
,Base64通常以=
结尾)
- 没有CBC需要的IV,所以它可能在编码字符串的前16个字节中。字符串的其余部分可能是密文
所以我们可以像这样用 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;
我正在尝试使用 CryptoJS 解密一个字符串,从 SiteMinder 提供了一个 64 个字符的字符串。
解密后的字符串如下所示:
8yi6XwyLPZq%2FNjV9fmoyHYtC2UUS48KlpPLMl063gPwDDLJYkLeUFAwC8hTcXrPJkShbjJTShlLUoh2y17kwOA%3D%3D
提供给我的密钥是一个 64 个字符的十六进制字符串,如下所示:B55E3CE5E4E335D61E3224B2EAAA79E68AFF43FFAAA85A9D4F2BA07618DF2D67
信息解密后,应该会出现一个字符串,内容如下:
term1;term2
我使用 CryptoJS 解密的 JavaScript 代码如下所示:
CryptoJS.AES.decrypt(
encryptedValue,
64CharacterKeyProvidedAbove
).toString();
但是,解密值没有按预期返回。我已经阅读了一些关于提供 IV 以使用预定义密钥的信息,但我没有任何信息,只有当 SiteMinder 从它所连接的数据库中加密信息时使用的密钥。
我需要改变我使用 CryptoJS 的方式吗?
假设您的意思是 加密的 字符串看起来像 8yi6XwyLPZq%2FNjV9fmoyHYtC2UUS48KlpPLMl063gPwDDLJYkLeUFAwC8hTcXrPJkShbjJTShlLUoh2y17kwOA%3D%3D
.
并且假设加密是 AES256/CBC/PKCS7。
我们可以做出这些观察:
- 字符串看起来是URL编码和Base64编码(%3D是
=
,Base64通常以=
结尾) - 没有CBC需要的IV,所以它可能在编码字符串的前16个字节中。字符串的其余部分可能是密文
所以我们可以像这样用 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;