Search code examples
rubyencryptionopensslblowfish

Ruby blowfish difference in the last digits


I have some testdata key/text/encrypted from an API provider and am now trying to yield the same encrypted result with the function below, but my result diverts from the provided one in the last 16 of 241 digits. Do you have an idea, what the reason may be? I ensured, that 'bf-ecb' is the right mode, and experimented with url-encoding, but so far without success.

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

Also trying to decrypt the example result results in an OpenSSL::Cipher::CipherError "bad decrypt"


Solution

  • It was indeed a problem with the padding. I worked around it with deactivating it and implementing it by myself. So far it works.

    This is how it looks like:

    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