如何使用AES加密加密邮件?

时间:2016-08-29 02:20:48

标签: encryption cryptography aes

我读了article关于正在解决的Pirate Bay的秘密AES加密消息。 (这是旧闻)

求解程序在他的linux终端中使用此命令来解密消息。

echo "JyO7wNzc8xht47QKWohfDVj6Sc2qH+X5tBCT+uetocIJcjQnp/2f1ViEBR+ty0Cz" | openssl aes-128-cbc -K $(printf wearetpb | sha256sum | head -c 32 | tr '[:lower:]' '[:upper:]') -nosalt -nopad -iv 0 -base64 -d -p

decrpyted消息是一个链接:https://www.youtube.com/watch?v=-YEG9DgRHhA

我想像海盗湾那样加密我自己的自定义信息。我假设我需要将加密文本更改为我的自定义消息,并将命令更改为加密,而不是解密。但是我该怎么做呢?

1 个答案:

答案 0 :(得分:1)

应该如此简单:

std::string

给予密文:

echo -n "https://stackoverflow.com/q/39197703/5128464" | openssl aes-128-cbc -K $(printf wearetpb | sha256sum | head -c 32 | tr '[:lower:]' '[:upper:]') -nosalt -iv 0 -e -base64

然后可以解密(使用相同的技术,密钥等):

l3iwQZrEe8R55MQMu13Hn2S+MvKs46fLT6rVP3yiJqvCPwAzJLrnZph1fYX1qDkk

收回明文:

echo "l3iwQZrEe8R55MQMu13Hn2S+MvKs46fLT6rVP3yiJqvCPwAzJLrnZph1fYX1qDkk" | openssl aes-128-cbc -K $(printf wearetpb | sha256sum | head -c 32 | tr '[:lower:]' '[:upper:]') -nosalt -nopad -iv 0 -base64 -d

但是如果仔细查看原始解密文本(即转储实际的消息字节):

https://stackoverflow.com/q/39197703/5128464

你得到了这个(请注意输出结尾的五个''字节):

echo "JyO7wNzc8xht47QKWohfDVj6Sc2qH+X5tBCT+uetocIJcjQnp/2f1ViEBR+ty0Cz" | openssl aes-128-cbc -K $(printf wearetpb | sha256sum | head -c 32 | tr '[:lower:]' '[:upper:]') -nosalt -nopad -iv 0 -base64 -d | xxd -g1

如果你对之前的结果重复相同的话:

0000000: 68 74 74 70 73 3a 2f 2f 77 77 77 2e 79 6f 75 74  https://www.yout
0000010: 75 62 65 2e 63 6f 6d 2f 77 61 74 63 68 3f 76 3d  ube.com/watch?v=
0000020: 2d 59 45 47 39 44 67 52 48 68 41 00 00 00 00 00  -YEG9DgRHhA.....

你得到一个不同的结局(这次有五个' 05'字节):

echo "l3iwQZrEe8R55MQMu13Hn2S+MvKs46fLT6rVP3yiJqvCPwAzJLrnZph1fYX1qDkk" | openssl aes-128-cbc -K $(printf wearetpb | sha256sum | head -c 32 | tr '[:lower:]' '[:upper:]') -nosalt -nopad -iv 0 -base64 -d | xxd -g1

这些字节称为padding bytes,必须在AES cipher中添加为CBC mode,不能处理长度不是N * 128位的消息(即不能分成16位的消息字节块)

原始明文中使用的填充(即0000000: 68 74 74 70 3a 2f 2f 73 74 61 63 6b 6f 76 65 72 http://stackover 0000010: 66 6c 6f 77 2e 63 6f 6d 2f 71 2f 33 39 31 39 37 flow.com/q/39197 0000020: 37 30 33 2f 35 31 32 38 34 36 34 05 05 05 05 05 703/5128464..... )是zero padding,但第二个(00 00 00 00 00)是PKCS7填充。

不幸的是,openssl命令行实用程序不直接支持零填充,因此您必须手动添加它(请注意添加的零字节和额外的04 04 04 04选项):

-nopad

,并提供:

echo -ne "https://stackoverflow.com/q/39197703/5128464\0\0\0\0\0" | openssl aes-128-cbc -K $(printf wearetpb | sha256sum | head -c 32 | tr '[:lower:]' '[:upper:]') -nosalt -nopad -iv 0 -e -base64

您可以使用以下方法检查新纯文本的填充:

l3iwQZrEe8R55MQMu13Hn2S+MvKs46fLT6rVP3yiJquYbIGPlGOBxJxJmU/bXocR

现在看到填充是正确的:

echo "l3iwQZrEe8R55MQMu13Hn2S+MvKs46fLT6rVP3yiJquYbIGPlGOBxJxJmU/bXocR" | openssl aes-128-cbc -K $(printf wearetpb | sha256sum | head -c 32 | tr '[:lower:]' '[:upper:]') -nosalt -nopad -iv 0 -base64 -d | xxd -g1

如果要在shell中生成填充,请参阅例如here(在EDIT3下)。

祝你好运!