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
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.
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:
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:
Vous ne pouvez pas chiffrer directement un fichier volumineux avec rsautl
. faites plutôt quelque chose comme ceci:
openssl Rand
, par exemple. openssl Rand 32 -out keyfile
openssl rsautl
openssl enc
, en utilisant la clé générée à l’étape 1.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.
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
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
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
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 personneL’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é.
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
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.