我想使用一个密码加密和解密文件。
我如何使用OpenSSL来做到这一点?
答案 0 :(得分:226)
加密:
openssl aes-256-cbc -a -salt -in secrets.txt -out secrets.txt.enc
解密:
openssl aes-256-cbc -d -a -in secrets.txt.enc -out secrets.txt.new
答案 1 :(得分:129)
您可能希望使用gpg
代替openssl
,因此请参阅本答案末尾的“其他备注”。但是要使用openssl
来回答这个问题:
加密:
openssl enc -aes-256-cbc -in un_encrypted.data -out encrypted.data
要解密:
openssl enc -d -aes-256-cbc -in encrypted.data -out un_encrypted.data
注意:加密或解密时系统会提示您输入密码。
openssl enc
的最佳信息来源可能是:https://www.openssl.org/docs/apps/enc.html
命令行:
openssl enc
采用以下形式:
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]
解释与您的问题有关的最有用的参数:
-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.
虽然您已经特别询问了OpenSSL,但您可能需要考虑使用GPG代替基于本文的加密OpenSSL vs GPG for encrypting off-site backups?
要使用GPG执行相同的操作,您可以使用以下命令:
加密:
gpg --output encrypted.data --symmetric --cipher-algo AES256 un_encrypted.data
要解密:
gpg --output un_encrypted.data --decrypt encrypted.data
注意:加密或解密时系统会提示您输入密码。
答案 2 :(得分:31)
加密:
openssl enc -in infile.txt -out encrypted.dat -e -aes256 -k symmetrickey
解密:
openssl enc -in encrypted.dat -out outfile.txt -d -aes256 -k symmetrickey
有关详细信息,请参阅openssl(1)
文档。
答案 3 :(得分:4)
加密:
$ openssl bf < arquivo.txt > arquivo.txt.bf
要解密:
$ openssl bf -d < arquivo.txt.bf > arquivo.txt
bf === CBC模式下的河豚
答案 4 :(得分:3)
使用随机生成的公钥进行更新。
<强>加密强>
openssl enc -aes-256-cbc -a -salt -in {raw data} -out {encrypted data} -pass file:{random key}
<强>解密:强>
openssl enc -d -aes-256-cbc -in {ciphered data} -out {raw data}
我在http://bigthinkingapplied.com/key-based-encryption-using-openssl/
上有完整的教程答案 5 :(得分:3)
请注意,OpenSSL CLI使用弱的非标准算法将密码转换为密钥,并将GPG结果安装到添加到主目录的各种文件中,并运行gpg-agent后台进程。如果您希望使用现有工具实现最大的可移植性和控制,可以使用PHP或Python访问较低级别的API,并直接传入完整的AES密钥和IV。
通过Bash进行PHP调用示例:
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
输出:
$ENCRYPTED=nzRi252dayEsGXZOTPXW
$DECRYPTED=123456789023456
您还可以使用PHP的openssl_pbkdf2
功能将密码安全地转换为密钥。
答案 6 :(得分:3)
如其他答案所述,openssl的早期版本使用弱密钥派生功能从密码中派生AES加密密钥。但是,openssl v1.1.1支持更强大的密钥派生功能,该密钥使用带有随机生成的盐的pbkdf2
和多次256 sha256哈希(默认为10,000)迭代从密码中派生。
要加密文件:
openssl aes-256-cbc -e -salt -pbkdf2 -iter 10000 -in plaintextfilename -out encryptedfilename
解密文件:
openssl aes-256-cbc -d -salt -pbkdf2 -iter 10000 -in encryptedfilename -out plaintextfilename
答案 7 :(得分:2)
我在网上找到一个开源程序,它使用openssl来加密和解密文件。它使用单个密码执行此操作。这个开源脚本的好处是它通过粉碎文件来删除原始的未加密文件。但危险的是,一旦原始的未加密文件消失,你必须确保你记住你的密码,否则他们无法解密你的文件。
这里是github上的链接
https://github.com/EgbieAnderson1/linux_file_encryptor/blob/master/file_encrypt.py
答案 8 :(得分:1)
mti2935良好答案的其他注释。
似乎迭代次数越多,对暴力破解的保护越好,并且应该使用较高的迭代次数,因为您可以合理地选择性能/资源。
在我的旧版Intel i3-7100上,它加密了一个1.5GB的大文件:
time openssl enc -aes256 -e -pbkdf2 -iter 10000 -pass pass:"mypassword" -in "InputFile" -out "OutputFile"
Seconds: 2,564s
time openssl enc -aes256 -e -pbkdf2 -iter 262144 -pass pass:"mypassword" -in "InputFile" -out "OutputFile"
Seconds: 2,775s
没什么区别,虽然没有检查内存使用情况(?)
使用当今的GPU,甚至明天更快,我想每秒钟可能进行十亿次暴力迭代。
12 年前,NVIDIA GeForce 8800 Ultra
可以迭代200.000百万/秒的迭代次数(尽管是MD5哈希)
答案 9 :(得分:0)
请勿使用OPENSSL默认密钥派生。
当前接受的答案已在使用它,因此不再推荐且不安全。
对于攻击者而言,简单地蛮力破解密钥是非常可行的。
https://www.ietf.org/rfc/rfc2898.txt
PBKDF1应用哈希函数,该函数应为MD2 [6],MD5 [19]或 SHA-1 [18],得出密钥。派生密钥的长度是有界的 哈希函数输出的长度,对于MD2为16个八位位组 MD5和SHA-1的20个八位位组。 PBKDF1与钥匙兼容 PKCS#5 v1.5中的派生过程。仅建议PBKDF1与现有版本兼容 应用程序,因为它产生的密钥可能不够大 一些应用程序。
PBKDF2应用伪随机函数(有关详细信息,请参见附录B.1)。 示例)以导出密钥。派生密钥的长度本质上是 无界的。 (但是,派生密钥的最大有效搜索空间可能受基础结构的限制 伪随机函数。有关更多讨论,请参见附录B.1。) 建议将PBKDF2用于新应用。
执行以下操作:
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
注意:解密中的迭代必须与加密中的迭代相同。
迭代次数必须至少为10000。 这是一个有关迭代次数的好答案:https://security.stackexchange.com/a/3993
此外...我们这里有足够的人推荐GPG。阅读该死的问题。