在ruby中获得一个糟糕的解密错误

时间:2018-04-05 14:00:13

标签: ruby-on-rails ruby

我正在使用此代码片段来扩展Rails中的String类:

require 'openssl'

class String
  def encrypt(key)
    cipher = OpenSSL::Cipher.new('DES-EDE3-CBC').encrypt
    key = cipher.random_key
    cipher.key = key
    s = cipher.update(self) + cipher.final

    s.unpack('H*')[0].upcase
  end

  def decrypt(key)
    cipher = OpenSSL::Cipher.new('DES-EDE3-CBC').decrypt
    key = cipher.random_key
    cipher.key = key
    s = [self].pack("H*").unpack("C*").pack("c*")

    cipher.update(s) + cipher.final
  end
end

然而,当解密字符串时,我得到了#34; Bad decrypt错误":

puts plain = 'confidential'           # confidential
puts key = 'secret'                   # secret
puts cipher = plain.encrypt(key)      # 5C6D4C5FAFFCF09F271E01C5A132BE89

puts cipher.decrypt(key)              # BAD DECRYPT

我尝试在解密操作中添加这样的填充(类似SO问题here):

cipher.padding = 0

错误消失了,但我得到了胡言乱语。

1 个答案:

答案 0 :(得分:2)

即使您将密钥(secret)传递给加密&解密函数,您将使用下面提到的代码重新定义密钥。

key = cipher.random_key

你应该使用相同的密钥加密和放大解密。 请尝试以下代码段:

require 'openssl'

class String
  def encrypt(key)
    cipher = OpenSSL::Cipher.new('DES-EDE3-CBC').encrypt
    cipher.key = (Digest::SHA1.hexdigest key)[0..23]
    s = cipher.update(self) + cipher.final

    s.unpack('H*')[0].upcase
  end

  def decrypt(key)
    cipher = OpenSSL::Cipher.new('DES-EDE3-CBC').decrypt
    cipher.key = (Digest::SHA1.hexdigest key)[0..23]
    s = [self].pack("H*").unpack("C*").pack("c*")

    cipher.update(s) + cipher.final
  end
end



puts plain = 'confidential'           # confidential
puts key = 'secret'                   # secret
puts cipher = plain.encrypt(key)      # 5C6D4C5FAFFCF09F271E01C5A132BE89


puts cipher.decrypt(key)              # confidential