2013-07-26 3 views
0

Я использую следующий код в моем приложении за прошедший год и имею 200k записи, используя этот код:Как сделать рефакторинг OpenSSL pkcs5_keyivgen в рубине?

options = { :algorithm => 'aes-256-cbc', :value => "changethis", :key => "secretkey" } 
cipher = OpenSSL::Cipher::Cipher.new(options[:algorithm]) 
cipher.send(:encrypt)  
cipher.pkcs5_keyivgen(options[:key]) 
result = cipher.update(options[:value]) 
result << cipher.final 
# => "x\xED\x14s\xFD\x0E\x97\xC5\x996[M\x1E\x94\xDEI" 

Я обязан (бизнес) реорганизовать pkcs5_keyivgen части, чтобы сделать это правильно: Для Например,

options = { :algorithm => 'aes-256-cbc', :value => "changethis", :key => "secretkey" } 
cipher = OpenSSL::Cipher::Cipher.new(options[:algorithm]) 
cipher.send(:encrypt) 
cipher.key = '' # ??? 1) How does pkcs5_keyivgen in above code generate key, or does it just use my options[:key] 
cipher.iv = '' # ??? 2) How does pkcs5_keyivgen in above code generate iv 
result = cipher.update(options[:value]) 
result << cipher.final 

Я должен выяснить, как pkcs5_keyivgen наборы key и iv. идеи здесь? Мы используем ruby-1.9.3-p286 и encryptor-1.1.3

Я видел this question и this question, но они не помогли мне решить проблему.

+0

Я не уверен, почему это предлагается закрыть? Это вопрос программирования? не могли бы вы дать отзыв, почему вы downvote, так что я могу улучшить вопрос. Спасибо. – Kamilski81

ответ

3

пытался решить эту проблему, но я думаю, что нет простого решения или я просто не могу ее увидеть). Pkcs5_keyivgen() устарела и реализует нестандартные пасс ключ деривации для AES 256.

Из этого docs и это source code

Pkcs5_keyivgen (pass, SALT = nil, num = 2048, digest = "MD5") -> nil 

Формирует некоторый ключ и IV от соли и пройти. Никакой соли в вашем случае. Метод генерации определен в v1.5 PKCS #5 (устаревший)

Итак, вы ищете «Функция определения ключа на основе пароля». PBKDF1

Pkcs5_keyivgen() функция вызывает EVP_BytesToKey() из OpenSSL и EVP_BytesToKey() генерирует ключевые байты для увеличения размера ключа в non-standard way

Так MD5 генерирует хэш размера EVP_MAX_MD_SIZE (16 + 20) // 16 для MD5

Но AES key(32) + IV(16) sizes > EVP_MAX_MD_SIZE, так AES 256 потребуется несколько хэшей для генерации случайного ключа и IV. Вот source code алгоритма в C

А вот хороший pseudo-code explanation из EVP_BytesToKey()

Если вы действительно хотите повторно реализовать PBKDF1 здесь также RTC2898 standard for PBKDF1 Но я не думаю, что это хорошая идея реализовать криптографию

+0

Удивительная обратная связь. Истинная причина, по которой я пытаюсь изменить это, заключается в том, что мне также нужно использовать его в программе Python и звучать так, как будто мне, возможно, придется повторно реализовать мой рубин стандартным образом, а затем сделать это на питоне стандартным способом. – Kamilski81

+0

[OpenSSL 1.1.0c изменил алгоритм дайджеста] (http://stackoverflow.com/q/39637388/608639), используемый в некоторых внутренних компонентах. Раньше использовался MD5, а 1.1.0 - SHA256. Будьте осторожны, это изменение не влияет на вас как в EVP_BytesToKey, так и в командах типа 'openssl enc'. – jww

Смежные вопросы