谈谈对称加密、非对称加密、消息摘要以及数字签名

对称加密

加密方和解密方通过相同的密钥和算法进行加密和解密,所以双方事先知道密钥,并且密钥必须严格保密。

常见的对称加密算法:

RC4、DES、3DES、AES、ChaCha20

DES 的保密性仅取决于对密钥的保密,而算法是公开的。尽管人们在破译 DES 方面取得了许多进展,但至今仍未能找到比穷举搜索密钥更有效的方法。

DES 是世界上第一个公认的实用密码算法标准,它曾对密码学的发展做出了重大贡献。目前较为严重的问题是 DES 的密钥的长度。现在已经设计出来搜索 DES 密钥的专用芯片。

前三种算法目前都被认为是不安全的,目前在TLS(HTTPS基于的传输层安全)中常用的只有 AES 和 ChaCha20

AES 的意思是“高级加密标准”(Advanced Encryption Standard),密钥长度可以是 128、192 或 256。它是 DES 算法的替代者,安全强度很高,性能也很好,而且有的硬件还会做特殊优化,所以非常流行,是应用最广泛的对称加密算法。

ChaCha20 是 Google 设计的另一种加密算法,密钥长度固定为 256 位,纯软件运行性能要超过 AES,曾经在移动客户端上比较流行,但 ARMv8 之后也加入了 AES 硬件优化,所以现在不再具有明显的优势,但仍然算得上是一个不错算法。

对称加密的加密和解密需要使用相同的密钥,所以需要解决密钥配送问题,传输的过程必须安全。密钥管理也比较麻烦。

对称算法还有一个“分组模式”的概念,目前常见的对称加密算法都是属于分组密码,分组密码是每次只能处理特定长度的一块(block)数据的一类加解密算法。 分组模式可以打破这种束缚,使固定长度的密钥能够加密任意长度的明文。

最早有 ECB、CBC、CFB、OFB 等几种分组模式,但都陆续被发现有安全漏洞,所以现在基本都不怎么用了。最新的分组模式被称为 AEAD(Authenticated Encryption with Associated Data),在加密的同时增加了认证的功能,常用的是 GCM、CCM 和 Poly1305。

把上面这些组合起来,就可以得到 TLS 密码套件中定义的对称加密算法。

比如,AES128-GCM,意思是密钥长度为 128 位的 AES 算法,使用的分组模式是 GCM

非对称加密

需要两个密钥,公钥和私钥是一对,公钥加密的只能用私钥解,私钥加密的只能用公钥解,保护私钥,公开公钥。

常见的非对称加密算法:

DH、DSA、RSA、ECC

谈谈对称加密、非对称加密、消息摘要以及数字签名

非对称加密的特点:
+ 若密钥能够实现安全交换,那么有可能会考虑仅使用非对称加密来通信。但是非对称加密与对称加密相比,其处理速度要慢。
+ 任何加密方法的安全性取决于密钥的长度,以及攻破密文所需的计算量。在这方面,非对称加密并不比传统加密体制更加优越
+ 由于目前非对称加密的开销较大,在可见的将来还不会放弃传统的加密方法
+ 公钥需要密钥分配协议,具体的分配过程并不比采用传统加密方法时更简单

RSA的安全性使基于“整数分解”的数学难题,使用两个超大素数的乘积作为生成密钥的材料,想要从公钥推算出私钥是非常困难的。

10 年前 RSA 密钥的推荐长度是 1024,但随着计算机运算能力的提高,现在 1024 已经不安全,普遍认为至少要 2048 位。

ECC(Elliptic Curve Cryptography)是非对称加密里的“后起之秀”,它基于椭圆曲线离散对数的数学难题,使用特定的曲线方程和基点生成公钥和私钥,子算法 ECDHE 用于密钥交换,ECDSA 用于数字签名。

比起 RSA,ECC 在安全强度和性能上都有明显的优势。160 位的 ECC 相当于 1024 位的 RSA,而 224 位的 ECC 则相当于 2048 位的 RSA。因为密钥短,所以相应的计算量、消耗的内存和带宽也就少,加密解密的性能就上去了,对于现在的移动互联网非常有吸引力。

消息摘要

将信息以某种算法加密后就不可以解密,只有相同的文本以同样的方法加密可以得到同样的密文。

常见的摘要算法:

MD5、SHA-1、SHA-256

消息摘要算法使用的是一个单向散列函数,也称为消息摘要函数(message digest function)、哈希函数,适用于检查消息完整性的加密技术。

单向散列函数有一个输入和一个输出,其中输入称为信息,输出称为散列值。单向散列函数可以根据消息的内容计算出散列值,篡改后的信息的散列值计算结果会不一样,所以散列值可以被用来检查消息的完整性。

消息摘要算法存在哈希冲突,即不同的消息经消息摘要算法加密后,可能是相同的密文,所以不能说密文一致源数据就一致。

尽管消息摘要不能解密,但只要知道该消息摘要的算法,使用足量的数据进行加密操作,可以得到字典(或彩虹表),即能知道由哪些信息可以通过消息摘要获取该密文。但是好的消息摘要算法会尽可能避免碰撞,并且难以让攻击者根据密文找到能发生哈希冲突的信息。(消息摘要算法越复杂越难使用这种方法解密)

sha 比 md5 更安全一些,sha 比 md5 哈希碰撞的概率更小一些。

消息摘要算法的应用:

密码

利用单向散列加密的特性,可以进行密码加密保存,即用户注册时输入的密码不直接保存到数据库,而是对密码进行单向散列加密,将密文存入数据库,用户登录时,进行密码验证,同样计算得到输入密码的密文,并和数据库中的密文比较,如果一致,则密码验证成功。

这样保存在数据库中的是用户输入的密码的密文,而且不可逆地计算得到密码的明文,因此即使数据库被拖库(指网站遭到入侵后,黑客窃取其数据库),也不会泄露用户的密码信息。

为了加强单向散列计算的安全性,还会给散列算法加点盐,salt 相当于加密的密钥,增加破解的难度。盐一般都是跟 hash 一起保存在数据库里,或者作为 hash 字符串的一部分。salt是由系统随机生成的,并且只有系统知道。 这样,即便两个用户使用了同一个密码,由于系统为它们生成的 salt 值不同,他们的散列值也是不同的。

数字签名

参考链接: 数字签名是什么? - 阮一峰的网络日志

数字签名的特性是:

  • 别人不能冒充我的签名(不可伪造)
  • 我也不能否认上面的签名是我的(不可抵赖)

数字签名又是靠什么保证不可伪造和不可抵赖两个特性呢?

答案是利用非对称加密。

这样,如果你生成了一对 RSA 密钥,你把公钥公布出去,并告诉全世界人这个公钥是你的。之后你只要在发送的消息,比如“123456”,后面加上用私钥加密过的密文,其他人拿公钥解密,看解密得到的内容是不是“123456”就可以知道这个“123456”是不是你发的。

其他人因为没有对应的私钥,所以没法生成公钥可以解密的密文,所以是不可伪造的。

又因为公钥对应的私钥只有一个,所以只要能成功解密,那么发消息的一定是你,不会是其他人,所以是不可抵赖的。

由于直接对原消息进行签名有安全性问题,而且原消息往往比较大,直接使用 RSA 算法进行签名速度会比较慢,所以我们一般对消息计算其摘要(使用 SHA-256 等安全的摘要算法),然后对摘要进行签名。只要使用的摘要算法是安全的(MD5、SHA-1 已经不安全了),那么这种方式的数字签名就是安全的。

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/%e8%b0%88%e8%b0%88%e5%af%b9%e7%a7%b0%e5%8a%a0%e5%af%86%e3%80%81%e9%9d%9e%e5%af%b9%e7%a7%b0%e5%8a%a0%e5%af%86%e3%80%81%e6%b6%88%e6%81%af%e6%91%98%e8%a6%81%e4%bb%a5%e5%8f%8a%e6%95%b0%e5%ad%97%e7%ad%be/

发表评论

电子邮件地址不会被公开。