我有一些来自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”
答案 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
在这种情况下你不需要关心填充。