ruby河豚的最后数字差异

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

UPDATE

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

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

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

这是它的样子:

 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 

您可以使用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 

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