2013-04-12 4 views
1

Je suis capable de crypter des fichiers, mais lorsque j'essaie de les déchiffrer, je reçois un "fichier d'entrée de lecture d'erreur". J'utilise une paire de clés publique/privée pour crypter la phrase secrète utilisée pour crypter le fichier. C'est ainsi que seul le propriétaire de la clé privée est capable de déchiffrer le fichier.Ruby OpenSSL impossible de décrypter

Ma méthode de cryptage utilise le module OpenSSL Ruby et ressemble à:

file = params[:submission][:report].path 
filename = params[:submission][:report].original_filename.gsub(" ", "_") 

pubkey = OpenSSL::PKey::RSA.new File.read "#{Rails.root.to_s}/key/pubkey.pem" 
cipher = OpenSSL::Cipher.new("aes-256-cbc") 
cipher.encrypt 
cipher.key = key = (0...50).map{ ('a'..'z').to_a[rand(26)] }.join 

buf = "" 
File.open("#{Rails.root.to_s}/evidence/#{filename}.enc", "wb") do |outf| 
    File.open(file, "rb") do |inf| 
    while inf.read(4096, buf) 
     outf << cipher.update(buf) 
    end 
    outf << cipher.final 
    end 
end 

encrypted_key = pubkey.public_encrypt key 
File.open("#{Rails.root.to_s}/evidence/#{filename}_passphrase.bin", 'wb') {|f| f.write(encrypted_key) } 

Je me sers OpenSSL dans un environnement Linux pour gérer le décryptage

openssl rsautl -in file_passphrase.bin -out passphrase.txt -inkey privkey.pem -decrypt 
openssl enc -a -d -aes-256-cbc -in file.enc -out file.pdf -pass file:passphrase.txt 

J'ai aussi essayé d'utiliser un sel , le chiffrer/décrypter le même que la phrase secrète, et j'obtiens la même erreur.

Qu'est-ce que je fais mal ici?

Merci

Répondre

0

Pas exactement une solution, mais cela fonctionne. Au lieu du module OpenSSL, je suis juste en utilisant les commandes du système:

file = params[:submission][:report].path 
filename = params[:submission][:report].original_filename.gsub(" ", "_") 
passphrase = (0...50).map{ ('a'..'z').to_a[rand(26)] }.join 
system("openssl enc -a -e -aes-256-cbc -in #{file} -out #{Rails.root.to_s}/evidence/#{filename}.asc -pass pass:#{passphrase}") 
system("echo #{passphrase} | openssl rsautl -out #{Rails.root.to_s}/evidence/#{filename}_password.bin -pubin -inkey #{Rails.root.to_s}/key/pubkey.pem -encrypt") 

Ensuite, en utilisant la même méthode de décryptage comme dans la question.

0

Votre fichier crypté est encodé en fichier base64. Si les lignes sont plus longs que 64 caractères, alors openssl a un problème en annulant l'encodage en base64 et imprime l'erreur en lisant le fichier d'entrée. Je ne suis pas sûr que le problème existe avec toutes les versions d'openssl ou non.

Deux solutions viennent à l'esprit:

  • base64 décode d'abord le fichier avec un autre utilitaire, puis exécutez la commande openssl enc sans le commutateur -a
  • insérer un saut de ligne après tous les 64 caractères dans le crypté et base64 fichier encodé (fichier.enc dans votre exemple)
Questions connexes