【问题标题】:Encryption - different results in Ruby and ColdFusion加密 - Ruby 和 ColdFusion 中的不同结果
【发布时间】: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


【解决方案1】:

按照要求,我会将我的评论转移到答案:

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

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

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

【讨论】:

    猜你喜欢
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    相关资源
    最近更新 更多