我的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)

这里怎么了?有什么想法吗?

最佳答案

OpenSSL::Cipher的文档说明:
在使用以下任何一项之前,请确保调用.encrypt.decrypt
方法:
[key=iv=random_keyrandom_ivpkcs5_keyivgencipher.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"

10-08 14:09