【问题标题】:Decrypt external AES256/CBC/PKCS7 data with CryptoJS, provided 64-char Hex key from SiteMinder使用 CryptoJS 解密外部 AES256/CBC/PKCS7 数据,提供来自 SiteMinder 的 64 字符十六进制密钥
【发布时间】:2018-10-16 03:42:19
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 信息是:SERLOGINNAME=T6ATD1F;password=QWERTY!8;?

标签: javascript encryption aes cryptojs siteminder


【解决方案1】:

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

【讨论】:

  • P.S.当然,这一切都假设您在浏览器中运行并且确实必须使用 CryptoJS。因为如果在 NodeJs 中运行,最好使用 crypto API,它是内置的并且可以原生运行。
  • 不幸的是,我仅限于使用 CryptoJS - 这可以解决问题,谢谢!
猜你喜欢
  • 2017-05-07
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
相关资源
最近更新 更多