我读了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
我想像海盗湾那样加密我自己的自定义信息。我假设我需要将加密文本更改为我的自定义消息,并将命令更改为加密,而不是解密。但是我该怎么做呢?
答案 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下)。
祝你好运!