2010-01-11 4 views
3

Mon serveur RoR reçoit une chaîne, qui a été chiffré en application C++ en utilisant des3 avec Base64décryptage DES3 en Ruby on Rails

L'objet de chiffrement est créé pour:

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

key_str et iv_str: sont représentations en chaîne de la clé et du vecteur d'initialisation pour l'algorithme de chiffrement. Ils sont identiques pour les applications RoR et C++.

Le code du côté RoR suit:

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

Après l'exécution de la dernière ligne de code, je reçois une exception

OpenSSL::CipherError (bad decrypt) 

Quel est le problème ici? Des idées ?

+0

dernière ligne? quel est le chiper variable? un objet AR? aussi qu'est-ce que la méthode finale? – makevoid

+0

Comme le dit ce tutoriel, http://olabini.com/blog/2008/08/ruby-security-quick-guide/ "Enfin, vous devez appeler final pour obtenir le dernier texte chiffré généré" Je suppose, que cette méthode est simmilar pour vider la méthode pour les flux. – AntonAL

Répondre

14

La documentation pour OpenSSL::Cipher états:

Assurez-vous d'appeler .encrypt ou .decrypt avant d'utiliser l'une des méthodes suivantes:

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

Dans votre cas spécifique, en omettant l'appel à cipher.decrypt provoque une erreur bad decrypt, comme vous l'avez vu.

L'exemple suivant corrige ce problème et présente le comportement attendu:

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 

Elle enveloppe la bibliothèque standard OpenSSL Ruby et vous permet d'utiliser l'un de ses algorithmes.

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