红宝石河豚的最后数字差异

时间:2011-08-25 11:15:18

标签: ruby encryption openssl blowfish

我有一些来自API提供商的testdata密钥/文本/加密,现在我尝试使用下面的函数产生相同的加密结果,但是我的结果从241位数的最后16位中提供的结果转移。你有什么想法,原因是什么? 我确信,'bf-ecb'是正确的模式,并尝试使用url编码,但到目前为止还没有成功。

require 'openssl'

def encrypt(key, data)
    cipher = OpenSSL::Cipher::Cipher.new('bf-ecb').send(:encrypt)
    cipher.key = key
    result = cipher.update(data) << cipher.final

    hexed = ''
    result.each_byte { |c| hexed << '%02x' % c }
    hexed.upcase
end

更新

同时尝试解密示例结果导致OpenSSL :: Cipher :: CipherError“bad decrypt”

3 个答案:

答案 0 :(得分:3)

如果您的最后16位数(= 128位)不正确,则可能是最后一个块出现问题。可能这是填充的问题,您的加密使用一种填充形式,而您的解密期望填充不同。我建议您明确指定两侧的填充。 PKCS5或PKCS7是通常的选择。填充错误也将解释“错误解密”错误消息。

答案 1 :(得分:1)

填充确实存在问题。我解决了这个问题,并将其停用并自行实施。 到目前为止它的确有效。

这就是它的样子:

require 'openssl'

def encrypt(key,data)
  cipher = OpenSSL::Cipher::Cipher.new "bf-ecb"
  cipher.padding = 0
  cipher.key = key
  cipher.encrypt
  enhex(cipher.update padd data)
end
def decrypt(key,data,len)
  cipher = OpenSSL::Cipher::Cipher.new "bf-ecb"
  cipher.padding = 0
  cipher.key = key
  cipher.decrypt
  (cipher.update dehex(data)).slice(0,len)
end
def enhex(data)
  hexed = ''
  data.each_byte { |c| hexed << '%02x' % c }
  hexed.upcase
end
def dehex(data)
  data.scan(/../).map{ |b| b.to_i(16) }.pack('C*')
end 
def padd(data)
  data + " "*(8 - (data.length % 8))
end

答案 2 :(得分:0)

您可以使用ecb密码模式简单地执行blowfish加密:

def blowfish_encrypt(key,data)
  cipher = OpenSSL::Cipher::Cipher.new("bf-ecb").send :encrypt
  cipher.key = key
  cipher.update(data) << cipher.final
end

在这种情况下你不需要关心填充。