0

我有一些来自 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"

4

3 回答 3

3

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

于 2011-08-25T11:46:22.253 回答
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
于 2011-08-31T13:58:46.960 回答
0

您可以像这样简单地使用 ecb 密码模式进行河豚加密:

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

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

于 2011-09-23T15:02:57.880 回答