0%

不可不知的加密算法

最近在看《我的第一本算法书》,准备写点数据结构与算法系列博客。看完后感觉加密算法也很有意思,于是就有了这篇文章。

为什么需要加密

互联网传输数据时面临着四个问题:

1
2
3
4
窃听:A向B发送消息可能会在传输途中被X偷看;
假冒:A以为向B发送了消息,然而B有可能是X冒充的;反过来,B以为从A那里收到了消息,然而也有可能是X冒充的;
篡改:A向B发送消息,但是B收到的可能是X篡改后的;
事后否认:B收到A发送的消息,但A可能对B带有恶意,不承认消息是自己发送的;

要解决上述问题,很自然的就想到了对信息加密。
alt text

加密算法分类

哈希函数

哈希函数是把给定的数据转换成固定长度的无规律数值

哈希函数要求

1
2
3
4
5
6
1.输出的哈希值数据长度不变;
2.输入数据相同,输出的哈希值也必定相同;
3.输入的数据相似,但输出的哈希值也会有很大差异;
4.输入数据不同,输出的哈希值可能相同(哈希冲突);
5.不可能从哈希值反过来推算出原本数据;
6.哈希值的计算相对容易;

交互方式

A发送消息->B收到消息后使用哈希函数加密消息->B保存加密后消息->用于判断A下次的消息是否与上次一致;

优缺点
加密内容不可逆,可以预防X获取落地数据。但是对没解决四个问题

应用场景
MD5、SHA-1、SHA-2等,其中SHA-2应用更广,MD5、SHA-1存在安全隐患。可以用在如保存用户密码到服务器。

共享密钥加密

加密和解密都使用相同的密钥,也叫对称加密。

交互方式
A生产共享密钥->A将P发送给B->A先将消息用P加密,然后发送给B->B收到消息后,采用密钥解密

优缺点
A向B发送共享密钥时可能会被X窃听到,所以后面的密文X一样能看,还可以使用共享密钥篡改内容;如果A向B发送带着恶意发送消息,事后不认账,B也无法确认。所以窃听、冒充、篡改、事后否认都没有彻底解决,

应用场景
凯撒密码、AES、DES、动态口令等实现了共享加密,其中AES应用最广。可以用在公司内部服务间的id加密。

公开密钥加密

加密和揭秘使用不同的密钥,也叫非对称加密

公开密钥加密算法条件

1
2
3
1.可以使用某个数值对数据进行加密;
2.使用另一个数值对加密数据进行计算可以让数据恢复原样;
3.无法从一种密钥推算另一种密钥;

交互方式
B生产公开密钥PB和私有密钥SB->B将PB发送给A->A使用PB加密消息->A将密文发送给B->B收到消息后采用SB解密

优缺点
1.加密和解密都比较耗时;
2.A无法判断公开密钥来自与B,可能是X替换后的PX,这就产生了中间人攻击,即假冒问题;

应用场景
RAS算法

混合解密

综合共享密钥解密和公开密钥加密

交互方式
B生成公开密钥PB和私有密钥SB,A生产共享密钥P->B将PB发送给A->A将P采用PB加密,并发送给B->B收到消息后采用SB解密,得带共享密钥P->A使用P加密消息并将密文发送给B->B收到消息后采用P解密

优缺点
1.解决了公开密钥耗时的问题;
2.增加了窃听、冒充的复杂程度,但是也没有完全解决共享加密的问题;

应用场景
连接服务器的SSL协议

迪菲·赫尔曼密钥交换

通过将双方共有的秘密数值隐藏在公开数值相关的运算中,来实现双方之间密钥的安全交换

算法条件
前提:密钥P、S可以合成密钥P-S

1
2
3
1.无法把密钥单独取出来,即持有P、P-S也无法取出S;
2.不管怎么合成而来的密钥,都可以与别的密钥继续合成新的密钥,如P与P-S继续可合成P-P-S;
3.密钥合成结果与合成顺序无关,只与用了哪些密钥有关,如A-B-C与B-A-C一样;

交互方式
A生成密钥P并发送给B->A、B各自生产私有密钥SA、SB->A合成新密钥P-SA,B合成新密钥P-SB->A将密钥P-SA发送给B,B将P-SB发送给A->A将收到的P-SB与SA合成SA-P-SB,B将收到的P-SA与SB合成P-SA-SB->A与B通信将采用各自得到P-SA-SB加解密消息

优缺点
完美解决了共享密钥无法安全传递的问题

应用场景
暂未想到

消息认证码

发送消息带上Mac值,属于共享加密的一种

交互方式
A、B采用迪菲·赫尔曼密钥交换方式得到共享密钥P->A使用密钥P和密文得到Mac值,并将密文和Mac一起发送给B->B收到消息后,使用密文和P校验Mac

优缺点
可以解决消息篡改问题,但是没解决事后否认问题,A、B生成的Mac一样

应用场景
计算MAC的算法有HMAC、OMAC、CMAC等,HMAC应用最广。猜测:苹果收的Mac地址

数字签名

使用类似公开密钥加密的方式生成数字签名,预防事后否认问题

  • 与公开密钥的区别
    数字签名:有消息的发送者准备公开密钥、私有密钥;
    公开密钥加密:消息接收方准备公开密钥、私有密钥;

交互方式
A准备公开密钥PA,私有密钥SA->A将PA发送给B->A使用SA加密消息(即签名)->A将消息和签名发送给B->B收到消息后使用PA对签名解密->B对解密签名后的消息与收到的消息做确认

优缺点
和公开密钥加密一样,耗时,无法确认公开密钥确实来自消息发送者;
预防了篡改和事后否认,但是没解决窃听的问题(X也可以使用公开密钥查看密文)、冒充;

应用场景
RAS

数字证书

增加认证中心解决公开密钥无法确认问题

1
A准备公开密钥PA和私有密钥SA->A向认证中心申请发行证书,证明PA是自己的->认证中心有自己的PC、SC->A将PA和包含邮箱的个人资料发送给认证中心->认证中心收到资料进行确认,没问题使用SC和A的资料生成数字签名,并把生成的签名和资料放在一起(即数字证书)发送给A->A将证书作为公开密钥发送给B->B验证证书中的个人资料是否为A,B用PC验证证书是否为认证中心给出的->B使用PC解密证书中的签名,得带PA

总结

加密算法按大的方向分:不可逆加密,对称加密,非对称加密。其他的都是为密钥的安全传输做的努力。如数字证书解决公开密钥无法确认的问题;数字签名解决事后否认的问题等等,在实际使用中,这些都需要综合在一起使用。