2

我有在 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​​ 中创建密码:

  • 德斯
  • 德式CBC
  • DES-CFB
  • des-ecb
  • 德埃德
  • des-ede-cbc
  • des-ede-cfb
  • des-ede-ofb
  • 脱氧核糖核酸

同样,加密字符串的一些变化。但没有一个与原始 ColdFusion 版本相匹配。

注意:ColdFusion 加密已经使用了很长时间,所以我无法在这方面进行任何编辑。“修复”必须在 Ruby 中。

4

1 回答 1

4

如被问及,我将把我的评论转移到一个答案:

您必须确保两端的密码模式、IV 和填充匹配。

1.8.7 和 1.9.3 中的 Ruby 默认值是 ECB,没有 IV,以及 PCKS 填充。ColdFusion 默认值是相同的。

但是,在 ruby​​ 1.9.2 或您的特定环境中,默认密码模式似乎不是 ECB,它正在更改输出。正如您评论的那样,手动将密码模式设置为 ECB (OpenSSL::Cipher.new("DES-ECB")) 解决了这个问题。

于 2012-10-18T03:05:04.833 回答