Comment chiffrer un gros fichier dans openssl en utilisant la clé publique

Comment puis-je chiffrer un gros fichier avec une clé publique pour que personne d'autre que celui qui a la clé privée ne puisse le déchiffrer?

je peux faire des clés RSA publiques et privées mais quand il s'agit de chiffrer un grand fichier en utilisant cette commande:

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

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

je crée ma clé privée et publique, par les commandes suivantes

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

je comprends erreur:

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

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

60
demandé sur Noam M 2011-08-22 09:29:34

7 réponses

la cryptographie à clé publique n'est pas destinée au cryptage de fichiers arbitrairement longs. On utilise un chiffrement symétrique (disons AES) pour effectuer le chiffrement normal. Chaque fois qu'une nouvelle clé aléatoire symétrique 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échiffre la clé symétrique à l'aide de sa clé privée, puis utilise la clé symétrique pour déchiffrer le message.

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

69
répondu n.m. 2014-03-04 21:47:53

Solution pour encoder en toute sécurité et en toute sécurité n'importe qui fichier dans OpenSSL et ligne de commande:

vous devriez avoir préparé quelques certificats X. 509 pour chiffrer les 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:

  • smime - commande ssl pour s/MIME utility ( smime(1) )
  • - encrypt - méthode choisie pour le traitement des fichiers
  • - binaire - utiliser un processus de fichier sûr. Normalement, le message d'entrée est converti en 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 des images, des sons, des archives ZIP).
  • - AES-256-cbc - AES de chiffrement choisi en 256 bits pour le chiffrement (fort.) Si ce n'est pas spécifié, RC2 40 bits est utilisé (très faible). ( ciphers supportés )
  • -dans plainfile.zip - nom de fichier d'entrée
  • - crypté.zip.enc - nom du fichier de sortie
  • - outform DER - encoder le fichier de sortie en binaire. Si ce n'est pas spécifié, le fichier est encodé par base64 et la taille du fichier sera augmentée de 30%.
  • votre certificat.pem - nom de fichier de votre certificat. Ça devrait être au format PEM.

cette commande peut très efficacement crypter de gros fichiers quel que soit leur format.

numéro connu: Quelque chose de mal se produit lorsque vous essayez de chiffrer le fichier énorme (>600MB). Pas d'erreur, mais le fichier crypté sera corrompu. Vérifiez toujours chaque fichier! (ou utilisez PGP-qui a plus grand le support pour les fichiers de chiffrement à clé publique)

fichier de décryptage:

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

Qu'est-ce que:

  • -informer DER - idem-outform ci-dessus
  • -inkey privé.la touche - nom de fichier de votre clé privée. Il doit être au format PEM et peut être crypté par mot de passe.
  • - passin pass: votre_password - votre mot de passe pour le cryptage des clés privées. ( phrase de passe "arguments de la 1519190920" )
69
répondu JakubBoucek 2014-10-10 08:58:49

vous ne pouvez pas crypter directement un gros fichier en utilisant rsautl . au lieu de cela, faites quelque chose comme ce qui suit:

  1. générer une clé en utilisant openssl rand , par exemple. openssl rand 32 -out keyfile
  2. chiffrer le fichier clé en utilisant openssl rsautl
  3. chiffrez les données en utilisant openssl enc , en utilisant la clé générée de l'étape 1.
  4. Package le fichier 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é.
28
répondu Hasturkun 2011-08-22 12:43:42

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

comme mentionné ci-dessus la cryptographie à clé publique n'est pas pour chiffrer arbitrairement les fichiers longs. Par conséquent, les commandes suivantes vont générer une phrase de passe, crypter le fichier en utilisant le cryptage symétrique et puis chiffrez la phrase de passe à l'aide de la clé publique asymétrique. Remarque: le smime comprend l'utilisation d'une clé publique et une clé de sauvegarde pour crypter le mot de passe. Une paire de clés publiques/privées de secours serait prudente.

Mot De Passe Aléatoire De La Génération

définit la valeur RANDFILE à un fichier accessible par l'utilisateur courant, génère le mot de passe.fichier txt et nettoyer 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 mot de passe.txt contenu comme le mot de passe et AES256 à un fichier base64 (-a option). Cryptez le mot de passe.txt utilisant le cryptage asymétrique dans le fichier XXLarge.crypte.passer à l'aide d'un primaire clé publique et 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écryptage ne fait que décrypter la XXLarge.crypte.passe passwd.tmp, décrypte le XXLarge.crypt à XXLarge2.de données, et supprime le mot de passe.fichier 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é avec des fichiers >5Go..

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
répondu Ipswitch 2013-11-17 15:29:35

j'ai trouvé les instructions à http://www.czeskis.com/random/openssl-encrypt-file.html utile.

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

générer une clé symétrique parce que vous pouvez crypter de grands fichiers avec elle

openssl rand -base64 32 > key.bin

chiffrer le grand fichier en utilisant 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 de sorte que vous pouvez envoyer en toute sécurité à l'autre personne

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

détruisez la clé symétrique non cryptée pour que personne ne la trouve

shred -u key.bin

à ce point, vous envoyez la clé symétrique crypté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 leur secteur touche

"
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 c'est fini. L'autre personne a le fichier décrypté et il a été envoyé en toute sécurité.

4
répondu Tom Saleeba 2017-11-27 05:26:51

pour chiffrer en toute sécurité les gros fichiers (>600MO) 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 l'information, voici comment déchiffrer et assembler tous les morceaux:

# 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
répondu Phellipe Kelbert 2016-08-01 12:35:38

peut-être devriez-vous vérifier la réponse acceptée à cela ( comment chiffrer les données en php en utilisant des clés publiques/privées? ) question.

au lieu de travailler manuellement autour de la limite de taille de message (ou peut-être un trait) de RSA, il montre comment utiliser la fonctionnalité S/mime D'OpenSSL pour faire la même chose et ne pas avoir à jongler avec la clé symétrique manuellement.

2
répondu Cray 2017-05-23 12:26:36