web-dev-qa-db-fra.com

Comment chiffrer un fichier volumineux dans openssl à l'aide d'une clé publique

Comment puis-je chiffrer un fichier volumineux avec une clé publique afin que personne d'autre que celui qui possède la clé privée ne puisse le déchiffrer?

Je peux créer des clés publiques et privées RSA, mais lorsqu'il s'agit de chiffrer un fichier volumineux à l'aide de cette commande:

openssl rsautl -encrypt -pubin -inkey public.pem -in myLargeFile.xml -out myLargeFile_encrypted.xml

et comment puis-je effectuer le décryptage aussi ....

je crée ma clé privée et publique à l'aide des commandes suivantes

openssl genrsa -out private.pem 1024
openssl rsa -in private.pem -out public.pem -outform PEM -pubout

Je reçois cette erreur:

RSA operation error
3020:error:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too large for key size:.\crypto\rsa\rsa_pk1.c:151:

J'ai essayé de faire des clés avec des tailles de 1024 à 1200 bits, pas de chance, même erreur

68
yamuna mathew

La crypto à clé publique ne permet pas de crypter des fichiers de longueur arbitraire. On utilise un chiffrement symétrique (disons AES) pour effectuer le chiffrement normal. Chaque fois qu'une nouvelle clé symétrique aléatoire est générée, utilisée, puis chiffrée avec le chiffrement RSA (clé publique). Le texte chiffré ainsi que la clé symétrique chiffrée sont transférés au destinataire. Le destinataire décrypte la clé symétrique à l'aide de sa clé privée, puis utilise la clé symétrique pour déchiffrer le message.

La clé privée n'est jamais partagée, seule la clé publique est utilisée pour chiffrer le chiffrement symétrique aléatoire.

74
n.m.

Solution permettant de coder de manière sécurisée et hautement sécurisée le fichier de n'importe qui dans OpenSSL et en ligne de commande:

Vous devriez avoir prêt un certificat X.509 pour chiffrer des fichiers au format PEM.

Crypter le fichier:

openssl smime -encrypt -binary -aes-256-cbc -in plainfile.Zip -out encrypted.Zip.enc -outform DER yourSslCertificate.pem

Qu'est-ce que c'est:

  • smime - commande ssl pour l'utilitaire S/MIME ( smime (1) )
  • - chiffrer - méthode choisie pour le traitement des fichiers
  • - binaire - utilise un processus de fichier sécurisé. Normalement, le message d'entrée est converti au format "canonique" comme l'exige la spécification S/MIME, ce commutateur le désactive. Il est nécessaire pour tous les fichiers binaires (comme les images, les sons, les archives Zip).
  • - aes-256-cbc - chiffrement choisi AES en 256 bits pour le chiffrement (fort). Si non spécifié, 40 bits RC2 est utilisé (très faible). ( Chiffres supportés )
  • - dans plainfile.Zip - nom du fichier d'entrée
  • - out encrypted.Zip.enc - nom du fichier de sortie
  • - outform DER - encoder le fichier de sortie en binaire. Si n'est pas spécifié, le fichier est codé en base64 et sa taille sera augmentée de 30%.
  • yourSslCertificate.pem - nom du fichier de votre certificat. Cela devrait être au format PEM.

Cette commande peut très efficacement chiffrer de gros fichiers quel que soit leur format.
Problème connu: Un problème se produit lorsque vous essayez de chiffrer un fichier volumineux (> 600 Mo). Aucune erreur renvoyée, mais le fichier crypté sera corrompu. Toujours vérifier chaque fichier! (ou utilisez PGP - qui prend davantage en charge le chiffrement de fichiers avec une clé publique)

Décrypter le fichier:

openssl smime -decrypt -binary -in encrypted.Zip.enc -inform DER -out decrypted.Zip -inkey private.key -passin pass:your_password

Qu'est-ce que c'est:

  • - informez DER - comme pour -outform ci-dessus
  • - inkey private.key - nom du fichier de votre clé privée. Cela devrait être au format PEM et peut être chiffré par mot de passe.
  • - passin pass: your_password - votre mot de passe pour le chiffrement de la clé privée. ( arguments de phrase secrète )
70
JakubBoucek

Vous ne pouvez pas chiffrer directement un fichier volumineux avec rsautl. faites plutôt quelque chose comme ceci:

  1. Générez une clé en utilisant openssl Rand, par exemple. openssl Rand 32 -out keyfile
  2. Chiffrer le fichier de clé avec openssl rsautl
  3. Chiffrer les données en utilisant openssl enc, en utilisant la clé générée à l’étape 1.
  4. Compressez le fichier de clé crypté avec les données cryptées. le destinataire devra déchiffrer la clé avec sa clé privée, puis déchiffrer les données avec la clé obtenue.
30
Hasturkun

Il est déconseillé de chiffrer un très gros fichier à l'aide de smime, car vous pourriez peut-être chiffrer des fichiers volumineux à l'aide de l'option -stream, mais pas déchiffrer le fichier résultant en raison de limitations matérielles voir: problème de déchiffrement de gros fichiers

Comme mentionné ci-dessus, la cryptographie à clé publique ne permet pas de crypter des fichiers de longueur arbitraire. Par conséquent, les commandes suivantes génèrent une phrase de passe, chiffrent le fichier à l'aide d'un chiffrement symétrique, puis chiffrent la phrase de passe à l'aide de la clé asymétrique (clé publique). Remarque: smime comprend l'utilisation d'une clé publique primaire et d'une clé de sauvegarde pour chiffrer la phrase secrète. Une paire de clés publique/privée de sauvegarde serait prudente.

Génération de mot de passe aléatoire

Configurez la valeur RANDFILE dans un fichier accessible par l'utilisateur actuel, générez le fichier passwd.txt et nettoyez les paramètres.

export OLD_RANDFILE=$RANDFILE
RANDFILE=~/Rand1
openssl Rand -base64 2048 > passwd.txt
rm ~/Rand1
export RANDFILE=$OLD_RANDFILE

Cryptage

Utilisez les commandes ci-dessous pour chiffrer le fichier en utilisant le contenu de passwd.txt comme mot de passe et AES256 dans un fichier base64 (option -a). Chiffrez le fichier passwd.txt à l'aide du cryptage asymétrique dans le fichier XXLarge.crypt.pass à l'aide d'une clé publique principale et d'une clé de sauvegarde.

openssl enc -aes-256-cbc -a -salt -in XXLarge.data -out XXLarge.crypt -pass file:passwd.txt
openssl smime -encrypt -binary -in passwd.txt -out XXLarge.crypt.pass -aes256 PublicKey1.pem PublicBackupKey.pem
rm passwd.txt

Décryptage

Le déchiffrement décrypte simplement XXLarge.crypt.pass en passwd.tmp, déchiffre XXLarge.crypt en XXLarge2.data et supprime le fichier passwd.tmp.

openssl smime -decrypt -binary -in XXLarge.crypt.pass -out passwd.tmp -aes256 -recip PublicKey1.pem -inkey PublicKey1.key
openssl enc -d -aes-256-cbc -a -in XXLarge.crypt -out XXLarge2.data -pass file:passwd.tmp
rm passwd.tmp

Cela a été testé contre> 5 Go de fichiers ..

5365295400 Nov 17 10:07 XXLarge.data
7265504220 Nov 17 10:03 XXLarge.crypt
      5673 Nov 17 10:03 XXLarge.crypt.pass
5365295400 Nov 17 10:07 XXLarge2.data
22
Ipswitch

J'ai trouvé les instructions sur http://www.czeskis.com/random/openssl-encrypt-file.html utiles.

Pour paraphraser le site lié avec les noms de fichiers de votre exemple:

Générez une clé symétrique car vous pouvez chiffrer des fichiers volumineux

openssl Rand -base64 32 > key.bin

Chiffrer le fichier volumineux à l'aide de la clé symétrique

openssl enc -aes-256-cbc -salt -in myLargeFile.xml \
  -out myLargeFile.xml.enc -pass file:./key.bin

Chiffrer la clé symétrique afin de pouvoir l'envoyer en toute sécurité à l'autre personne

openssl rsautl -encrypt -inkey public.pem -pubin -in key.bin -out key.bin.enc

Détruire la clé symétrique non chiffrée pour que personne ne la trouve

shred -u key.bin

À ce stade, vous envoyez la clé symétrique chiffrée (key.bin.enc) et le gros fichier crypté (myLargeFile.xml.enc) à l'autre personne

L’autre personne peut alors déchiffrer la clé symétrique avec sa clé privée à l’aide de

openssl rsautl -decrypt -inkey private.pem -in key.bin.enc -out key.bin

Maintenant, ils peuvent utiliser la clé symétrique pour déchiffrer le fichier

openssl enc -d -aes-256-cbc -in myLargeFile.xml.enc \
  -out myLargeFile.xml -pass file:./key.bin

Et tu as fini. L'autre personne a le fichier déchiffré et il a été envoyé en toute sécurité.

16
Tom Saleeba

Pour chiffrer en toute sécurité des fichiers volumineux (> 600 Mo) avec openssl smime vous devrez diviser chaque fichier en petits morceaux:

# Splits large file into 500MB pieces
split -b 500M -d -a 4 INPUT_FILE_NAME input.part.

# Encrypts each piece
find -maxdepth 1 -type f -name 'input.part.*' | sort | xargs -I % openssl smime -encrypt -binary -aes-256-cbc -in % -out %.enc -outform DER PUBLIC_PEM_FILE

Pour des raisons d’information, voici comment décrypter et assembler toutes les pièces:

# Decrypts each piece
find -maxdepth 1 -type f -name 'input.part.*.enc' | sort | xargs -I % openssl smime -decrypt -in % -binary -inform DEM -inkey PRIVATE_PEM_FILE -out %.dec

# Puts all together again
find -maxdepth 1 -type f -name 'input.part.*.dec' | sort | xargs cat > RESTORED_FILE_NAME
3
Phellipe Kelbert

Peut-être devriez-vous consulter la réponse acceptée à cette question ( Comment chiffrer des données en php avec des clés publiques/privées? ).

Au lieu de contourner manuellement la limitation de taille de message (ou peut-être un trait) de RSA, il montre comment utiliser la fonctionnalité S/mime de OpenSSL pour faire la même chose sans avoir à jongler manuellement avec la clé symétrique.

2
Cray