ruby - AES 在 ColdFusion 中加密,在 ruby​​ 中解密

标签 ruby encryption coldfusion aes coldfusion-8

我们一辈子都弄不明白。我们需要让 ColdFusion 加密 ruby​​ 将解密的数据。我们在 ColdFusion 方面尝试了很多不同的设置,查看了 SO 帖子,查看了 Adob​​e 文档,但无法使其工作。 ColdFusion 需要对其进行加密,以便 ruby​​ 可以执行此操作:

aes = OpenSSL::Cipher::Cipher.new('aes-256-cbc').encrypt
aes.key = Digest::MD5.hexdigest("#{password}#{salt}")
aes.iv = Digest::MD5.hexdigest("#{salt}#{password}")[0,16]
encrypted = aes.update(data) + aes.final

ColdFusion伪代码

key = tobase64(binaryDecode(lcase(hash(password & salt, "md5")), "hex"))
iv = lcase(left(hash(salt & password, "md5"), 16))
encrypt(data, key, "AES/CBC/PKCS5Padding", "Base64", iv)

尝试使用/不使用 tobase64/binaryDecode(看到有人提到它会在内部处理转换或一些愚蠢的事情)。 lcase 是让它生成类似于 ruby​​ 构建的 MD5。

我们做错了什么?在 ruby​​ 端无尽的 bad decrypt

最佳答案

What are we doing wrong?

你对编码不小心。

必须考虑编码。

在 ColdFusion 中,您只能使用字节数组作为 key 或 IV,并且只能加密字节数组。

不要处理字节数组以外的任何形式的 key 、IV 或明文。不要将它们作为 base64 编码的字符串、UTF-16 字符串(Java 默认情况下所做的)或任何其他形式来处理。您必须始终只处理字节数组,并且必须始终知道编码并在 ColdFusion 和 Ruby 之间使用相同的编码。

您可以使用编码从字符串中获取字节数组。我倾向于使用 UTF-8 编码。查看 CharsetEncodeCharsetDecode 函数。

您还错误地使用了 key 和 IV。 key 可以使用 PBKDF2 等算法从密码生成,但前提是您没有使用加密随机 PRNG 生成并存储它们的好方法。 IV 应该使用加密随机 PRNG 生成,并且在您存储或传输密文时可以将其添加到密文之前,作为存储/传输 IV 的便捷方法。

关于ruby - AES 在 ColdFusion 中加密,在 ruby​​ 中解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8084015/

相关文章:

.net - 使用 Windows Crypto API 的 Windows 2000 和 Windows 2003 RC2 加密/解密?

php - Joomla 中的外部登录验证

javascript - 如何将 AJAX 返回的字符串转换为对象的 javascript 数组

api - ColdFusion 10 REST API : site-wide error handler (AbortException) gets called when returning file

ruby-on-rails - 在 Gitlab CI 上将 Redis 用于 Rails 项目

ruby-on-rails - Rails 重定向在 nginx 和 gunicorn 设置上失败

python - 我应该如何在 Python 中加密 API token ?

javascript - 简单的 html/javascript

ruby - 如何找到运行时调用 Ruby 方法的位置?

ruby - 迭代时返回迭代对象和索引