本文借鉴《我的第一本算法书》,算是对自己学习的总结,也希望分享下所学知识~~
通过互联网交换数据,数据要经过各种各样的网络和设备才能传到对方,
数据再传输过程中可能会经过某些恶意用户的设备,从而导致内容被窃取。
传输数据时的四个问题:
1.窃听:A给B发的消息在传输途中被X偷看
2.假冒:A以为给B发了消息,但是B是冒充的;B以为A收到了消息,但是A也有可能是冒充的
3.篡改:B确实收到了A的消息,单在途中就被X更改了
4.事后否认:B从A那里收到了消息,但作为消息发送者的A可能对B抱有恶意,不承认这是我发的消息
1.加密基础知识
A发送之前加密,B收到之后解密
对于计算机来说,图片、文本、音频都是用二进制来表示的,数据就是一串有意义的数字罗列
密文也是 数字罗列,只不过他是计算力无法理解的无规律的数字罗列
2.哈希函数
哈希函数可以把给定的数据转换成固定长度的无规律数值
输入相似的数据不会导致输出相似的哈希值
即使输入完全不同的数据,输出的哈希值可能是相同的,哈希冲突。
哈希值是不能反向推出原本的数据
代表:MD5、SHA-1(安全哈希算法(Secure Hash Algorithm))、SHA-2
不同的算法计算的方式也不同,比如SHA-1需要经过数百次的加法和位移运算才能生成哈希值
eg:将用户输入的密码的哈希值保存到数据库内,如果把明文直接保存到数据库,可能被窃听。
3.共享密钥加密
共享密钥加密是加密和解密都使用相同密钥的一种加密方法。
由于使用的密钥相同,也被称为:对称加密。
代表:凯撒密码、AES、DES、动态口令等
AES的应用最为广泛
凯撒密码:最简单且最广为人知的加密技术,替换加密技术,明文中所有字母都在字母表上向前或者后一个固定的数目进行偏移
AES:高级加密标准(英语:Advanced Encryption Standard,缩写:AES)
DES:DES全称为Data Encryption Standard,即数据加密标准
存在的问题:如何安全的把密钥发过去?
4.公开密钥加密
由于使用的密钥不同,所以这种算法也被称为:非对称加密。
加密用的密钥叫做:公开密钥,解密用的密钥叫做:私有密钥
首先接收方码生成公开密钥和私有密钥
然后把公开密钥发送给A
A使用B发来的公开密钥加密数据
B收到后使用私有密钥进行解密,就得到了原本的数据
代表:RAS算法、椭圆曲线加密算法
RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。
解决的问题:虽然公开密钥可能被窃听,但是使用公开密钥无法解开密文
还存在的问题:
X想要窃听A发给B的数据
X也准备了公开密钥和私有密钥
在B把公开密钥发给A的时候,X把这个公开密钥替换成自己的公开密钥
A收到这个密钥后,他不知道是谁生成的,所以不会发现问题,继续发送
X收到了这个密文,就可以用自己的私有密钥解密,自定义修改
再通过B的公开密钥进行加密,发送给B
这样B也不会感觉到有任何问题
通过中途替换公开密钥来窃听数据的攻击方法:中间人攻击
存在的问题:A无法判断收到的公开密钥是否来自B
性能问题:加密和解密都比较耗时,不适合发送持续零散的数据,要想解决这个问题可以用:混合加密。
5.混合加密
共享密钥存在无法安全传输密钥的密钥分配问题,公开密钥加密又存在解密速度较慢的问题。
结合两种方法实现互补的方法:混合加密
用处理速度较快的共享密钥加密对数据进行加密。
B先生成公开密钥和私有密钥
B将公开密钥发送给A
A收到公开密钥,对共享密钥加密,再把加密的后密钥发送给B
B使用私有密钥进行解密,这样双方就有了共享密钥
然后通过共享密钥进行加密发送数据
代表:为网络提供通信安全的SSL协议也应用了混合加密方法
SSL:Secure Sockets Layer 安全套接层
如今已经升级改名为TLS:Transport Layer Security 传输层安全
因此该协议也被称为SSL/TLS
6.迪菲-赫尔曼(Diffie-Hellman)密钥交换
是一种可以在通信双方之间安全交换密钥的方法。
假设有一种方法可以合成两个密钥。使用这种方法合成密钥P和密钥S就为密钥PS
特征:
1.即使持有密钥P和密钥PS,无法得到密钥S
2.合成后的密钥还可以继续合成
3.密钥的合成结果与顺序无关,PAS=APS
实际算法:
由A准备一个非常大的素数P、与其所对应的生成元中的一个G
A将P、G发送给B
B收到后,AB分别准备了各自的神秘数字XY(XY都必须小于P-2)
AB分别计算 G的秘密数字次方 对 P 取模(比如A:G^x mod P)
然后AB分别将自己的计算结果发送给对方
收到后,先计算这个值的秘密次方(比如A:G^x mod P ^ x),然后再对 P 取模(G^x mod P ^ x mod P = G^xy mod P)
这样AB共同拥有了加密密钥的数字: G^xy mod P
若存在X窃听整个通信过程,得到的只有:P、G、G^x mode P、G^y mod P,无法得到 G^xy mod P
根据素数P、生成元G和 G^x mode P 求出X的问题就是”离散对数问题“,至今还没找到解法,此算法正是利用了这个难题
实际上,双方并没有交换密钥,而是生成了新的密钥,也被称为:迪菲-赫尔曼密钥协议
7.消息认证码
消息认证码可以实现 认证 和 检测篡改 这两个功能。
密文的内容再传输过程中可能会被篡改,这会导致解密后的内容发生变化,从而产生误会。
之前一切正常进行,密钥交换以及加密传输
当A正要给B发消息时候,这个密文被X恶意篡改了,而B没有意识到这个问题,
本来发送的是ABC,被篡改后解密得到XYZ,就会返回错误的信息。
解决办法:
A又生成了一个用于制作消息认证码的密钥,然后用安全的方法将密钥发送给B
A使用密文和密钥生成一个值,这个值就是 消息认证码(简称MAC:Message authentication code)
当B收到后,也需要用密文和密钥生成一段MAC,如果一直的话,就没问题。
计算MAC的算法有:HMAC(Hash-base MAC)、OMAC(One-key MAC)、CMAC(Cipher-based MAC)
目前HMAC用途最为广泛
存在的问题:因为双方都能生成MAC、无法证明原本的消息是由A还是B生成的
假如A是坏人,可以发出消息后声称,这个条消息是B捏造的,从而否认自己的行为
8.数字签名
数字签名不仅可以实现消息认证码的认证和检测篡改功能,还能预防事后否认问题的发生
数字签名是只有发信人才能生成的,因此使用它就可以确定谁是消息的发送者。
发送者准备好私有密钥和公有密钥
发送者A将公开密钥发送给B,A再使用私有密钥加密消息,加密后的消息就是数字签名。
B使用公开密钥进行解密,看是否和收到的消息一致
公开密钥加密和解密都比较耗时。实际上都不对消息进行直接加密,先求哈希值,再对哈希值进行加密,然后将其作为签名使用
存在的问题:使用公开密钥无法确定公开密钥的制作者是谁。因为公开密钥有可能是某个冒充A的人生成的
9.数字证书
之前的方法都无法保证公开密钥确实来自信息的发送者
就算公开密钥被第三者恶意替换过,接收方也不会注意到
数字证书,就能保证公开密钥的正确性
A持有公开密钥和私有密钥,想把公开密钥发送给B
A首先要向认证中心(CA:Certification Authoriry)申请发行证书,证明公开密钥确实是自己生成的
认证中心有他们自己的公开密钥和私有密钥
A将公开密钥和包含邮箱信息的个人资料发送给认证中心
认证中心对这个资料进行确认,判断是否为A本人,之后根据自己的私有密钥,根据A的资料生成签名
认证中心再将生成的数字签名和资料放进同一个文件中,把这个文件发送给A,这个文件就是A的数字证书
A把这个作为公开密钥的数字证书发送给B,
B收到数字证书后,确认邮件地址确实是A的地址,然后B获取认证中心的公开密钥,对证书内签名进行验证,判断是否为认证中心给出的签名
确认之后,从中取出公开密钥,这样就OK了
数字证书就是像这样通过认证中心来担保公开密钥的制作者。
这一些列技术规范被统称为:公钥基础设施 (Public Key Infrastructure PKI)