我们一辈子都弄不明白。我们需要让 ColdFusion 加密 ruby 将解密的数据。我们在 ColdFusion 方面尝试了很多不同的设置,查看了 SO 帖子,查看了 Adobe 文档,但无法使其工作。 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 编码。查看 CharsetEncode
和 CharsetDecode
函数。
您还错误地使用了 key 和 IV。 key 可以使用 PBKDF2 等算法从密码生成,但前提是您没有使用加密随机 PRNG 生成并存储它们的好方法。 IV 应该使用加密随机 PRNG 生成,并且在您存储或传输密文时可以将其添加到密文之前,作为存储/传输 IV 的便捷方法。
关于ruby - AES 在 ColdFusion 中加密,在 ruby 中解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8084015/