如何让你的密码更安全?(一) - 对称加密
密码学,是任何认证、授权、审计的支撑。失去了密码学的保障,任何机制都是一场空。
现实中,密码学的应用非常广泛:银行密码的保护、网络流量的传输加密、电子邮件的安全传输,都用到了各种各样的加密技术。
‘钥’怎么读?
公钥、私钥、密钥词组中,yào 和 yuè 两个读音的关系是文白异读,yuè 是文读,yào 是白读。
在安全领域中,‘钥’,专用读作‘yuè’。
S 盒?
在密码学中,S 盒(Substitution-Box,替换盒)是加密算法中执行替换计算的基本结构。
在块密码中,通常被用于模糊密钥和密文之间的关系,提供非线性变换,通过混淆来抵抗统计分析和差分密码分析等攻击。
加密算法
接下来,介绍一些经典的密码学算法:对称加密算法、非对称加密算法和散列算法。
对称加密算法
对称加密算法,又称为共享密钥加密算法,是指加密和解密使用相同密钥的加密算法。如图所示:
发送方发一段文字,但是不想让别人看到,会使用加密算法,用密钥对这段文字加密,生成对应的密文,发送给接收方;
接收方收到这段密文,但是由于加密了并不清楚发送方发送了什么内容,就需要使用解密算法,用相同的密钥进行解密,获取到原文。
我们常见的对称加密,DES、AES、国密 SM1(不公开)、国密 SM4。
DES
DES(Data Encryption Standard,数据加密标准),是一种典型的块密码,一种将固定长度的明文通过一系列复杂的操作变成同样长度的密文的算法。
对 DES 而言,块长度为 64 位。密钥表面上是 64 位的,然而只有其中的 56 位被实际用于算法,其余 8 位可以被用于奇偶校验,并在算法中被丢弃。因此,DES 的有效密钥长度仅为 56 位。
- 基本原理
- DES 是一种分组加密算法,它将明文分成 64 位的数据块进行加密
- 加密过程中,会使用一个长度为 56 位的密钥
- DES 使用 Feistel 网络结构,通过多轮迭代进行加密和解密操作
- 历史背景
- DES 最初由 IBM 开发,并于 1977 年被美国国家标准局(NBS,现在的 NIST)确定为联邦资料处理标准
- 安全性
- 由使用的密钥长度仅为 56 位,能够被暴力破解,已经不是一种安全的加密方法
- 1999 年 1 月,distributed.net 与电子前哨基金会合作,在 22 小时 15 分钟内即公开破解了一个 DES 密钥
- 替代方案
- 为了增强安全性,可以使用 DES 的派生算法 3DES 来进行加密
- DES 标准和 3DES 标准已逐渐被高级加密标准(AES)所取代
- 应用场景
- 在某些遗留系统中仍然有应用,但由于安全性问题,现在已被逐步淘汰
- 在一些特定的嵌入式系统或硬件加密模块中,DES 仍然可能被使用
AES
AES(Advanced Encryption Standard,高级加密标准),是美国联邦政府采用的一种区块加密标准。它取代了之前的 DES 成为了新的标准。
- 基本原理
- AES 是一种分组加密算法,它将明文分成 128 位(16 个字节)的数据块进行加密
- 加密过程中,会使用一个长度为 128 位、192 位、或 256 位的密钥
- AES 使用 Feistel 网络结构,通过多轮迭代进行加密和解密操作,加密轮数取决于密钥长度:
- 128 位密钥:10 轮
- 192 位密钥:12 轮
- 256 位密钥:14 轮
- 历史背景
- Rijndael 是由 Daemen 和 Rijmen 早期所设计的 Square 改良而来,而 Square 则是由 SHARK 发展而来。
- 安全性
- AES 算法的安全性依赖于密钥的长度,密钥越长,算法的安全性越高。
- AES 被认为是目前非常安全的加密算法之一,尽管存在针对其实现的各种侧信道攻击,但其核心算法至今未被破解。
加密过程
AES 的加密,有几种模式:
- ECB(Electronic Codebook,电子密码本)
- CBC(Cipher-block Chaining,密码块链接)
- PCBC(Propagating Cipher-block Chaining,填充密码块链接)
- OFB(Output Feedback,输出反馈)
- CFB(Cipher Feedback,密文反馈)
- CTR(Counter Mode,计数器模式)
以常用的 CBC 模式为例,主要有几个步骤:
- 数据分组
明文数据,需要被分组,每一组 128 位( 16 个字节)的数据块。如果不足 128 位,则需要填充到 128 位 - 密钥扩展
AES 算法使用一个密钥调度算法,把主密钥(128 位)扩展成 N+1 个轮密钥,每个轮密钥的长度与 AES 分组长度相同,即 128 位(16 字节)- AES-128,扩展成 10+1 个轮密钥
- AES-192,扩展成 12+1 个轮密钥
- AES-256,扩展成 14+1 个轮密钥
- 初始化向量(IV)
在 CBC(Cipher-block Chaining,密码块链接)模式中,每个数据块在加密前会与前一个数据块的密文进行异或操作,因此需要一个初始向量(IV)与第一个数据块进行异或操作。
- 每个轮密钥通过一个复杂的替换和置换过程,进行加密
- 字节替换(SubBytes):使用一个替换表(S-box)对状态矩阵中的每个字节进行替换
- 行移位(ShiftRows):对状态矩阵的行进行循环左移操作,第 0 行不移位,第 1 行左移 1 字节,第 2 行左移 2 字节,第 3 行左移 3 字节
- 列混合(MixColumns):对状态矩阵的列进行线性变换,每列的 4 个字节通过乘法和加法操作混合在一起
- 轮密钥加(AddRoundKey):将状态矩阵与当前轮的轮密钥进行按位异或操作
- 轮密钥处理
- 初始轮,只进行轮密钥加
- 重复轮,,进行 N-1 轮,进行字节替换、行移位、列混合、轮密钥加
- AES-128,重复 10-1 轮
- AES-192,重复 12-1 轮
- AES-256,重复 14-1 轮
- 最终轮,只进行字节替换、行移位、轮密钥加
解密过程
AES 的解密,与加密过程类似,只是在加密过程中,使用的是加密密钥,在解密过程中,使用的是解密密钥。
- 数据分组:
密文数据被分组成 128 位(16 字节)的数据块。 - 密钥扩展:
与加密相同,AES 使用密钥调度算法来扩展主密钥生成用于解密的子密钥。这些子密钥与加密过程中使用的顺序相反。 - 初始化向量(IV):
在 CBC 模式下,每个数据块在解密前会与前一个数据块的明文进行异或操作。因此需要一个初始向量(IV)与第一个数据块进行异或操作。
- 每个轮密钥通过一个复杂的替换和置换过程,进行加密
- 字节替换(SubBytes):使用一个替换表(S-box)对状态矩阵中的每个字节进行替换
- 行移位(ShiftRows):对状态矩阵的行进行循环左移操作,第 0 行不移位,第 1 行左移 1 字节,第 2 行左移 2 字节,第 3 行左移 3 字节
- 列混合(MixColumns):对状态矩阵的列进行线性变换,每列的 4 个字节通过乘法和加法操作混合在一起
- 轮密钥加(AddRoundKey):将状态矩阵与当前轮的轮密钥进行按位异或操作
- 轮密钥处理
- 初始轮,只进行轮密钥加
- 重复轮,,进行 N-1 轮,进行字节替换、行移位、列混合、轮密钥加
- AES-128,重复 10-1 轮
- AES-192,重复 12-1 轮
- AES-256,重复 14-1 轮
- 最终轮,只进行字节替换、行移位、轮密钥加
- 结束操作:
经过上述步骤后,数据块被解密回明文。如果在加密过程中使用了填充,这一步骤中需要重新添加填充以恢复原始数据的长度。
SM4
SM4 是一种对称密码算法,由我国国家密码管理局在 2012 年发布,属于国密(国家商用密码)算法之一,常用于无线互联网加密等领域。
基本原理
- 结构:
- SM4 块长度为 128 位(16 个字节),密钥长度为 128 位(16 个字节)。
- SM4 算法使用了 非平衡 Feistel 网络结构
- 轮数:总共进行 32 轮加密运算
- 基本操作
- 使用一个 8 位到 8 位的 S 盒进行非线性替代
- 轮函数 F: 包括非线性变换 τ(由 S 盒组成)和线性变换 L
- 密钥扩展: SM4 从 128 位主密钥生成 32 个 32 位轮密钥
- 解密和加密类似,只是使用轮密钥的顺序相反
- 安全性: SM4设计用于抵抗已知的密码分析攻击,如差分分析和线性分析
- 应用: SM4主要用于中国的政府和某些商业应用中,用于保护敏感但非机密的信息
总结
本文主要简单介绍了对称加密算法 DES,AES 和 SM4 的基本原理,以及它们的实现过程。
在加密通信中(如 HTTPS、VPN 等),双方会协商出一个加密算法和密钥,对传输的数据进行加密,从而防止第三方窃取。
对于大部分公司来说,选取 AES-128 进行加解密运算,就能获得较高的安全性和性能。
如果是金融或政府行业,在涉及国家层面的对抗上,有一定的合规需求,则需要应用国密算法。