使用 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;