我们不能为我们的生活弄清楚这一点。我们需要使用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。
我们做错了什么?红宝石一面的无尽bad decrypt
答案 0 :(得分:1)
我们做错了什么?
你对编码并不小心。
您必须考虑编码。
在ColdFusion中,您只能使用字节数组作为键或IV,并且只能加密字节数组。
不要以字节数组以外的任何形式处理键,IV或cleartexts。不要将它们作为base64编码的字符串,UTF-16字符串(Java默认使用)或任何其他形式处理它们。您必须始终只处理字节数组,并且必须始终知道编码并在ColdFusion和Ruby之间使用相同的编码。
您可以使用编码从字符串中获取字节数组。我倾向于使用UTF-8编码。查看CharsetEncode
和CharsetDecode
函数。
你也在使用密钥和IV错误。可以使用诸如PBKDF2之类的算法从密码生成密钥 ,但前提是您没有使用加密随机PRNG生成并存储它们的好方法。 IVs 应使用加密随机PRNG生成,并且当您存储或传输密文时,可以将其作为密文的前缀,作为存储/传输IV的便捷方法。