Ruby on Rails中的DES3解密

时间:2010-01-11 17:26:47

标签: ruby-on-rails ruby encryption encoding openssl

我的RoR服务器收到一个字符串,该字符串使用带有base64编码的des3在C ++应用程序中加密

创建密码对象:

cipher = OpenSSL::Cipher::Cipher::new("des3")
cipher.key = key_str
cipher.iv =  iv_str

key_str和iv_str:是加密算法的密钥和初始化向量的字符串表示。它们与RoR和C ++应用程序相同。

RoR方面的代码如下:

result = ""
result << cipher.update( Base64.decode64(message) )
result << cipher.final

执行最后一行代码后,我得到一个异常

OpenSSL::CipherError (bad decrypt)

这里有什么问题?有什么想法吗?

2 个答案:

答案 0 :(得分:14)

OpenSSL::Cipher州的文档:

  

在使用以下任何内容之前,请务必致电.encrypt.decrypt   方法:

     
      
  • [key=iv=random_keyrandom_ivpkcs5_keyivgen]
  •   

在您的具体情况下,如您所见,省略对cipher.decrypt的调用会导致bad decrypt错误。

以下示例更正了该问题并展示了预期的行为:

require 'openssl'
require 'Base64'

# For testing purposes only!
message = 'MyTestString'
key = 'PasswordPasswordPassword'
iv = '12345678'

# Encrypt plaintext using Triple DES
cipher = OpenSSL::Cipher::Cipher.new("des3")
cipher.encrypt # Call this before setting key or iv
cipher.key = key
cipher.iv = iv
ciphertext = cipher.update(message)
ciphertext << cipher.final

puts "Encrypted \"#{message}\" with \"#{key}\" to:\n\"#{ciphertext}\"\n"

# Base64-encode the ciphertext
encodedCipherText = Base64.encode64(ciphertext)

# Base64-decode the ciphertext and decrypt it
cipher.decrypt
plaintext = cipher.update(Base64.decode64(encodedCipherText))
plaintext << cipher.final

# Print decrypted plaintext; should match original message
puts "Decrypted \"#{ciphertext}\" with \"#{key}\" to:\n\"#{plaintext}\"\n\n"

答案 1 :(得分:1)

gem install encryptor

它包装了标准的Ruby OpenSSL库,允许您使用它的任何算法。

require 'encryptor'
Base64.decode64(message).decrypt(:algorithm => 'des', :key => key, :iv => iv)