Расшифровка DES3 в Ruby on Rails - PullRequest
3 голосов
/ 11 января 2010

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

Объект шифрования создан так:

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)

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

Ответы [ 2 ]

14 голосов
/ 11 января 2010

Документация для 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 голос
/ 08 марта 2010
gem install encryptor

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

require 'encryptor'
Base64.decode64(message).decrypt(:algorithm => 'des', :key => key, :iv => iv)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...