如何使用AES快速加密文件?


81

我想使用AES-256加密文件。如何快速轻松地做到这一点,以及我或其他人如何再次对其进行解密?

Answers:


86

不幸的是,没有简单的解决方案来保护您的东西。考虑一下您的用例,也许普通AES以外的其他方法更合适。


如果您想要非常简单的平台独立加密,则可以使用openssl

请注意:您可以使用此方法向室友隐藏Birthday-gift-ideas.txt,但不要指望它能对确定的攻击者安全!

  1. 正如评论中所指出的那样,此方法使用了幼稚的密钥派生功能,因此您的密码必须是超级好的,以便您有安全的机会。
  2. 此外,此方法不对密文进行身份验证,这意味着攻击者可以在不通知您的情况下修改或破坏内容。
  3. 对于许多类型的安全性来说,加密是远远不够的(例如,您不能仅使用加密来安全地进行通信)

如果仍然要使用openssl:

  • 加密:

    openssl aes-256-cbc -in attack-plan.txt -out message.enc

  • 解密:

    openssl aes-256-cbc -d -in message.enc -out plain-text.txt

base64通过使用-a加密和解密上的开关,可以使openssl来对消息进行-encoding 。这样,您可以将密文粘贴到例如电子邮件中。它看起来像这样:

stefano:~$ openssl aes-256-cbc -in attack-plan.txt -a
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
U2FsdGVkX192dXI7yHGs/4Ed+xEC3ejXFINKO6Hufnc=

请注意,您可以选择密码和操作模式。对于正常使用,我建议在CBC模式下使用AES 256。这些是您可用的密码模式(仅计算AES):

aes-128-cbc ← this is okay
aes-128-ecb
aes-192-cbc
aes-192-ecb
aes-256-cbc ← this is recommended
aes-256-ecb

也可以看看:

请注意:

OpenSSL会要求您输入密码。这不是加密密钥,不限于32个字节!如果您要与他人传输文件,则您的共享机密应该非常牢固。您可以使用此网站来了解密码的安全性:

警告:我已经检查过这些站点没有将您的密码发送到服务器,但是可以随时更改。将这些网站与开发工具/检查器一起使用,并在输入您的强密码之前检查它们是否发送了任何内容。


9
openssl aes-256-cbc比它还短,openssl enc -aes-256-cbc也可以工作。可以通过运行来获得手册页面man enc。永远不要使用ecb不宜处理的数据cbc-salt由于它是默认值,因此是多余的。如果省略,-out filename则输出将被写入标准输出,如果您只需要分析数据而不将其写入磁盘,这将非常有用。下一条命令显示明文的行号:openssl aes-256-cbc -d -in filename | wc -l。(另一种用法,读文件:openssl aes-256-cbc -d -in filename | less
Lekensteyn

1
我在脚本中几乎完全使用了这个:/usr/bin/openssl enc -aes-256-cbc -a -salt -in $1 -out ${1}.enc 与您期望的相反。
belacqua 2011年

1
没有理由更喜欢AES 256而不是AES128。@Lekensteyn也不要使用ECB来处理机密数据-基本上不应该使用ECB(仅针对专家:除非在某些非常特殊的情况下,否则不应该使用ECB)。更一般而言,openssl命令行工具主要是用于测试OpenSSL库的概念验证。这个问题的正确答案是GPG或某些归档器,例如7z
Gilles 2014年

1
我想补充一点openssl enc,如果您的密码很弱,实际上并不是那么安全。我以前建议一定使用openssl enc,但是现在建议改为使用,gpg因为它以更好的方式使用KDF。看到这个答案
Lekensteyn 2014年

2
-1用于推荐低级OpenSSL使用。它不提供任何HMAC功能,正如@Lekensteyn指出的那样,它缺少适当的KDF。
gertvdijk 2014年

26

我喜欢使用以下gpg命令:

加密:

gpg --cipher-algo AES256 --symmetric filename.tar.gz

速记:

gpg --cipher-algo AES256 -c filename.tar.gz

这将要求输入密码。

解密:

gpg --output filename.tar.gz --decrypt filename.tar.gz.gpg

速记:

gpg -o filename.tar.gz -d filename.tar.gz.gpg

您还可以添加cipher-algo AES256~/.gnupg/gpg.conf将AES256设置为默认值。(根据联机帮助页为CAST5


您也可以使用AES(含义为AES-128)。AES-128速度稍快一些,并且安全性也不差。
Gilles 2014年

2
+1。还要注意,当使用AES时,GnuPG还为您提供消息认证(HMAC)(在撰写本文时,OpenSSL并不是最受支持的答案)。背景信息:superuser.com/a/633716/157409
gertvdijk 2014年

如何防止gpg缓存密码?
user76284

16

7z(使用密码选项时)使用256位AES加密(具有SHA256 密钥扩展)。

安装(p7zip-full),右键单击要加密的文件或目录,然后选择“ 压缩”.7z和“ 其他选项 / 密码”

在此处输入图片说明

要解密,请右键单击.7z文件,然后选择此处提取


1
您如何启动7z的GUI?
m0skit0

4

加密

链接的网站包含一个开放源代码的256位AES加密/解密工具,并且是多平台的-MacO,Windows,Linux和其他Java平台。

加密: aescrypt -e <file>

解密: aescrypt -d <file>

您可以使用以下语法备份和加密主文件夹:

tar -cvf - /home/<home_folder> | aescrypt -e -p <password_message> - > backup.tar.aes

Ubuntu安装

下载并解压缩源

make
sudo make install

其他平台

从网站下载二进制文件或源代码。


3

我将提出的许多建议已在此主题中提出。基本上,openssl实际上是加密文件或脚本的最简单方法。但是,我要警告不要使用AES-256,因为它在某些平台上的所有版本的opensl中都不可用。大多数较新的操作系统...即Linux都有它。但是其他诸如AIX 5.3之类的不支持(我也认为HP-UX)。如果打算在不同平台上使用文件或脚本,强烈建议使用AES-128,因为它随处可见。

您如何使用AES-128“快速,轻松地”加密文件?

诸如www.ShellScrypt.com之类的网站非常强烈地使用openssl AES-128加密Shell脚本,然后使脚本的加密副本成为可执行文件。您所要做的就是将脚本粘贴到站点,然后将为您生成一个zip文件。该zip文件将包含文件的加密版本(如果是脚本,则为可执行文件)。这样,您就可以“ 轻松地 ”和“ 方便地 ”对文件/脚本进行加密,而不必满足要在其上使用脚本或运行openssl命令的多个复杂且令人困惑的含义的每个系统上的任何程序包或模块要求。

下面显示的是使用AES-128 的基本加密/解密 openssl命令:

test@test-VirtualBox:~$ 
test@test-VirtualBox:~$ echo precious-content | openssl aes-128-cbc -a -salt -k mypassword
U2FsdGVkX1+K6tvItr9eEI4yC4nZPK8b6o4fc0DR/Vzh7HqpE96se8Fu/BhM314z
test@test-VirtualBox:~$
test@test-VirtualBox:~$ echo U2FsdGVkX1+K6tvItr9eEI4yC4nZPK8b6o4fc0DR/Vzh7HqpE96se8Fu/BhM314z | openssl aes-128-cbc -a -d -salt -k mypassword
precious-content
test@test-VirtualBox:~$ 
test@test-VirtualBox:~$

2
只是发表评论以提请注意“ shellscrypt.com”已被关闭(又名:该网站已消失)。
e-sushi

1

除了Stefano Palazzo的答案之外,我还创建了一个bash小函数,其功能与base64命令相似。

它将aes256加密文件,然后进行base64编码。进行相反操作时,它将对base64进行解码,解密,然后吐出原始明文。

aes256() {
  decodeMe=""
  isPipe="$([ ! -t 0 ] && echo "true" || echo "false")"

  if [ "$1" = '-d' ] || [ "$1" = '--decode' ]; then
    decodeMe="-d"
    shift
  fi

  if [ "$isPipe" = "true" ]; then
    read input
    printf '%s\n' "$input" | openssl aes-256-cbc -a $decodeMe
    exitCode="$?"
  else
    openssl aes-256-cbc -a $decodeMe -in "$*"
    exitCode="$?"
  fi

  unset isPipe decodeMe input
  return "$exitCode"
}

用法:

echo "my string" | aes256
# enter aes-256-cbc encryption password
# Returns: U2FsdGVkX1++e/BhBGlNOzNvarqq7zI13S/hbiKVzXQ=

echo "U2FsdGVkX1++e/BhBGlNOzNvarqq7zI13S/hbiKVzXQ=" | aes256 -d
# enter aes-256-cbc decryption password
# Returns: my string

aes256 file.plain > file.crypt
# enter aes-256-cbc encryption password

aes256 -d file.crypt
# enter aes-256-cbc decryption password
# Spits out original unencrypted file.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.