Рубиновая разница в последних цифрах - PullRequest
0 голосов
/ 25 августа 2011

У меня есть некоторый ключ / текст / зашифрованных тестовых данных от поставщика API, и сейчас я пытаюсь получить тот же зашифрованный результат с помощью функции, указанной ниже, но мой результат отличается от предоставленного в последних 16 из 241 цифр.У вас есть идея, в чем может быть причина?Я гарантировал, что '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"

Ответы [ 3 ]

3 голосов
/ 25 августа 2011

Если ваши последние 16 цифр (= 128 бит) неверны, то, вероятно, проблема в последнем блоке. Возможно, это проблема заполнения, ваше шифрование использует одну из форм заполнения, в то время как расшифровка ожидает другое заполнение. Я предлагаю вам явно указать отступы с обеих сторон. PKCS5 или PKCS7 являются обычным выбором. Неисправное заполнение также объясняет сообщение об ошибке «плохая расшифровка».

1 голос
/ 31 августа 2011

Это была действительно проблема с заполнением.Я работал над этим, деактивировав и реализовав его самостоятельно.Пока это работает.

Вот как это выглядит:

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
0 голосов
/ 23 сентября 2011

Вы можете просто выполнить шифрование blowfish с помощью режима шифрования ecb, например, так:

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

И в этом случае вам не нужно заботиться о заполнении.

...