加密算法

互联网传输数据时可能会发生的四个主要问题

  • A向B发送的消息可能会在传输途中被X偷看。这就是"窃听"(使用加密)
  • A向B发送的消息可能会在传输途中被X截取,然后返回给A(A以为发送给了B)。然后X再以A的身份向B发送信息(B以为是A发送的)。这就是"假冒"(消息认证码或数字签名)
  • A向B发送的消息可能会在传输途中被X修改,这就是"篡改"(消息认证码或数字签名)
  • B从A那里收到了消息,但作为消息发送者的A可能对B抱有恶意,并在事后声称"这不是我发送的消息",这就是"事后否认"(数字签名)

数字签名技术无法确认公开密钥的制作者,想要解决这个问题,可以使用数字证书技术

哈希函数

哈希函数的算法中具有代表性的是MD5、SHA-1和SHA-2等。其中SHA-2是现在应用较为广泛的一个,而MD5和SHA-1存在安全隐患,不推荐使用

对称加密

加密和解密都使用相同密钥,称为对称加密(也可叫作:共享密钥加密)

常见的算法有:凯撒密码、AES、DES、动态口令等,其中AES应用最为广泛

共享密钥如果是双方各自保存(不在网络中传输的话,相对安全),但是有些场景是需要先动态获取共享密钥,再进行加密,这样是有安全隐患的,比如:

A要向B发送消息,先问B要一个密钥,此时密钥被X窃听了

然后A使用密钥加密数据,发送给B,此时X就可以使用密钥进行解密了

甚至X可以修改内容后,再次加密,然后发送给B

非对称加密

加密和解密分别使用不同密钥,称为非对称加密(也可叫作:公开密钥加密)

加密用的密钥叫作"公开密钥",解密用的叫作"私有密钥"

常见的算法有:RSA、椭圆曲线加密算法等,其中RSA应用最为广泛

上面说的动态获取共享密钥存在安全隐患的问题,可以使用非对称加密的方式解决(因为发布出去的公钥只能加密,解密需要使用私钥)

而且还解决了另外一个问题,一个私钥可以有N个公钥,假设发布给100个人,如果是共享密钥,那就需要100对,而非对称加密的话,只需要一个私钥就行了

但是,非对称加密的性能要比对称加密要差很多,所以不适合直接用于直接加密整个内容

当时,使用非对称加密技术,依然会有安全隐患,比如:

A要向B发送内容,于是问B要了公钥PB,此时公钥被X篡改了(X生成了自己的密钥对),然后把公钥PX给了A

然后A使用PX加密,并将内容发送给B,此时X截取了A发送的内容,然后用自己的私钥进行解密,进行窃听

甚至可以将解密后的内容篡改,然后用PB加密,再发送给B

这种通过中途替换公开密钥来窃听数据的攻击方法叫作"中间人攻击"(man-in-the-middle attack)

后面所说的混合加密和迪非-赫尔曼密钥交换依然可以被中间人攻击,只是攻击难度更大了而已

混合加密

前面说到的非对称加密的性能问题,可以使用共享密钥加密数据,使用公开密钥加密共享密钥的方式来优化

A向B索要公钥PB,然后用PB加密共享密钥,然后将加密后的共享密钥发送给B

A使用共享密钥加密数据,并发送给B

B使用私钥解密共享密钥,再使用解密后的共享密钥解密数据

像这样,混合加密在安全性和处理速度上都有优势。能够为网络提供通信安全的SSL协议也应用了混合加密方法

迪非-赫尔曼密钥交换

假设有一种方法可以合成两个密钥。使用这种方法来合成密钥P和密钥S,就会得到由这两个密钥的成分所构成的密钥P-S

  • 密钥之间可以合成,但不能分解。如:即使持有密钥P和合成的密钥P-S,也无法把密钥S单独取出来
  • 不管是怎样合成而来的密钥,都可以把它作为新的元素,继续与别的密钥进行合成。如:使用密钥P和密钥P-S,还能合成出新的密钥P-P-S
  • 密钥的合成结果与合成顺序无关,只与用了哪些密钥有关。比如合成密钥B和密钥C后,得到的是密钥B-C,再将其与密钥A合成,得到的就是密钥A-B-C。而合成密钥A和密钥C后,得到的是密钥A-C,再将其与密钥B合成,得到的就是密钥B-A-C。此处的密钥A-B-C和密钥B-A-C是一样的

A生成密钥P,然后将密钥P发送给B

A和B各自准备自己的私有密钥SA和SB

A利用密钥P和私有密钥SA合成新的密钥P-SA

B也利用密钥P和私有密钥SB合成新的密钥P-SB

A将密钥P-SA发送给B,B也将密钥P-SB发送给A

然后各自把SA和SB再次进行合成,因为合成的结果和顺序无关,所以SA-P-SB和SB-P-SA相同

然后将SA-P-SB和SB-P-SA作为加密密钥和解密密钥来使用

使用迪菲-赫尔曼密钥交换,通信双方仅通过交换一些公开信息就可以实现密钥交换。但实际上,双方并没有交换密钥,而是生成了密钥。因此,该方法又被叫作"迪菲-赫尔曼密钥协议"

消息认证码

消息认证码可以实现“认证”和“检测篡改”这两个功能

A生成了一个用于制作消息认证码的密钥,然后使用安全的方法将密钥发送给了B

A使用密文和密钥生成一个值,比如:使用MD5算法。这个由密钥和密文生成的值就是消息认证码,简称为MAC(Message Authentication Code)

A将MAC和密文一起发送给B

和A一样,B也需要使用密文和密钥来生成MAC,然后比对MAC值是否一致

计算MAC的算法有HMAC、OMAC、CMAC等,目前,HMAC的应用最为广泛

然而,这种方法也有缺点。在使用消息认证码的过程中,AB双方都可以对消息进行加密并且算出MAC。也就是说,我们无法证明原本的消息是A生成的还是B生成的

因此,假如A是坏人,他就可以在自己发出消息后声称“这条消息是B捏造的”,而否认自己的行为。如果B是坏人,他也可以自己准备一条消息,然后声称“这是A发给我的消息”

数字签名

数字签名不仅可以实现消息认证码的认证和检测篡改功能,还可以预防事后否认问题的发生

公开密钥加密中,加密使用的是公开密钥,解密使用的是私有密钥。任何人都可以使用公开密钥对数据进行加密,但只有持有私有密钥的人才能解密数据。然而,数字签名却是恰恰相反的

A将公开密钥发送给B

A使用私有密钥加密消息。加密后的消息就是数字签名

A将消息和签名都发送给了B

B使用公开密钥对密文(签名)进行解密

生成的是“只能由持有私有密钥的A来加密,但只要有公开密钥,谁都可以进行解密的密文”。这个密文作为密码似乎没有任何意义。但是换一个角度来看就会发现,它可以保证这个密文的制作者只能是持有私有密钥的A

由于B只有公开密钥,无法生成A的签名,所以也预防了“事后否认”这一问题的发生

公开密钥加密的加密和解密都比较耗时。为了节约运算时间,实际上不会对消息直接进行加密,而是先求得消息的哈希值,再对哈希值进行加密,然后将其作为签名来使用

数字证书

虽然使用数字签名后B会相信消息的发送者就是A,但实际上也有可能是X冒充了A

因为使用公开密钥加密无法确定公开密钥的制作者是谁。收到的公开密钥上也没有任何制作者的信息。因此,公开密钥有可能是由某个冒充A的人生成的

“公开密钥加密”和“数字签名”无法保证公开密钥确实来自信息的发送者。因此,就算公开密钥被第三者恶意替换,接收方也不会注意到。不过,使用数字证书就能保证公开密钥的正确性

results matching ""

    No results matching ""