使用CryptoJS解密外部AES256 / CBC / PKCS7数据,并从SiteMinder提供了64个字符的十六进制密钥

时间:2018-10-16 03:42:19

标签: javascript encryption aes cryptojs siteminder

我正在尝试使用CryptoJS解密字符串,但要从SiteMinder提供64个字符串。

解密后的字符串如下: 8yi6XwyLPZq%2FNjV9fmoyHYtC2UUS48KlpPLMl063gPwDDLJYkLeUFAwC8hTcXrPJkShbjJTShlLUoh2y17kwOA%3D%3D

提供给我的密钥是64个字符的十六进制字符串,例如:B55E3CE5E4E335D61E3224B2EAAA79E68AFF43FFAAA85A9D4F2BA07618DF2D67

信息解密后,它应该显示一个字符串,该字符串显示如下内容: term1;term2

我使用CryptoJS解密的JavaScript代码如下: CryptoJS.AES.decrypt( encryptedValue, 64CharacterKeyProvidedAbove ).toString();

但是,解密后的值未按预期返回。我已经阅读了一些有关提供IV以使用预定义密钥的信息,但是我没有任何信息,只有SiteMinder从与其连接的数据库中加密信息时使用的密钥。

我需要更改使用CryptoJS的方式吗?

1 个答案:

答案 0 :(得分:0)

假设您的意思是加密的字符串看起来像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;