2012-11-05 1 views
3

Я начинаю со следующего кода шифрования C# и хочу расшифровать с помощью Ruby. Моя проблема в том, что я не знаю, как установить режим заполнения в Ruby/OpenSSL. Мне нужно использовать PKCS7.Как установить режим заполнения с расшифровкой/шифрованием Ruby/OpenSSL?

C# шифрования

System.Security.Cryptography.Aes c = new System.Security.Cryptography.AesManaged(); 
c.Mode = CipherMode.CBC; 
c.Padding = PaddingMode.PKCS7; # <-- how to set this in Ruby world? 
c.KeySize = 256; 
c.BlockSize = 128; 
c.Key = key; 
c.IV = iv; 
... 

Рубин дешифрования

d = OpenSSL::Cipher.new('AES-128-CBC') # oops, this should have been AES-256-CBC 
d.decrypt 
d.key = key 
d.iv = iv 
... 

настоящее время я использую Ruby 1.9.2, но может использовать любую версию необходимо.

ответ

3

Параметр конструктора фактически читает <name>-<key length>-<mode>, поэтому, прежде всего, вы, вероятно, захотите использовать AES-256-CBC, чтобы использовать 256-битный ключ. [source]

Размер блока AES фиксирован на 128 бит в любом случае, поэтому вам не нужно настраивать этот параметр. [source]

Кроме того, похоже, что Ruby использует PKCS7 Padding по умолчанию, поэтому нет необходимости корректировать это. [source]

Таким образом, вы должны быть хорошо идти только с

c = OpenSSL::Cipher.new('AES-256-CBC') 
c.key = key 
c.iv = iv 
+0

Спасибо за ваш ответ. Я изменил шифр, как вы предложили, и расшифровка * кажется * успешной, хотя я пока не могу подтвердить это, поскольку у меня возникают проблемы с раздуванием дешифрованных данных (возможно, проблемы между 'C#' и 'Ruby' re: 'Zlib', сдувание и раздувание). Во всяком случае, что касается заполнения Ruby по умолчанию, я нашел [ответ SO, говорящий, что PKCS5 по умолчанию] (http://stackoverflow.com/a/12611287/664833). [Документация] (http://www.ruby-doc.org/stdlib-1.9.2/libdoc/openssl/rdoc/OpenSSL/Cipher.html) неактуален об этой детали (или, по крайней мере, я ее не нашел). – user664833

+1

Статья в вики на дополнении говорит: «Заполнение PKCS5 - это то же самое, что и PKCS7, за исключением того, что технически его можно использовать только для колодок с 64-битными блоками. На практике эти два используются взаимозаменяемо». (http://en.wikipedia.org/wiki/Padding_(cryptography)). Таким образом, AES не может использовать дополнение PKCS5 по определению, поскольку размер блока фиксирован до 128 (> 64) –

+1

Тем не менее это будет полезно для некоторых людей (например, me), если этот ответ обновлен, чтобы указать, как указать заполнение и другие параметры в рубине. Спасибо за ваш ответ –