86 votes

Comment crypter un grand fichier dans openssl en utilisant une clé publique

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

Je peux créer des clés publiques et privées RSA mais lorsqu'il s'agit de crypter un gros fichier à 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 par les 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

87voto

n.m. Points 30344

La cryptographie à clé publique ne permet pas de chiffrer des fichiers de longueur arbitraire. On utilise un chiffrement symétrique (par exemple AES) pour effectuer le chiffrement normal. Chaque fois, une nouvelle clé symétrique aléatoire est générée, utilisée, puis cryptée avec le chiffrement RSA (clé publique). Le texte chiffré, accompagné de la clé symétrique chiffrée, est transféré 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écrypter le message.

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

1 votes

Mais le but de la cryptographie asymétrique est d'empêcher le partage du secret privé, cette approche conduit au partage de la clé même si elle est cryptée avec la cryptographie asymétrique. Y a-t-il un avantage à utiliser la cryptographie asymétrique comme RSA pour crypter le secret partagé par rapport aux algorithmes symétriques ?

3 votes

@techno : vous ne partagez aucun secret. Vous générez une clé aléatoire à usage unique, vous l'utilisez pour chiffrer un seul message et vous la jetez. La clé que vous envoyez avec le message n'est valable que pour ce message.

1 votes

Oui, mais la clé unique pour le message particulier est partagée, n'est-ce pas ? Y a-t-il un avantage à utiliser la cryptographie asymétrique comme RSA pour crypter le secret partagé par rapport aux algorithmes symétriques ?

78voto

JakubBoucek Points 483

Solution pour encoder de manière sûre et hautement sécurisée n'importe quel fichier dans OpenSSL et en ligne de commande :

Vous devez disposer d'un certificat X.509 pour crypter 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 c'est ?

  • smime - commande ssl pour l'utilitaire S/MIME ( smime(1) )
  • -chiffrer - méthode choisie pour le traitement des dossiers
  • -binaire - utiliser un processus de fichier sûr. Normalement le message d'entrée est converti au format "canonique" comme requis par 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 - a choisi le chiffrement AES en 256 bits pour le cryptage (fort). Si non spécifié 40 bit RC2 est utilisé (très faible). ( Chiffres pris en charge )
  • -in plainfile.zip - nom du fichier d'entrée
  • -out encrypted.zip.enc - nom du fichier de sortie
  • -outforme DER - coder le fichier de sortie en binaire. Si elle n'est pas spécifiée, le fichier est encodé par base64 et la taille du fichier sera augmentée de 30%.
  • votreCertificatSl.pem - nom du fichier de votre certificat. Il doit être au format PEM.

Cette commande peut crypter très efficacement et fortement les gros fichiers, quel que soit leur format.
Problème connu : Un problème se produit lorsque vous essayez de crypter un fichier énorme (>600MB). Aucune erreur n'est signalée, mais le fichier crypté sera corrompu. Vérifiez toujours chaque fichier ! (ou utilisez PGP - qui a un plus grand support pour le cryptage de fichiers avec une clé publique)

Décryptez 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 ?

  • -informer DER - même que -outform ci-dessus
  • -inkey private.key - nom du fichier de votre clé privée. Ce fichier doit être au format PEM et peut être crypté par un mot de passe.
  • -passin pass:votre_mot_de_passe - votre mot de passe pour le cryptage de la clé privée. ( arguments pour la phrase de passe )

1 votes

Quand je fais la commande ci-dessus, j'obtiens un Usage smime [options] yourSslCertificate.pem ... avec toutes les options du smime.

4 votes

Il s'est avéré que je devais faire -aes256 au lieu de -aes-256-cbc

11 votes

"Cette commande peut très efficacement et fortement crypter n'importe quel fichier indépendamment de sa taille ou de son format", mais oops sur le dernier paragraphe vous reconnaissez qu'il ne peut pas crypter les gros fichiers à tous peut-être que vous ne devriez pas faire de telles revendications pompeuses de la solution ultime et tous les fichiers quand en fin de compte votre solution ne fonctionne tout simplement pas pour les gros fichiers. Vous devriez commencer par les limites et la portée de votre solution plutôt que de finir avec elle.

31voto

Hasturkun Points 18653

Vous ne pouvez pas crypter directement un grand 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. Cryptez le fichier clé en utilisant openssl rsautl
  3. Cryptez les données en utilisant openssl enc en utilisant la clé générée à l'étape 1.
  4. Emballez le fichier de la clé cryptée avec les données cryptées. Le destinataire devra décrypter la clé avec sa clé privée, puis décrypter les données avec la clé obtenue.

25voto

Ipswitch Points 51

Il n'est pas conseillé de crypter un très gros fichier à l'aide de smime, car il se peut que vous puissiez crypter de gros fichiers à l'aide de l'option -stream, mais que vous ne puissiez pas décrypter le fichier résultant en raison de limitations matérielles. voir : problème de décryptage de gros fichiers

Comme indiqué plus haut, la cryptographie à clé publique ne permet pas de crypter des fichiers de longueur arbitraire. Par conséquent, les commandes suivantes vont générer une phrase de passe, crypter le fichier en utilisant le cryptage symétrique et ensuite crypter la phrase de passe en utilisant le cryptage asymétrique (clé publique). Remarque : le smime prévoit l'utilisation d'une clé publique primaire et d'une clé de secours pour chiffrer la phrase de passe. Il serait prudent de disposer d'une paire de clés publiques/privées de secours.

Génération de mots de passe aléatoires

Configurer la valeur RANDFILE à un fichier accessible par l'utilisateur actuel, générer le fichier passwd.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 contenu de passwd.txt comme mot de passe et AES256 vers un fichier base64 (option -a). Cryptez le fichier passwd.txt en utilisant le cryptage asymétrique dans le fichier XXLarge.crypt.pass en utilisant une clé publique primaire 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 décrypte simplement le XXLarge.crypt.pass en passwd.tmp, décrypte le 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

Ceci a été testé contre des fichiers de plus de 5 Go

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

0 votes

Juste mes deux centimes : Je laisserais tomber le -a afin de réduire la taille du fichier crypté (pas d'encodage Base64) et d'ajouter des éléments de sécurité. -pbkdf2 pour une meilleure dérivation des clés (en 2021 openssl enc se plaint d'une simple -pass )

0 votes

N'est-ce pas ? smime Vous faites déjà le cryptage avec un chiffrement symétrique, puis le cryptage de la clé avec RSA ? Le chiffrement séparé est-il juste une solution de contournement pour la sous-commande smime qui ne fonctionne pas correctement pour les gros fichiers ?

2voto

Cray Points 1043

Vous devriez peut-être consulter la réponse acceptée à cette question ( Comment crypter des données en php en utilisant des clés publiques/privées ? ) question.

Au lieu de contourner manuellement la limitation de la taille des messages (ou peut-être un trait) de RSA, il montre comment utiliser la fonction S/mime d'OpenSSL pour faire la même chose et ne pas avoir à jongler manuellement avec la clé symétrique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X