首页 > 解决方案 > 为什么这个 cCryptoGS AES 加密给出的所有密文几乎相同?

问题描述

我目前正在使用 Google App Script 试验 AES 加密,并且发现了 cCryptoGS。

感觉很奇怪,因为所有加密文本似乎都以U2FsdGVkX1 开头(即使我将示例中的this is my passphrase部分更改为其他非常不同的部分)。我不确定我是否记错了,我过去曾经尝试过 AES,但是在 Nodejs 上,它看起来有很大的不同,即使我在任何一条消息中只更改了一个字符,我也会得到完全不同的文本加密,或者我的钥匙。

即使在这篇文章中,如何在 CryptoJS 中实现 AES?,密文也以U2FsdGVkX1 开头

我要问的是:这个cCryptoGS真的做了它声称要做的事情吗?(即对消息应用 AES 加密)

这是网站https://ramblings.mcpher.com/gassnippets2/cryptojs-libraries-for-google-apps-script/网站上也有图表显示 Google App Script 不能很好地处理复杂的计算,所以它看起来是合法的,但结果似乎是如此......奇怪......因为,整体 AES 似乎是进行加密的最佳选择之一。

如果这确实是 AES 应该如何工作,有什么方法可以让它看起来随机吗?提前非常感谢你,:(

非常感谢您,

在此处输入图像描述

在此处输入图像描述

标签: javascriptgoogle-apps-scriptencryptionaes

解决方案


CryptoJS 可以处理密码和密钥以进行加密和解密。字符串被解释为密码,WordArrays 被解释为键,s。密码输入
cCryptoGS 包装了密码变体并支持算法 AES、DES、TripleDES 和 Rabbit,请参阅用法

例如对于 AES,cCryptoGS/CryptoJS 使用 AES-256 加密,因此除了明文之外还必须传递密码。
在加密之前,会生成一个随机的 8 字节盐,并从密码和盐中生成一个 32 字节的密钥和 16 字节的 IV,使用 OpenSSL 密钥派生函数EVP_BytesToKey()
结果以 OpenSSL 格式生成以与 OpenSSL 兼容,该格式由Salted__的 ASCII 编码后跟 8 个字节的 salt 和实际密文组成,整个表达式为 Base64 编码。Salted__
的Base64编码是 U2FsdGVkX18=,其中 U2FsdGVkX1 是固定的(最后两个字符取决于盐的第一个字节,因此可以更改)。因此,任何加密都以 U2FsdGVkX1 开头,但这不会泄露任何信息。
所以是的,它是用 AES-256 加密的,常量前缀 U2FsdGVkX1 并不重要。

然而,密钥派生函数EVP_BytesToKey()现在被认为是不安全的,尤其是 cCryptoGS/CryptoJS 使用的参数(损坏的 MD5 摘要和迭代计数为 1),这里是第 3 部分,因此实际上不推荐使用它(除了兼容性可能)。
这适用于使用密码短语进行加密/解密的包装功能。cCryptoGS 还直接允许使用 CryptoJS 功能,请参阅CryptoJS direct,其安全性将单独评估。

安全的方法是直接传递密钥和 IV ,或者在使用密码短语时不应用内置函数EVP_BytesToKey(),而是使用可靠的密钥派生函数,如 PBKDF2。
CryptoJS 支持这些变体,但显然 cCryptoGS 不支持,至少包装的功能不支持。

另请注意,至少链接的 cCryptoGS 源似乎基于 2013 年的 CryptoJS 版本 3.1.2,s。cCryptoGS 源(当前 CryptoJS 版本是 4.1.1)。


推荐阅读