为什么这个 cCryptoGS AES 加密会给出几乎相同的所有密文?
Why this cCryptoGS AES encryption gives out all ciphertext pretty much the same?
我目前正在使用 Google App Script 试验 AES 加密,我发现了 cCryptoGS。
感觉很奇怪,因为所有密文似乎都以 U2FsdGVkX1 开头(尽管我更改了部分 这是我的密码在示例中与其他内容 非常非常 不同)。我不确定我是否记错了,我过去曾经尝试过 AES,但是在 Nodejs 上,它看起来非常不同,我会得到完全不同的文本加密 即使我只改变一个我的消息或密钥中的字符。
即使在这个postHow is AES implemented in CryptoJS?中,密文也以U2FsdGVkX1.
开头
我要问的是:这个 cCryptoGS 真的如其所言吗? (即对消息应用 AES 加密)
这是网站https://ramblings.mcpher.com/gassnippets2/cryptojs-libraries-for-google-apps-script/网站上还有图表显示GoogleApp Script不能很好地处理复杂的计算,所以看起来合法 ,但结果似乎很……奇怪……因为,总体而言,AES 似乎是进行加密的最佳选择之一。
如果这确实是 AES 应该如何工作的,有什么方法可以让它看起来 更多 随机?非常感谢你,:(
非常感谢您,
CryptoJS 可以处理加密和解密的密码和密钥。字符串被解释为密码,WordArray
s 被解释为密钥,s。 The Cipher Input.
cCryptoGS 包装密码变体并支持算法 AES、DES、TripleDES 和 Rabbit,请参阅 Usage。
例如对于 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 的迭代计数),s。例如here, 3rd part,所以实际上不推荐使用它(除了兼容性之外)。
这适用于使用 encryption/decryption 密码的包装功能。 cCryptoGS 还直接 允许使用 CryptoJS 函数,参见 CryptoJS direct,其安全性有待单独评估。
安全的方法是直接传递密钥和 IV ,或者在使用密码时不应用内置函数 EVP_BytesToKey()
,而是可靠的密钥派生功能类似于 PBKDF2。
CryptoJS 支持这些变体,但显然 cCryptoGS 不支持,至少包装功能不支持。
另请注意,至少链接的 cCryptoGS 源似乎基于 2013 年的 CryptoJS 版本 3.1.2,s。 cCryptoGS sources(当前 CryptoJS 版本为 4.1.1)。
我目前正在使用 Google App Script 试验 AES 加密,我发现了 cCryptoGS。
感觉很奇怪,因为所有密文似乎都以 U2FsdGVkX1 开头(尽管我更改了部分 这是我的密码在示例中与其他内容 非常非常 不同)。我不确定我是否记错了,我过去曾经尝试过 AES,但是在 Nodejs 上,它看起来非常不同,我会得到完全不同的文本加密 即使我只改变一个我的消息或密钥中的字符。
即使在这个postHow is AES implemented in CryptoJS?中,密文也以U2FsdGVkX1.
开头我要问的是:这个 cCryptoGS 真的如其所言吗? (即对消息应用 AES 加密)
这是网站https://ramblings.mcpher.com/gassnippets2/cryptojs-libraries-for-google-apps-script/网站上还有图表显示GoogleApp Script不能很好地处理复杂的计算,所以看起来合法 ,但结果似乎很……奇怪……因为,总体而言,AES 似乎是进行加密的最佳选择之一。
如果这确实是 AES 应该如何工作的,有什么方法可以让它看起来 更多 随机?非常感谢你,:(
非常感谢您,
CryptoJS 可以处理加密和解密的密码和密钥。字符串被解释为密码,WordArray
s 被解释为密钥,s。 The Cipher Input.
cCryptoGS 包装密码变体并支持算法 AES、DES、TripleDES 和 Rabbit,请参阅 Usage。
例如对于 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 的迭代计数),s。例如here, 3rd part,所以实际上不推荐使用它(除了兼容性之外)。
这适用于使用 encryption/decryption 密码的包装功能。 cCryptoGS 还直接 允许使用 CryptoJS 函数,参见 CryptoJS direct,其安全性有待单独评估。
安全的方法是直接传递密钥和 IV ,或者在使用密码时不应用内置函数 EVP_BytesToKey()
,而是可靠的密钥派生功能类似于 PBKDF2。
CryptoJS 支持这些变体,但显然 cCryptoGS 不支持,至少包装功能不支持。
另请注意,至少链接的 cCryptoGS 源似乎基于 2013 年的 CryptoJS 版本 3.1.2,s。 cCryptoGS sources(当前 CryptoJS 版本为 4.1.1)。