原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。
简介
在信息安全领域,一般会遇到"窃听"、“篡改”、“伪装”、"否认"这些威胁,而密码学家们提供了相应的密码学算法来解决这些问题,如下:
- 窃听:攻击者可以在网络上安置了一个路由器,侦听所有经过的数据包,这样数据就被泄密了,密码学提供了对称密码与公钥密码算法对数据加密,保证机密性。
- 篡改:攻击者对经过的数据包进行修改,使得接收方获取到错误的信息,密码学提供了单向散列函数生成“数据指纹”,保证数据完整性。
- 伪装:攻击者伪装成发送方来发送数据,使得接收方获取到虚假的信息,密码学提供消息认证码生成"认证码",保证数据来源的正确性。
- 否认:发送方本身是攻击者,发送了恶意请求后,谎称自己没有发此请求,密码学提供了数字签名算法,使其不可否认。
像对称加密、公钥加密、消息散列、消息认证码、数字签名这些算法,也被称为密码学家的工具箱。
加密分类
现如今的加密算法,主要分为两大类,一类是对称加密,而另一类是非对称加密,而对称加密在实现方式上又可以分为两类,一类是分组加密算法,另一类是流加密算法。
分组加密
分组加密(block cipher),每次加密或解密数据中特定长度的一小块,前一块处理完了再处理下一块,直到所有数据都处理完,这里的“一块”就称为分组,而一个分组的bit数就是分组长度。
常见的分组加密算法有DES与AES,比如DES的分组长度是64bit,而AES的分组长度可以是128bit或192bit或256bit,由于DES或AES的算法过程比较复杂,暂不介绍,但我们有必要了解一下它们经常使用的基础运算XOR。
XOR加密
在位运算中,一般有AND(与)、OR(或)、NOT(非)运算,然而还有一种位运算也非常常用,即XOR(异或),它的运算规则如下:
简单来说,就是两边相同结果是0,两边不同结果是1,所以才称为“异或”嘛!
而如果将XOR运算应用在多bit的数据上,我们会发现XOR有非常好的自反特性,如下:
- 数据A与B异或之后,变成了一个新数据
- 而当我们将新数据再与B异或运算后,发现它又变成了A!
- 从而,我们惊奇的发现,如果把B看成是密钥的话,XOR可以用来实现加密、解密算法,而加密、解密过程,都只需要数据与密钥做XOR运算即可。
Linux命令做XOR加密
$ pip install xortool
# 明文文件,内容是hello
$ echo -n hello > plain.txt
$ xxd plain.txt
00000000: 6865 6c6c 6f hello
# 用xor算法加密,密码为pass,生成encrypt.bin
$ cat plain.txt | xortool-xor -n -r pwd -f - > encrypt.bin
$ xxd encrypt.bin
00000000: 1812 081c 18 .....
# 用XOR算法解密,可还原成明文
$ xortool-xor -n -r pwd -f encrypt.bin
hello
虽然对称加密算法的核心是XOR,但如果加密算法只使用XOR的话,其加密的强度并不够高,很容易被破译或泄密。
下面会以一个故事展开密码学的各种算法概念及用途,背景如下:
男主:小李 ,女主:小红,男配:大李,小李的哥哥,女配:小美,小红的闺蜜
小李与小红是同班同学,专业计算机,小李对小红倾慕已久!
恋爱日记:小李写情书
为了表达爱慕之情,小李写了一封情书,写了好长时间,决定发给小红,但又不想被网络上的其他人看到!如下:
由于小李最近学习了XOR加密算法,于是使用XOR加密了情书,如下:
cat plain.txt | xortool-xor -n -r pwd -f - > encrypt.bin
可以看到,加密后的数据都是乱码了,效果很好!
小李喜出望外,将自己的成果展示给哥哥大李看!大李指出,这样的加密算法强度不够高,密码学家们可以轻易破解,开始给小李展示破译过程!
# 统计原文词频
$ grep -oP . plain.txt |sort|uniq -c|sort -nr|head
66 ,
37 你
31 的
25 我
15 是
15 不
13 一
12 想
10 会
9 都
# 统计密文词频
$ xxd -g3 -c3 -ps encrypt.bin |sort|uniq -c|sort -nr|head
66 9fcbe8
37 94cac4
31 97ede0
25 96fff5
15 96efcb
15 94cfe9
13 94cfe4
12 96f4d7
10 94cbfe
9 99f4d9
# 按词频构造替换表
$ paste <(xxd -g3 -c3 -ps encrypt.bin |sort|uniq -c|sort -nr|head|awk '{print $2}'|sed -E 's/../\\x&/g') <(grep -oP . plain.txt |sort|uniq -c|sort -nr|head|awk '{print $2}')
\x9f\xcb\xe8 ,
\x94\xca\xc4 你
\x97\xed\xe0 的
\x96