QQ 空间加密留言
准备工作
老司机请直接跳到精简版
MacOS 或 Linux 用户
打开终端就可以了
Windows 用户
建议使用 Linux 虚拟机,推荐 WSL、Multipass,也可以使用 VMware、Virtual Box 等桌面虚拟化软件
加密文本
新建一个目录用来保存密钥等文件
prompt> mkdir RSA
prompt> cd RSA
然后用 openssl 生成一个 2048 位的密钥,并从中提取出公钥
prompt> openssl genrsa -out qqzone.key 2048
prompt> openssl rsa -in qqzone.key -pubout -out qqzone_pub.key
然后将待加密留言写入 text 文件 (在双引号内写入文本),然后使用刚刚生成的公钥 qqzone_pub.key
对 text 文件进行加密:
prompt> echo "今天吃点啥?" > text
prompt> openssl rsautl -encrypt -in text -inkey qqzone_pub.key -pubin -out text.en
格式转换
文本文件 text
加密后变为了二进制文件,没办法直接发布在网上
prompt> less text.en
# "text.en" may be a binary file. See it anyway? y
用 less 查看文件就可以发现里面有很多无法打印的字符,如果直接复制粘贴下面的内容无法还原信息
💡 因此我们要对 text.en
文件进行格式转换,利用 od 程序将其转为十六进制,再用 awk 程序对输出进行格式化,得到连续的十六进制输出
运行 od -x text.en
后得到下面的输出,现在仍然不能直接复制。因为 od 程序为了美观,在每一行的前面增加了地址偏移,且每一列之间添加了空格,这些都不属于 text.en
文件本身的内容
这个时候就是 awk 大展身手的时候了,只需要使用 awk 'for(i=2; i<10; i++) printf $i}'
对 od 的输出进行处理就可以得到纯纯的十六进制内容了
prompt> od -x text.en | awk '{for(i=2; i<10; i++) printf $i}'
得到的输出如下
细节问题
由于 od 显示和大小端问题,我们还需要做出一些调整才能方便之后将十六进制信息转为正确的二进制
# 按 byte 输出文件信息
prompt> od -t x1 text.en | awk '{for(i=2; i<18; i++) printf $i}'# 或者使用 --endian=big 对输出进行颠倒
prompt> od -x --endian=big text.en | awk '{for(i=2;i<10;i++) printf $i}'
然后把输出复制下来就可以发布加密文字了 🎆,注意不要复制到后表面的 %
7e52ea6ed86937584d80922efd4e264b3c454aba74d965005b57d5de9a82e97e6cb140ae217ea320cdcc7b5c1925b04af4fbb71bfb032ba9c8a83a053f359dfa43c656fe3f6ceb4e2707a086d07c0e58c6010db4389e5a76ac848054d60dae7e39432dc1b68753fe574a6f1fc0e85d88f485f890428b8d2aec6e9461caec6bc47a3eefc2281cb84ee29472a571ee5bd2e082da59df5d77de96030177e21637ec7261092d1021b97490f010901330cb097638cef019ffdce78bb7fb819083aefdbad9071d9762564bca0585d936d5747badc47a938c3d1957665a6b24d57ff4fa71110fd23fbe857b19a54a9e5410d0b52efea7d229a089fa1fd3aafda0156729
至此加密就结束了,下面是解密部分
解密
将上述十六进制内容写入文件 text.en.hex
,或者直接使用 echo,然后用 xxd 将十六进制输出转为二进制再写入文件 text.en.bin
就可以了
# 方法一
prompt> vim text.en.hex # 然后将十六进制文本串内容复制进去
prompt> cat text.en.hex | xxd -r -ps > text.en.bin# 方法二
prompt> echo "7e52ea6ed86937584d80922efd4e264b3c454aba74d965005b57d5de9a82e97e6cb140ae217ea320cdcc7b5c1925b04af4fbb71bfb032ba9c8a83a053f359dfa43c656fe3f6ceb4e2707a086d07c0e58c6010db4389e5a76ac848054d60dae7e39432dc1b68753fe574a6f1fc0e85d88f485f890428b8d2aec6e9461caec6bc47a3eefc2281cb84ee29472a571ee5bd2e082da59df5d77de96030177e21637ec7261092d1021b97490f010901330cb097638cef019ffdce78bb7fb819083aefdbad9071d9762564bca0585d936d5747badc47a938c3d1957665a6b24d57ff4fa71110fd23fbe857b19a54a9e5410d0b52efea7d229a089fa1fd3aafda0156729" | xxd -r -ps > text.en.bin
对二进制文件 text.en.bin
解密就可以看到加密留言了
prompt> openssl rsautl -decrypt -in text.en.bin -inkey qqzone.key -out text.de
prompt> cat text.de
# out> 今天吃点啥?
芜湖起飞 ✈️!加解密全部完成
精简版
mkdir RSA
cd RSA# 生成一个 2048 位的密钥
openssl genrsa -out qqzone.key 2048
# 提取出公钥
openssl rsa -in qqzone.key -pubout -out qqzone_pub.key# 待加密文字
echo "今天吃点啥?" > text# 加密
openssl rsautl -encrypt -in text -inkey qqzone_pub.key -pubin -out text.en# 格式转换 方案一
od -t x1 text.en | awk '{for(i=2; i<18; i++) printf $i}'
# 方案二
od -x --endian=big text.en | awk '{for(i=2;i<10;i++) printf $i}'# 十六进制文本转二进制
vim text.en.hex # 复制粘贴十六进制文本串
cat text.en.hex | xxd -r -ps > text.en.bin# 解密
openssl rsautl -decrypt -in text.en.bin -inkey qqzone.key -out text.de
# 查看明文
cat text.de