【发布时间】:2012-10-15 10:40:02
【问题描述】:
我有在 ColdFusion 中加密的数据,我试图在 Ruby 中解密。我无法让输出匹配。
在 ColdFusion 方面,我有这样的事情:
<cfset key = 'DiYVka4mAYk=' />
<cfset str = 'hello' />
<cfset enc = encrypt(str, key, 'des', "base64") />
<cfset dec = decrypt(enc, key, 'des', "base64") />
<cfoutput>
#str# <!--- 'hello' --->
<br />
#enc# <!--- '3rNKAnEu+VA=' --->
<br />
#dec# <!--- 'hello' --->
</cfoutput>
同样,用 Ruby 实现:
require 'openssl'
require 'base64'
str = 'hello'
key = 'DiYVka4mAYk='
des = OpenSSL::Cipher.new('des')
des.encrypt
des.key = key
data = des.update(str) + des.final
enc = Base64.encode64(data)
des.decrypt
des.key = key
dec = des.update(Base64.decode64(enc)) + des.final
puts str # => 'hello'
puts enc # => 'wVQs6NjOZwM='
puts dec # => 'hello'
两者都有效,但加密的字符串不同。所以在 ColdFusion 和 Ruby 之间传递加密数据是行不通的。
密钥是使用 ColdFusion 的 generateSecretKey() 函数生成的。它看起来是 Base64 编码的,所以我尝试在 Ruby 中设置这样的密钥:
key = Base64.decode64('DiYVka4mAYk=')
同样,代码有效,但加密的字符串不同。
关于密钥编码,我有什么遗漏吗?
另外,我认为在 ColdFusion 中将算法设置为“des”时可能会有更多信息隐含。因此,我尝试使用以下命令在 ruby 中创建密码:
- 德
- des-cbc
- des-cfb
- des-ecb
- des-ede
- des-ede-cbc
- des-ede-cfb
- des-ede-ofb
- des-ofb
同样,加密字符串的一些变化。但没有一个与原始 ColdFusion 版本相匹配。
注意:ColdFusion 加密已经使用了很长时间,所以我无法在这方面进行任何编辑。 “修复”必须在 Ruby 中。
【问题讨论】:
-
如果在加密/解密代码中是DES而不是des,你能看到coldfusion结果是否不同?我有预感。
-
我刚刚在cf9中测试过,它似乎不区分大小写。
结果与 3rNKAnEu+VA= -
我不知道关于 ruby 的第一件事,或者您用于密码的命名空间是否有点不同(看起来它仅用于向后兼容)但根据密码文档字符串创建一个密码是
- - 你只有名字,或者你可以使用类似 cipher = OpenSSL::Cipher::AES.new(128, 'CBC') ruby-doc.org/stdlib-1.9.3/libdoc/openssl/rdoc/OpenSSL/… -
是的,对不起,我认为这个案子是个红鲱鱼。我对 CF 一无所知,但是查看两者的文档,看起来像带有 PKCS5Padding 的 ECB 模式并且没有 IV 是 ruby 和 CF 的默认设置。当我运行您给出的 ruby 示例时,我实际上将 AfbQrCUXOcs= 作为编码值,而不是 ruby 源中的值。这在 1.9.3 和 1.8.7 上都有。这是一个很左的字段,但它可能是字节顺序问题吗?
-
谢谢大家。我已经更新了代码以删除额外的“密码”——正如你所说,它似乎只是遗留的。代码仍然像以前一样运行。 RE 密钥长度:我认为这是 AES 特定的。 DES 没有可变长度的密钥(同样,我认为)。当我输出 OpenSSL::Cipher.ciphers 时,我看到一个包含“AES-128-CBC”和“DES”的列表
标签: ruby coldfusion openssl