302 votes

Comment utiliser OpenSSL pour crypter/décrypter des fichiers ?

Je veux crypter et décrypter un fichier en utilisant un seul mot de passe.

Comment puis-je utiliser OpenSSL pour faire cela ?

342voto

Szocske Points 2371

Avertissement de sécurité : AES-256-CBC ne fournit pas chiffrement authentifié et est vulnérable aux attaques de l'oracle du rembourrage . Vous devriez utiliser quelque chose comme âge au lieu de cela.

Encrypt :

openssl aes-256-cbc -a -salt -pbkdf2 -in secrets.txt -out secrets.txt.enc

Décrypter :

openssl aes-256-cbc -d -a -pbkdf2 -in secrets.txt.enc -out secrets.txt.new

Plus de détails sur les différents drapeaux

254voto

moo Points 2208

Meilleure alternative : GPG

Bien que votre question porte spécifiquement sur OpenSSL, vous pourriez envisager d'utiliser GPG à la place pour le cryptage, en vous basant sur cet article. OpenSSL vs GPG pour le cryptage des sauvegardes hors site ?

Pour utiliser GPG de la même manière, vous devez utiliser les commandes suivantes :

Pour crypter :

gpg --output encrypted.data --symmetric --cipher-algo AES256 un_encrypted.data

Pour décrypter :

gpg --output un_encrypted.data --decrypt encrypted.data

Note : Un mot de passe vous sera demandé lors du cryptage ou du décryptage. Et utiliser --no-symkey-cache pour l'absence de cache.


RE : OpenSSL - Réponse courte

Il est probable que vous souhaitiez utiliser gpg au lieu de openssl voir "Notes supplémentaires" à la fin de cette réponse. Mais pour répondre à la question en utilisant openssl :

Pour crypter :

openssl enc -aes-256-cbc -in un_encrypted.data -out encrypted.data

Pour décrypter :

openssl enc -d -aes-256-cbc -in encrypted.data -out un_encrypted.data

Note : Un mot de passe vous sera demandé lors du cryptage ou du décryptage.


RE : OpenSSL - Réponse longue

Votre meilleure source d'information pour openssl enc serait probablement : https://www.openssl.org/docs/man1.1.1/man1/enc.html

Ligne de commande : openssl enc prend la forme suivante :

openssl enc -ciphername [-in filename] [-out filename] [-pass arg]
[-e] [-d] [-a/-base64] [-A] [-k password] [-kfile filename] 
[-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md] [-p] [-P] 
[-bufsize number] [-nopad] [-debug] [-none] [-engine id]

Explication des paramètres les plus utiles par rapport à votre question :

-e
    Encrypt the input data: this is the default.

-d    
    Decrypt the input data.

-k <password>
    Only use this if you want to pass the password as an argument. 
    Usually you can leave this out and you will be prompted for a 
    password. The password is used to derive the actual key which 
    is used to encrypt your data. Using this parameter is typically
    not considered secure because your password appears in 
    plain-text on the command line and will likely be recorded in 
    bash history.

-kfile <filename>
    Read the password from the first line of <filename> instead of
    from the command line as above.

-a
    base64 process the data. This means that if encryption is taking 
    place the data is base64 encoded after encryption. If decryption 
    is set then the input data is base64 decoded before being 
    decrypted.
    You likely DON'T need to use this. This will likely increase the
    file size for non-text data. Only use this if you need to send 
    data in the form of text format via email etc.

-salt
    To use a salt (randomly generated) when encrypting. You always
    want to use a salt while encrypting. This parameter is actually
    redundant because a salt is used whether you use this or not 
    which is why it was not used in the "Short Answer" above!

-K key    
    The actual key to use: this must be represented as a string
    comprised only of hex digits. If only the key is specified, the
    IV must additionally be specified using the -iv option. When 
    both a key and a password are specified, the key given with the
    -K option will be used and the IV generated from the password 
    will be taken. It probably does not make much sense to specify 
    both key and password.

-iv IV
    The actual IV to use: this must be represented as a string 
    comprised only of hex digits. When only the key is specified 
    using the -K option, the IV must explicitly be defined. When a
    password is being specified using one of the other options, the 
    IV is generated from this password.

-md digest
    Use the specified digest to create the key from the passphrase.
    The default algorithm as of this writing is sha-256. But this 
    has changed over time. It was md5 in the past. So you might want
    to specify this parameter every time to alleviate problems when
    moving your encrypted data from one system to another or when
    updating openssl to a newer version.

50voto

Ken Cheung Points 596

Encrypt :

openssl enc -in infile.txt -out encrypted.dat -e -aes256 -k symmetrickey

Décrypter :

openssl enc -in encrypted.dat -out outfile.txt -d -aes256 -k symmetrickey

Pour plus de détails, voir le openssl(1) docs.

28voto

ArnoldB Points 248

NE PAS UTILISER LA DÉRIVATION DE CLÉ PAR DÉFAUT D'OPENSSL.

Actuellement, la réponse acceptée l'utilise et elle n'est plus recommandée ni sûre.

Il est tout à fait possible pour un attaquant de forcer brutalement la clé.

https://www.ietf.org/rfc/rfc2898.txt

P SHA-1 [18], pour dériver les clés. La longueur de la clé dérivée est limitée par la longueur de la sortie de la fonction de hachage, qui est de 16 octets pour MD2 et MD5 et de 20 octets pour SHA-1. PBKDF1 est compatible avec le processus de processus de dérivation des clés de la norme PKCS #5 v1.5. PBKDF1 n'est recommandé qu'à des fins de compatibilité avec les applications existantes, car les clés qu'il produit peuvent ne pas être les mêmes. existantes, car les clés qu'il produit peuvent être trop petites pour certaines applications. pour certaines applications.

PBKDF2 applique une fonction pseudo-aléatoire (voir l'annexe B.1 pour un exemple) pour dériver les clés. exemple) pour dériver les clés. La longueur de la clé dérivée est essentiellement illimitée. (Toutefois, l'espace de recherche effectif maximal pour la clé dérivée peut être limité par la structure de la fonction pseudo-aléatoire sous-jacente. sous-jacente. Voir l'annexe B.1 pour plus de détails). PBKDF2 est recommandé pour les nouvelles applications.

Faites ceci :

openssl enc -aes-256-cbc -pbkdf2 -iter 20000 -in hello -out hello.enc -k meow

openssl enc -d -aes-256-cbc -pbkdf2 -iter 20000 -in hello.enc -out hello.out

Note : Les itérations dans le décryptage doivent être les mêmes que les itérations dans le cryptage.

Le nombre d'itérations doit être au minimum de 10000. Voici une bonne réponse sur le nombre d'itérations : https://security.stackexchange.com/a/3993

De plus, nous avons suffisamment de personnes ici qui recommandent GPG. Lisez cette foutue question.

15voto

mti2935 Points 2753

Comme indiqué dans les autres réponses, les versions précédentes d'openssl utilisaient une fonction de dérivation de clé faible pour dériver une clé de cryptage AES à partir du mot de passe. Cependant, openssl v1.1.1 supporte une fonction de dérivation de clé plus forte, où la clé est dérivée du mot de passe à l'aide de la fonction pbkdf2 avec un sel généré aléatoirement et plusieurs itérations de hachage sha256 (10 000 par défaut).

Pour crypter un fichier :

openssl aes-256-cbc -e -salt -pbkdf2 -iter 10000 -in plaintextfilename -out encryptedfilename

Pour décrypter un fichier :

openssl aes-256-cbc -d -salt -pbkdf2 -iter 10000 -in encryptedfilename -out plaintextfilename

Note : Une implémentation équivalente/compatible en javascript (utilisant l'api crypto web) peut être trouvée à l'adresse suivante https://github.com/meixler/web-browser-based-file-encryption-decryption .

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