加密算法介绍

加密算法

对称加密算法

对称加密指在加密和解密过程中采用同一个密钥的加密算法,通信双方都需要拥有密钥文件。

对称算法分为两类:一类是对明文中的单个位或字节进行加密的流加密,另一类是将明文进行等长分组并分别进行加密的分组加密。其中分组加密按模式划分为下面五种,模式之间的区别在这就不深入了。

  • ECB 模式:Electronic CodeBook mode(电子密码模式)
  • CBC 模式:Cipher Block Chaining mode(密码分组链接模式)
  • CFB 模式:Cipher FeedBack mode(密文反馈模式)
  • OFB 模式:Output FeedBack mode(输出反馈模式)
  • CTR 模式:CounTeR mode(计数器模式)

对称加密算法的优势在于加解密的高速度和常用于对敏感数据等信息进行加密,常见的算法有:

  • DES

    数据加密标准(Data Encryption Standard)是一种对称密钥加密块密码算法,它以 64 位为分组,使用 56 位密钥对明文数据进行加密

    由于密钥位数过短,目前已不是一种安全的加密算法

  • 3DES

    三重数据加密算法(Triple Data Encryption Algorithm)也是一种对称密钥加密块密码算法,它对每个每个明文数据块进行三次 DES 加密。

    3DES 使用’密钥包’(包含 3 个 DES 密钥)对明文数据进行加解密,总密钥长度为 3 * 56;但由于中途相遇攻击,有效安全性只有 112 位。

    加密过程为:
    $$
    Ciphertext = Encrypt_k3(Decrypt_k2(Encrypt_k1(Plaintext)))
    $$
    解密过程为:
    $$
    Plaintext = Decrypt_k1(Encrypt_k2(Decrypt_k3(Ciphertext)))
    $$

  • AES

    高级加密标准(Advanced Encryption Standard)是用于替代 DES 的块加密算法;AES 的区块长度固定为 128Bit,密钥长度支持 128、192 或 256Bit。

非对称加密算法

非对称加密,也叫公开密钥加密,加解密时需要两个密钥,一个用于加密,另一个用于解密;用其中一个密钥加密后所得的密文,只能通过对应的另一个密钥解密得到明文。

理论上公钥和私钥是相等的,公钥加密的信息私钥可以解密,私钥加密的信息公钥也可以解密,但是考虑到公钥是共享的,应避免使用私钥来加密传输信息。在实际应用中谁是公钥谁是私钥,根据不同的用途来定。

  • 加密
    • B 通过公钥对发送的信息进行加密
    • A 采用私钥对信息进行解密
  • 数字签名
    • A 对信息原文进行一次哈希(md5、sha1 等),并用私钥加密这段哈希作为签名
    • A 将信息原文和签名一起发送出去
    • B 用公钥解密签名,如果解密成功且解密出来的哈希值与信息原文一致,那么就可以确保信息的完整性和真实性
  • 认证:以常见的数字证书(Digital Certificate)认证为例,CA(Certificate Agent) 中存放 A、B 数字证书,在数字证书里包含有各自的公钥与加密算法
    • A 向 CA 请求 B 的数字证书
    • CA 对 B 的数字证书做一次哈希,并用私钥加密这段哈希,生成数字签名
    • CA 将 B 的数字证书和上面生成的数字签名一起发送给 A
    • A 通过 CA 的公钥加密 CA 发送的内容得到一个哈希,同时在接收到的 B 的数字证书进行一次哈希,如果两个哈希值一样,则表明 B 的数字证书可靠
    • A 请求认证 B,B 用自己的私钥加密自己的身份信息并发送给 A,
    • A 用上面获取到的 B 的数字证书中的公钥解密 B 发送的信息,如果解密成功,则代表认证成功
    • 反之,B 认证 A 的过程也一样

常见的非对称加密算法有:

  • RSA

    RSA 算法是一种由 Rivet、Shamir、Adelman 提出了的支持变长密钥的公共密钥算法;其基础是数论的 Euler 定理,安全性基于大整数因子分解问题的困难性,公私钥是一对大素数的函数。

  • ECC

    ECC 算法是由 N.Koblitz 和 Miller 提出将椭圆曲线用于密码算法,全称:Elliptic curve cryptography,缩写为 ECC,是一种基于有限域上的椭圆曲线上的点群中的离散对数问题 ECDLP 的公开密钥加密算法。

    相比其它算法,ECC 可以通过更短的密钥大小来实现相当或更高级的安全;但其加解密的耗时会相对更长。

  • DSA

    DSA(Digital Signature Algorithm,数字签名算法),不能用于加解密,主要用于数字签名,验证数据的完整性和数据发送者的身份。

ECC 和 RSA 相比,在很多方面都有优势,具体的优势主要体现在以下几方面:

  • 密钥长度

    在同等安全等级的情况下,ECC 生产的密钥位数比 RSA 的短,一般认为 160 位密钥的 ECC 的安全性相当于 1024 位密钥的 RSA;另外,随着安全等级的提升,ECC 密钥长度呈线性增长,而 RSA 密钥长度呈指数增长。

  • 性能

    在生成公私钥的场景中,RSA 所需的时间高于 ECC,而且随着安全等级的提升,RSA 所需的时间呈指数增长,而 ECC 所需的时间呈线性增长;

    在生成签名的场景中,RSA 所需的时间同样高于 ECC;

    在验签的场景中,RSA 的效率要高于 ECC;

    image-20190709143358838

Hash 函数

Hash 函数(也叫散列函数)将一段数据(消息)压缩成固定长度的由随机数字和字母组成的哈希值(Hash Value)。哈希值也叫信息摘要(Message Digest)或指纹(Fingerprint)

Hash 函数需要满足以下几个条件:

  • 确定性

    给定任意长度的消息能够压缩成固定长度的哈希值,且相同的消息生成的哈希值是一样的

  • 高效性

    给定任意一个消息,能够在短时间内计算出哈希值

  • 单向性

    单向性是指无法通过哈希值反算出消息

  • 抗碰撞性

    碰撞(collision)指存在不同消息产生相同哈希值的情况;哈希函数无法完全避免碰撞,只能降低发生碰撞的概率。

    抗碰撞性分为两种:弱抗碰撞性和强抗碰撞性。弱抗碰撞性指很难找到和给定消息具有相同哈希值的另一条消息。强抗碰撞性指很难找到哈希值相同的两条不同的消息。

常见的 Hash 函数有:

  • MD

    MD(Message Digest)4 和 MD5 都是由 Rivest 于 1990 年设计的,两者都能产生 128 Bit(16 Byte)的哈希值。目前 MD5 的强抗碰撞性已经被攻破,已经不安全了。

  • SHA

    SHA(Secure Hash Algorithm) 是 NSA(美国国家安全局)设计,NIST(美国国家标准与技术研究院)发布的一系列单向散列函数,是以 MD4 和 MD5 类似的原理为基础来设计的。

    SHA-1 能产生 160 Bit(20 Byte)的哈希值,消息长度是有上限的,上限为 (2^64 - 1) Bit;2017 年 Google 正式宣布攻破 SHA-1

    SHA-2 用于替代 SHA-1,其包含 6 种不同的算法标准:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256

    SHA-3 是一种作为新标准发布的哈希函数算法,用于替代之前在理论上已被找出攻击方法的 SHA-1;SHA-3 的出现并非意味着 SHA-2 不安全,在一段时间内,SHA-2 和 SHA-3 将共存

参考