2010-01-11 1 views
3

Мой RoR сервер получает строку, которая была зашифрована в приложении C++ с использованием des3 с base64 кодированияDES3 дешифрования в Рубин на рельсы

Шифр ​​объект создается так:

cipher = OpenSSL::Cipher::Cipher::new("des3") 
cipher.key = key_str 
cipher.iv = iv_str 

key_str и iv_str: есть строковые представления ключа и вектора инициализации для алгоритма шифрования. Они одинаковы для приложений RoR и C++.

код на стороне RoR выглядит следующим образом:

result = "" 
result << cipher.update(Base64.decode64(message)) 
result << cipher.final 

После выполнения последней строки кода, я получаю исключение

OpenSSL::CipherError (bad decrypt) 

Что здесь не так? Есть идеи ?

+0

последняя линия? что такое переменная? объект AR? также, что делает окончательный метод? – makevoid

+0

Как говорится в этом учебнике, http://olabini.com/blog/2008/08/ruby-security-quick-guide/ «Наконец, вам нужно позвонить в финал, чтобы получить последний сгенерированный текст шифрования» Я полагаю, что это метод близок к методу flush для потоков. – AntonAL

ответ

14

Документация OpenSSL::Cipher состояний:

Обязательно позовите .encrypt или .decrypt перед использованием любого из следующих методов:

  • [key=, iv=, random_key, random_iv, pkcs5_keyivgen]

В вашем конкретном случае отказ от вызова cipher.decrypt вызывает ошибку bad decrypt, как вы видели.

Следующий пример исправляет эту проблему и показывает ожидаемое поведение:

require 'openssl' 
require 'Base64' 

# For testing purposes only! 
message = 'MyTestString' 
key = 'PasswordPasswordPassword' 
iv = '12345678' 

# Encrypt plaintext using Triple DES 
cipher = OpenSSL::Cipher::Cipher.new("des3") 
cipher.encrypt # Call this before setting key or iv 
cipher.key = key 
cipher.iv = iv 
ciphertext = cipher.update(message) 
ciphertext << cipher.final 

puts "Encrypted \"#{message}\" with \"#{key}\" to:\n\"#{ciphertext}\"\n" 

# Base64-encode the ciphertext 
encodedCipherText = Base64.encode64(ciphertext) 

# Base64-decode the ciphertext and decrypt it 
cipher.decrypt 
plaintext = cipher.update(Base64.decode64(encodedCipherText)) 
plaintext << cipher.final 

# Print decrypted plaintext; should match original message 
puts "Decrypted \"#{ciphertext}\" with \"#{key}\" to:\n\"#{plaintext}\"\n\n" 
1
gem install encryptor 

Он оборачивает стандартную библиотеку OpenSSL рубина и позволяет использовать любого из своих алгоритмов.

require 'encryptor' 
Base64.decode64(message).decrypt(:algorithm => 'des', :key => key, :iv => iv) 

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

  • Нет связанных вопросов^_^