如何使用 AES 加密来加密消息?

How to encrypt a message with AES encryption?

我读到这篇 article 关于海盗湾的秘密 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

解密后的消息是link:https://www.youtube.com/watch?v=-YEG9DgRHhA


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

它应该很简单:

echo -n "" | 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

回传明文:



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

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

你明白了(请注意输出末尾的五个“00”字节):

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.....

如果您对之前的结果重复相同的操作:

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

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

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.....

那些字节被称为padding bytes and must be added as AES cipher in CBC mode不能处理长度不是N*128位的消息(即不能被分成16字节的块)

原始明文(即00 00 00 00 00)中使用的填充是zero padding, but the second one (04 04 04 04) is a PKCS7填充。

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

echo -ne "[=18=][=18=][=18=][=18=][=18=]" | 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

现在查看填充是否正确:

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 00 00 00 00 00  703/5128464.....

如果您想在 shell 中生成填充,请参见例如(在 EDIT3 下)。

祝你好运!