Командная строка OpenSSL и библиотека Ruby OpenSSL отличаются при использовании одинаковых параметров для шифрования текста - PullRequest
2 голосов
/ 19 сентября 2011

Примечание. Использование OpenSSL для симметричного шифрования текста.

Я создал скрипт Ruby для тестирования OpenSSL и обнаружил, что получаю разные результаты. Ключ, iv и шифры идентичны, поэтому я ожидаю, что результаты будут идентичны. Но это не так. Вот мой сценарий:

require 'openssl'
require 'base64'

key = "00000000000000000000000000000000"
iv = "00000000000000000000000000000000"

### OPENSSL Command Line ###
puts "*** OpenSSL Command Line ***"
print "Encrypted via Command Line:  "
string = `printf %s \"Hello\" | openssl enc -aes-128-cbc -K #{key} -iv #{iv} -base64`

puts string
puts string.inspect

print "Decrypted Data is:  "
puts `printf %s \"BC2+AQJ6ZQx0al3GXba+EQ==\n\" | openssl enc -d -aes-128-cbc -K #{key} -  iv #{iv} -base64`
puts "\n"

### Ruby OpenSSL Library ###
puts "*** OpenSSL Ruby Library ***"

cipher = OpenSSL::Cipher.new('aes-128-cbc').encrypt
cipher.padding = 1
cipher.key = key
cipher.iv = iv

encrypted_data = cipher.update("Hello")
encrypted_data << cipher.final
encrypted_data = Base64.encode64(encrypted_data)
puts "Encrypted via Ruby is: #{encrypted_data}"
puts encrypted_data.inspect

decipher = OpenSSL::Cipher.new('aes-128-cbc').decrypt
decipher.key = key
decipher.iv = iv

data = decipher.update(Base64.decode64(encrypted_data))
data << decipher.final
puts "Decrypted Data:  #{data}"

Результаты:

*** OpenSSL Command Line ***
Encrypted via Command Line:  BC2+AQJ6ZQx0al3GXba+EQ==
"BC2+AQJ6ZQx0al3GXba+EQ==\n"
Decrypted Data is:  Hello

*** OpenSSL Ruby Library ***
Encrypted via Ruby is: ZkeNEgsUXi1J7ps6kCQxdQ==
"ZkeNEgsUXi1J7ps6kCQxdQ==\n"
Decrypted Data:  Hello

Просто любопытный результат. Любая идея, что заставляет данные отличаться?

Ответы [ 2 ]

0 голосов
/ 16 ноября 2015

Упакуйте их в двоичную (шестнадцатеричную) последовательность, чтобы исправить это. Тест на моей машине (Mac ox 10.11.1 ruby-2.2.3).

cipher.key = ["#{key}"].pack('H*')
cipher.iv = ["#{iv}"].pack('H*')

Рубиновые пакеты

decipher.key = ["#{key}"].pack('H*')
decipher.iv = ["#{iv}"].pack('H*')
0 голосов
/ 19 сентября 2011

Просто предположение, не зная интерфейса OpenSSL в Ruby:

Вы даете ключи и вектор инициализации командной строке OpenSSL в шестнадцатеричном кодировании.Например, ваш ключ и вектор инициализации 0x000....

Я полагаю, ваша библиотека Ruby принимает ключ и вектор инициализации в виде двоичных данных, например, вы фактически передаете ключ и вектор инициализации, состоящий из 0x30303030... (при условии ASCIIили что-нибудь совместимое с ним) вместо 0x00000....

...