rails openssl отличает результаты шифрования от кода и терминала - PullRequest
0 голосов
/ 29 августа 2018

когда я пытаюсь зашифровать данные с терминала, как

echo -n "TestData" | openssl enc -aes-256-cbc -a -K C81E728D9D4C2F636F067F89CC14862C65990ABE58735B91B6B8798E8CE45F22 -iv D342F9C6310F6B21E97AB38595BD8CAA

чем получен кодированный в Base64 результат

VJwJBTtVntJvRGkD24S4wg ==

Но когда я пробую то же самое с рельсами, использующими точно такой же ключ и вектор инициализации

    cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc')
    cipher.encrypt
    cipher.key = "C81E728D9D4C2F636F067F89CC14862C65990ABE58735B91B6B8798E8CE45F22"
    cipher.iv = "D342F9C6310F6B21E97AB38595BD8CAA"
    encrypted_data = cipher.update("TestData")
    encrypted_data << cipher.final
    Base64.strict_encode64(encrypted_data)

чем я получаю совершенно другой результат в кодировке Base64

qavpNrU7llgauAyyEZz / мт ==

Может кто-то указать, что я пропустил?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Вы предоставляете атрибуты key и iv в виде шестнадцатеричных строк, но ожидаемый формат - необработанные байты. Преобразование их в двоичный код дает ожидаемый результат с помощью следующего сценария:

require 'openssl'
require 'base64'

def hex_to_bin(s)
 s.scan(/../).map { |x| x.hex.chr }.join
end

cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc')
cipher.encrypt
cipher.key = hex_to_bin("C81E728D9D4C2F636F067F89CC14862C65990ABE58735B91B6B8798E8CE45F22")
cipher.iv = hex_to_bin("D342F9C6310F6B21E97AB38595BD8CAA")
encrypted_data = cipher.update("TestData")
encrypted_data << cipher.final
puts Base64.strict_encode64(encrypted_data)

(Источник для функции hex_to_bin: К шестнадцатеричному и обратно (с рубином) ).

Называя его encrypt.rb, это результат его запуска:

$ ruby encrypt.rb 
encrypt.rb:8: warning: constant OpenSSL::Cipher::Cipher is deprecated
VJwJBTtVntJvRGkD24S4wg==

Чтобы избавиться от предупреждения "устарело", мне пришлось заменить устаревший класс OpenSSL::Cipher::Cipher на OpenSSL::Cipher.

0 голосов
/ 29 августа 2018

Ключ короткий, 98304A2480DDC0FA354278936DAC2A0D7D9074650AD6 - это неверный размер ключа, ключи AES имеют длину 128, 192 или 256 бит (16, 24 или 32 байта). Поскольку кажется, что ключ должен быть 256-битным (32-байтовым), отсутствующие байты ключа будут либо мусором, либо, возможно, пустыми, расширение ключа не определено. При этом разные результаты.

Если допустить нулевое заполнение и заполнение PKCS # 7 для первого случая, результат будет правильным: AESCALC

Второй пример - заполнение ключа в каком-нибудь другом поместье.

Решение состоит в том, чтобы использовать ключ полной длины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...