最近在看《我的第一本算法书》,准备写点数据结构与算法系列博客。看完后感觉加密算法也很有意思,于是就有了这篇文章。
为什么需要加密
互联网传输数据时面临着四个问题:
1 | 窃听:A向B发送消息可能会在传输途中被X偷看; |
要解决上述问题,很自然的就想到了对信息加密。
加密算法分类
哈希函数
哈希函数是把给定的数据转换成固定长度的无规律数值
哈希函数要求
1 | 1.输出的哈希值数据长度不变; |
交互方式
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 | 1.可以使用某个数值对数据进行加密; |
交互方式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 | 1.无法把密钥单独取出来,即持有P、P-S也无法取出S; |
交互方式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 |
总结
加密算法按大的方向分:不可逆加密,对称加密,非对称加密。其他的都是为密钥的安全传输做的努力。如数字证书解决公开密钥无法确认的问题;数字签名解决事后否认的问题等等,在实际使用中,这些都需要综合在一起使用。