Je souhaite chiffrer et déchiffrer un fichier à l'aide d'un mot de passe.
Comment puis-je utiliser OpenSSL pour le faire?
Crypter:
openssl aes-256-cbc -a -salt -in secrets.txt -out secrets.txt.enc
Décrypter:
openssl aes-256-cbc -d -a -in secrets.txt.enc -out secrets.txt.new
Vous voudrez probablement utiliser gpg
au lieu de openssl
donc voyez "Remarques supplémentaires" à la fin de cette réponse. Mais pour répondre à la question en utilisant openssl
:
Pour chiffrer:
openssl enc -aes-256-cbc -in un_encrypted.data -out encrypted.data
Pour déchiffrer:
openssl enc -d -aes-256-cbc -in encrypted.data -out un_encrypted.data
Remarque: Un mot de passe vous sera demandé lors du cryptage ou du décryptage.
Votre meilleure source d’information pour openssl enc
serait probablement: https://www.openssl.org/docs/apps/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 concernant 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.
Bien que vous ayez spécifiquement posé des questions sur OpenSSL, vous pouvez envisager d’utiliser GPG à la place du chiffrement sur la base de cet article OpenSSL contre GPG pour le chiffrement de sauvegardes hors site?
Pour utiliser GPG de la même manière, vous utiliseriez les commandes suivantes:
Pour chiffrer:
gpg --output encrypted.data --symmetric --cipher-algo AES256 un_encrypted.data
Pour déchiffrer:
gpg --output un_encrypted.data --decrypt encrypted.data
Remarque: Un mot de passe vous sera demandé lors du cryptage ou du décryptage.
Crypter:
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 openssl(1)
docs.
à chiffrer:
$ openssl bf < arquivo.txt > arquivo.txt.bf
à déchiffrer:
$ openssl bf -d < arquivo.txt.bf > arquivo.txt
bf === Blowfish en mode CBC
Notez que la CLI OpenSSL utilise un algorithme non standard faible pour convertir la phrase secrète en clé et que l’installation de GPG génère divers fichiers ajoutés à votre répertoire de base et un processus en arrière-plan en cours d’exécution. Si vous voulez une portabilité et un contrôle maximum avec les outils existants, vous pouvez utiliser PHP ou Python pour accéder aux API de niveau inférieur et passer directement une clé AES complète et une IV.
Exemple PHP invocation via Bash:
IV='c2FtcGxlLWFlcy1pdjEyMw=='
KEY='Twsn8eh2w2HbVCF5zKArlY+Mv5ZwVyaGlk5QkeoSlmc='
INPUT=123456789023456
ENCRYPTED=$(php -r "print(openssl_encrypt('$INPUT','aes-256-ctr',base64_decode('$KEY'),OPENSSL_ZERO_PADDING,base64_decode('$IV')));")
echo '$ENCRYPTED='$ENCRYPTED
DECRYPTED=$(php -r "print(openssl_decrypt('$ENCRYPTED','aes-256-ctr',base64_decode('$KEY'),OPENSSL_ZERO_PADDING,base64_decode('$IV')));")
echo '$DECRYPTED='$DECRYPTED
Cela génère:
$ENCRYPTED=nzRi252dayEsGXZOTPXW
$DECRYPTED=123456789023456
Vous pouvez également utiliser la fonction openssl_pbkdf2
de PHP pour convertir une phrase secrète en clé de manière sécurisée.
NE PAS UTILISER LA DÉRIVATION DE CLÉ OPENSSL DEFAULT.
Actuellement, la réponse acceptée en fait usage et ce n'est plus recommandé ni sécurisé.
Il est tout à fait possible pour un attaquant de simplement forcer la clé par force.
https://www.ietf.org/rfc/rfc2898.txt
PBKDF1 applique une fonction de hachage, qui doit être MD2 [6], MD5 [19] ou SHA-1 [18], pour dériver des 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 dérivation de clé dans PKCS # 5 v1.5. PBKDF1 est recommandé uniquement pour la compatibilité avec les applications existantes car les clés produites peuvent ne pas être assez grandes pour certaines applications.
PBKDF2 applique une fonction pseudo-aléatoire (voir l’appendice B.1 pour un exemple) pour dériver des clés. La longueur de la clé dérivée est essentiellement non liée. (Cependant, 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. Voir l'Annexe B.1 pour une analyse plus détaillée.) PBKDF2 est recommandé pour les nouvelles applications.
Faire 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
Remarque : Les itérations de déchiffrement doivent être identiques à celles du chiffrement.
Les itérations doivent être au minimum de 10000. Voici une bonne réponse sur le nombre d'itérations: https://security.stackexchange.com/a/399
Aussi ... nous avons assez de gens ici qui recommandent GPG. Lisez la foutue question.
Mise à jour à l'aide d'une clé publique générée de manière aléatoire.
Encypt:
openssl enc -aes-256-cbc -a -salt -in {raw data} -out {encrypted data} -pass file:{random key}
Décrypter:
openssl enc -d -aes-256-cbc -in {ciphered data} -out {raw data}
J'ai un tutoriel complet à ce sujet sur http://bigthinkingapplied.com/key-based-encryption-using-openssl/
Je trouve en ligne un programme open source qui utilise openssl pour chiffrer et déchiffrer des fichiers. Il le fait avec un seul mot de passe. L'avantage de ce script open source est qu'il supprime le fichier non chiffré d'origine en le déchiquetant. Mais le danger est qu'une fois que le fichier d'origine non crypté est parti, vous devez vous assurer de vous souvenir de votre mot de passe, sinon ils ne constituent pas un autre moyen de décrypter votre fichier.
Ici le lien est sur github
https://github.com/EgbieAnderson1/linux_file_encryptor/blob/master/file_encrypt.py