skip to content

TLS/SSL 入门 01 - 对称加密

/ 7 min read

📑 目录

概述

最近在看 https, 今天下班比较早正好写篇博客把之前看的整理整理

TLS 的内容其实有很多,一次性不可能把它讲全, 但基本脉络得理清楚

  1. 我们最常用的加密算法必然是: 对称加密算法, 所以第一部分先讲对称加密

  2. 后面到 1976年的时候, Whitfield DiffieMartin Hellman 发表了 New Directions in Cryptography 提出了一种新的 非对称公钥-私钥密码系统, 即 DH密钥交换 的思想, 到了 1977 年 麻省理工学院的 Ron Rivest,Adi Shamir 和 Leonard Adleman 才完成了 RSA的构想. 第二部分, 我们来聊聊 RSA, DH密钥交换相关的非对称加密的内容

  3. 而后来 1995年 SSL3.0 发布, 1999 年 TLS1.0, 2006年 TLS1.1, 2008年 TLS1.2, 2018年 TLS1.3, 直到现在越来越多的网站都在 TLS 的保护下进行安全访问. 那第三部分, 我们具体来聊聊 TLS 握手的过程.

对称加密

异或与填充

目前广泛应用的对称加密主要使用的两种手段结合, 一个是 异或, 另一种是填充

对称加密能够使用一把秘钥同时进行加密或者解密, 主要是基于 XOR 异或运算

如果a、b两个值不相同,则异或结果为1。

如果a、b两个值相同,异或结果为0

但这种方法有缺点, 需要与明文等长的秘钥, 于是我们需要另一种手段: 填充, 使用填充我们可以将明文变成与密钥一样的长度

填充

明文分组后, 最后一块明文块 block 一般都需要填充, 这时候需要一个填充算法

我们简单的根据不同单位来区分不同填充

  • 位填充: 以 bit 位作为单位来填充
    • 第一个填充的位为 1 , 剩余的位为 0
    • 比如要填充下面的二进制数据到 4个字节, 下面的例子中填充了 5bit (10000)
      • 0101 0100 1011 0000
  • 字节填充: 以字节为单位来填充
    • 有很多标准, 不同标准填充方法不同
    • 补零: 直接在数据后面补零直到 block 结束
    • ANSI X9.23
      • 总是将1到8个字节作为填充添加。该块填充有随机字节(尽管许多实现使用00),并且该块的最后一个字节设置为添加的字节数。
      • 在下面的示例中,块大小为8字节,并且需要填充4字节(十六进制格式)
      • … DD DD DD DD DD DD DD DD , DD DD DD DD 00 00 00 04
    • PKCS7
      • 首先计算一共需要填充几个字节, 然后把这个字节数重复直到填充结束
      • 在下面的示例中,块大小为8个字节,填充为4个字节
      • … DD DD DD DD DD DD DD DD , DD DD DD DD 04 04 04 04

但大家也会想到, 明文如果比密钥长怎么办呢? 于是就有了 分组加密工作模式

分组工作模式

  • Block cipher mode of operation

密码学中,分组密码的工作模式允许使用同一个分组密码密钥对多于一块的数据进行加密,并保证其安全性。

分组密码自身只能加密长度等于密码分组长度的单块数据,若要加密变长数据,则数据必须先被划分为一些单独的密码块。

通常而言,最后一块数据也需要使用合适填充方式将数据扩展到符合密码块大小的长度

---- 分组密码工作模式

  • 以下部分不同类型的分组密码工作模式

  • ECB electronic codebook 工作模式

    • 直接将明文分解为多个块, 对每个块独立加密
    • 秘钥 + 明文 一对一加密
  • CBC cipher-block chaining 密码链模式

    • 每个明文块都与前一个密文块进行异或
    • 在这种方法中,每个密文块都依赖于它前面的所有明文块。同时,为了保证每条消息的唯一性,在第一个块中需要使用初始化向量。
    • 缺点: 只能串行化运行, 不能并发
  • CTR counter mode 或 integer counter mode 计数器模式

    • 通过递增一个加密计数器以产生连续的秘钥流
    • 缺点: 不能提供密文消息的完整性校验
  • GCM Galois/counter (GCM)

    • 计数器模式 + 消息认证码(可以认为是一种 hash 函数)
    • 解决了 CTR 的缺点

我们一般在工程中使用 GCM

举例

AES 算法

  • Advanced Encryption Standard 高级加密标准
  • 常用填充算法 PKCS7
  • 常用分组模式 GCM
  • 加密步骤
    1. 将明文按照 128 bit (AES-128) 分成若干明文块, 每块是 4*4 的矩阵
    2. 填充最后一个明文块
    3. 每个明文块利用AES加密器和秘钥, 加密成密文块
    4. 拼接

参考

  1. block cipher mode of opertion 分组工作模式
  2. 填充算法