深入了解高级加密标准(AES)
如果你曾经好奇如何保护互联网安全,尤其是在众多恶意实体试图侵入数据存储库的情况下,那么密码学就是解决这个问题的关键之一。
正如你可能已经知道的,密码学是保护信息和通信的一种方法,但它绝非简单。实际上,它是一门不断发展的技术,旨在确保其所依赖的标准始终处于领先地位。
一个这样的标准例子就是AES,这是一个你可能之前遇到过的首字母缩写词,特别是在你经常使用诸如WhatsApp、Signal或Telegram等通讯应用程序或者VPN软件的情况下。本文将重点讨论AES,并帮助你更好地理解它。
什么是AES?
AES,即高级加密标准,是一种广泛应用的加密形式,它长期以来被用于保护数据安全可靠,免受窥探。
AES加密之所以在众多产品中脱颖而出,是因为它是一种快速、安全的加密方法,其灵活性使其能够应用于各种产品,从日常应用如WhatsApp或Signal,到军事安全系统,甚至是硬件。
加密是如何工作的?
你可能已经知道加密的工作原理。如果你不清楚,这里有一个快速回顾:加密将纯文本转换为加密形式,使其看起来像是由随机字符组成。可以肯定地说,AES是一种对称加密类型,因为它使用相同的密钥来加密和解密数据。
该加密标准使用替换置换网络算法(SPN算法),通过应用多轮加密来保护数据。正是因为使用了如此多轮加密,使得AES几乎不可能被破解。
AES不仅是第一个,也是唯一一个被美国国家安全局(NSA)批准用于保护绝密数据的公开密码。最初,这个加密标准被称为Rijndael,它基于两位开发者的名字:Vincent Rijmen和Joan Daemen,他们都来自比利时。
AES 多种密钥长度
AES包含三种分组密码,每种都有不同数量的密钥组合,如下所示:
AES-128: 128位密钥长度 = 3.4 * 1038
AES-192: 192位密钥长度 = 6.2 * 1057
AES-256: 256位密钥长度 = 1.1 * 1077
尽管有三种分组密码,它们都使用不同的密钥长度(即上述的128、192和256)来加密和解密128位的块数据。因此可以确定的是,虽然密钥长度可能不同,但块的大小始终是相同的(128位或16字节,两者是等效的)。
AES使用不同密钥长度这一事实,可能会引起用户的一些疑问,例如为什么我们需要多种密钥长度?考虑到256位密钥可能是最安全的,有些人可能会质疑拥有多个密钥长度的必要性。
虽然256位AES密钥是最强大的,通常被称为“军用级”,但它并不总是默认部署,原因在于资源的可获得性,或者更确切地说,资源的不可用性。
AES-128 vs AES-256
密钥大小越大,消耗的资源就越多。因此可以确定的是,功能较弱的系统更有可能使用128位AES密钥,而不是256位密钥。例如,如果你在手机上使用256位AES加密,它可能会比相同加密标准的128位版本更快地耗尽电池电量。
256位AES密钥比128位密钥更难以暴力破解。然而,即使拥有巨大的计算能力,128位AES密钥仍然几乎不可能破解。因此,如果考虑到功耗或延迟,尤其是在诸如智能手机等便携式设备上,使用此版本而不是256位密钥会是一个更好的选择。
值得欣慰的是,技术进步使得使用AES-256和AES-128在计算能力和电池寿命方面的差异可以忽略不计,这使得256位AES成为了大多数用户的首选,因为它能带来更好的安全感。
使用AES的好处
AES采用的加密方法快速且易于理解,这使得它在各个领域都广受欢迎。AES不仅快速安全,而且易于实施,这进一步增加了它的固有吸引力。
此外,它能够以尽可能快的速度解密受保护的数据,并且比其他流行的加密标准(如DES)使用更少的内存和计算能力,这使其具有优势。
最后但同样重要的是,如果情况需要,AES足够灵活,可以与其他几种安全协议(如TKIP、WPA2、WEP)以及其他加密类型(如SSL)结合使用。
以下是选择AES而不是其他加密标准的一些主要优势:
支持在硬件和软件中实现 |
它支持三种密钥长度,在安全性和速度(性能)方面提供了一些灵活性 |
所有三种密钥类型都足够长,这使得AES几乎不可能被暴力破解 |
到目前为止,还没有任何加密攻击被证明能够成功对抗AES |
鉴于美国政府将其定义为标准,几乎在任何地方都能找到它 |
易于实施(据报道,硬件实施比软件更容易),无论目的地如何 |
不像其他加密类型(例如DES)那样占用尽可能多的内存 |
易于与其他安全协议和加密类型结合 |
AES的常见用途
尽管我们已经提到AES通常在任何支持它的地方使用,但还是有一些例子表明遇到它的几率更高。例如:
VPN |
VPN的工作原理是通过重新路由你的流量,并在加密后进行传输,这样其他人就无法在监视你的连接时看到你的数据。此外,流量需要在其出口点进行解密,这就需要使用加密标准。默认情况下,许多VPN提供商使用AES-256,包括NordVPN、Surfshark和ExpressVPN。 |
密码管理器 |
密码管理器的工作方式是将你所有的密码存放在其中,并使用一个主密码进行加密保护。市场上的各种密码管理软件解决方案都选择了AES作为其有效的加密标准,因为它易于实施、快速且安全。 |
无线网络 |
如果没有流量加密,攻击者就可以坐在你的无线网络之外,使用适当的WiFi适配器捕获未加密的数据包,并监控你的整个在线活动。幸运的是,AES加密,通常与额外的安全标准(WPA2是目前最流行的)一起可以防止这种情况发生。 |
网络浏览器 |
你可能已经知道,Web浏览器已经对用户的连接进行了加密,以保护他们免受各种网络威胁,例如中间人(MITM)攻击、欺骗或流量监控。 |
磁盘加密 |
尽管此功能主要用于智能手机和平板电脑等便携式设备,但如果你想提高隐私和安全性,加密磁盘也是可行的。AES目前是用于加密和解密磁盘内容的最流行的方法之一。 |
文件压缩软件 |
无论是WinRar、WinZip还是7z,市场上所有这些存档和文件压缩/解压缩实用程序都使用AES作为其首选的加密标准,以防止在处理文件时意外的数据泄露。 |
通讯应用 |
WhatsApp、Signal、Telegram、Snapchat、Messenger以及其他我们未提及的应用程序都使用AES加密来确保你获得完全的隐私,无论你通过这些应用程序发送照片、视频、文档还是纯文本消息。 |
编程语言库 |
如果你是程序员,你应该知道某些编程语言的库(包括但不限于C++、Java和Python)使用AES加密来帮助你保护数据和项目免受未经授权的访问。 |
操作系统组件 |
为了增加额外的安全层,一些操作系统在其某些组件中添加了AES加密。 |
AES是如何工作的?
一般来说,你需要了解特定技术的工作原理,才能充分利用其潜力。在这种情况下,你应该先了解一下AES的工作原理,然后再在你的项目或环境中使用它。
1. 数据被分成块
你可能还记得我们上面提到的,AES是一种分组密码,这意味着它以比特块的形式对接收到的数据进行加密,而不是逐位加密。
因此,AES加密的第一步是将数据分成块。这些块中的每一个都包含128位或16字节的4×4列。考虑到一个字节由8位组成,我们有16 x 8 = 128位,这就是块的大小。
例如,假设你想要使用AES加密“wdzwdz.com”,加密过程所做的第一件事就是将数据分成块。但是,一个块只能包含16个字符,因此第一个块不会包含文本末尾的“m”,’m’将被发送到下一个块。
因此,在将AES应用于“wdzwdz.com”后,文本的第一部分将如下面的块所示:
一个
C
e
s
d
吨
吨
.
d
一世
一世
C
一世
v
p
○
2. 密钥扩展
密钥扩展过程比我们上面描述的步骤稍微复杂一些。它涉及获取初始密钥,并使用Rijndael的密钥计划生成一系列附加密钥,这些密钥将用于每一轮加密过程。
因此,例如,如果你在上面的纯文本(wdzwdz.com)上使用密钥“AESencryption12”,你将得到一串看似随机的数字。
一个
e
是的
○
乙
n
p
n
小号
C
吨
1
r
一世
2
但是,Rijndael密钥调度使用非常特定的过程来加密初始短语中的每个符号。
结果将如下面的块所示:
7e
04
0b
20
52
6c
1c
56
a7
男朋友
8e
84
30
03
3d
20
同样,虽然它看起来像乱码和随机数,但这正是整个加密过程的重点:将数据隐藏在密码后面,使不知道密码的用户无法访问它,并且无法破解它。
此外,这还远远没有结束,因为加密过程需要使用我们最近为每一轮加密生成的密钥。但稍后会详细介绍。
3. 添加轮密钥
这实际上是第一轮加密,因为我们要将初始密钥(’AES encryption12’)添加到我们的消息块(’wdzwdz.com’)中,如下例所示,一开始可能没有意义。
一个
C
e
s
d
吨
吨
.
d
一世
一世
C
一世
v
p
○
和
一个
e
是的
○
乙
n
p
n
小号
C
吨
1
r
一世
2
虽然感觉不可能将两个文本块添加在一起,但请记住,这只是加密过程的图形表示,以便你更好地理解它。实际上,AES使用二进制代码,使我们尝试添加两个文本块不仅完全合理,而且完全有可能。
这个操作(将两个文本块相加)是通过使用XOR密码完成的,结果如下所示:
32
d5
5c
d9
f3
24
a8
46
7e
1c
37
f3
82
5e
3f
03
4. 字节替换
为了进一步加强对数据的保护(在我们的例子中,我们试图加密的明文),该过程的这一步将根据一个称为Rijndael S-box的表用预定值替换块的每个字节。你可以看到下面的表格:
00
01
02
03
04
05
06
07
08
09
0a
0b
0c
0d
0e
0f
00
63
7c
77
7b
f2
6b
6f
c5
30
01
67
2b
铁
d7
抗体
76
10
约
82
c9
7天
F A
59
47
f0
广告
d4
a2
af
9c
a4
72
c0
20
b7
fd
93
26
36
3f
f7
抄送
34
a5
e5
f1
71
d8
31
15
30
04
c7
23
c3
18
96
05
9a
07
12
80
e2
eb
27
b2
75
40
09
83
2c
1a
1b
6e
5a
a0
52
3b
d6
b3
29
e3
2f
84
50
53
d1
00
编
20
fc
b1
5b
6a
CB
是
39
4a
4c
58
参考
60
d0
英夫
啊
脸书
43
4d
33
85
45
f9
02
7f
50
3c
9f
a8
70
51
a3
40
8f
92
9天
38
f5
公元前
b6
大
21
10
ff
f3
d2
80
光盘
0c
13
欧共体
5f
97
44
17
c4
a7
7e
3d
64
5天
19
73
90
60
81
4f
直流
22
2a
90
88
46
ee
b8
14
德
5e
0b
D b
a0
e0
32
3a
0a
49
06
24
5c
c2
d3
交流
62
91
95
e4
79
b0
e7
c8
37
6天
8天
d5
4e
a9
6c
56
f4
一个
65
7a
ae
08
c0
巴
78
25
2e
1c
a6
b4
c6
e8
dd
74
1f
4b
BD
8b
8a
d0
70
3e
b5
66
48
03
f6
0e
61
35
57
b9
86
c1
1d
9e
e0
e1
f8
98
11
69
d9
8e
94
9b
1e
87
e9
ce
55
28
df
f0
8c
a1
89
0d
男朋友
e6
42
68
41
99
二维
0f
b0
54
bb
16
尽管此表也看起来像一系列随机字符,但你可以使用它来检查替换字节将具有的值。例如,c9将变为dd,26将变为f7,ff将变为16,依此类推。一旦你掌握了窍门,它并不难使用。
现在我们已经看到了表格,让我们看看上面第一轮加密生成的新块在基于Rijndael S-box的字节替换后将如何变化:
23
03
4a
35
0d
36
c2
5a
f3
9c
9a
0d
13
58
75
7b
请注意,我们实际上已经手动使用Rijndael S-box表替换了这些块,因此如果你有兴趣,可以仔细检查并尝试复制结果。这样,你就可以更容易理解,特别是如果你热衷于学习更多有关密码学的知识。
5. 换行
在AES加密过程的这一步中,行被移动,以将你的数据放在额外的保护墙后面。虽然第一行保持不变,但接下来的三行以不同的方式移动,如下所示:
第二行向左移动一个字节(单元格)
第三行向左移动两个字节(单元格)
第四行也是最后一行向左移动三个字节(单元格)
23
03
4a
35
36
c2
5a
0d
9a
0d
f3
9c
7b
13
58
75
6. 列混合
虽然我们希望尽可能保持准确,但此步骤涉及将一系列复杂的数学公式应用于模块,这在程序结束时为我们提供了一个完全不同的模块。
更具体地说,在此步骤中,每列都乘以预定义的矩阵。结果将是一个新的代码块,它将进一步用于增加密码的强度,并降低它被破解的几率。
在列混合过程结束时,我们将得到一个如下所示的代码块:
43
4d
33
85
c8
37
6天
8天
9a
33
85
9c
42
68
41
99
7. 增加额外的轮密钥
还记得前段时间我们告诉过你,我们肯定需要我们在密钥扩展步骤中创建的密钥吗? 好吧,我们曾经用它来打乱过所有的东西,现在我们需要对刚刚获得的数据再打乱一次。
因此,我们在运行列混合步骤后获取我们获得的数据块,并为其添加另一个轮密钥,就像我们在指南中的步骤3中所做的那样,如下所示:
43
4d
33
85
c8
37
6天
8天
9a
33
85
9c
42
68
41
99
和
32
d5
5c
d9
f3
24
a8
46
7e
1c
37
f3
82
5e
3f
03
如你所料,此步骤将生成另一个数据块供我们处理,但我们将在此停止。我们有一种感觉,你明白了。然而,加密过程还远未结束,因为我们刚刚生成的数据块将经历多次修改。
8. 更多步骤
我们上面提到的这些修改包括我们迄今为止所做的一切:移动行、字节替换、添加轮键和混合列,所以很容易理解为什么我们不得不在这里停下来举例说明。
这些轮次是相同的,并且这些轮次重复的次数取决于AES密钥长度,如下所示:
AES-128 使用9轮
AES-192 使用11轮
AES-256 使用13轮
因此,如果你打算使用AES-256,我们之前提到和解释的步骤将连续重复13次,你可以同意这是一个巨大的数量。也很容易理解为什么AES如此难以破解,并且是许多环境中的首选加密标准。
但是,我们还没有完成。在我们上面简要讨论过的9、11或13轮加密之后,还有一个额外的轮,在此期间,算法仅替换字节、移动行并添加轮密钥(它跳过混合列)。
它可能听起来有点荒谬,在运行9、11或13轮之后,混合列步骤上方的所有步骤都被丢弃了。原因是此时它有些多余,跳过这一步只是为了保留一些处理能力。
所以实际上,在运行加密过程的所有步骤之后,输入数据(我们在本例开始时使用的明文)将经历10、12或14轮,具体取决于你选择的密钥长度,并看起来像一组随机字符。并不是说它已经很久没有这样了,因为我们开始了加密过程等等。
因此,回顾一下,在进行加密时,你提供给AES加密工具的数据按以下顺序经历以下过程:
块划分 |
密钥扩展 |
添加轮密钥 |
字节替换 |
行移位 |
列混合 |
添加轮密钥 |
步骤4-7重复9、11或13次,具体取决于密钥长度 |
字节替换 |
行移位 |
添加轮密钥 |
在这个复杂且看似无穷无尽的过程结束时,如果使用128位密钥和“AESencryption12”作为密钥进行加密,我们尝试加密的文本wdzwdz.com将如下面的代码所示:
RcadDaLDuP5fHtor3/Rfnq5EijEfhP02pvrlGkGr1Gc=
虽然它可能看起来完全是胡言乱语,但再次说明,这就是使用加密的重点:让数据看起来像在传输过程中出现了可怕的错误,现在看起来像胡言乱语。
如何解密AES
我们知道AES和整个加密过程可能有点复杂,因为步骤繁多,而且它们会重复很长时间,这可能会让人感到有点害怕。
然而,如果你退后一步看大局,整个事情实际上开始变得有意义,即使对于那些没有花费毕生精力研究密码学和设计加密或解密信息的完美方法的人来说也是如此。
这正是为什么我们非常有信心,如果加密过程及其所有步骤对你来说是有意义的,那么你将毫无困难地理解AES解密。简而言之,AES解密遵循与加密过程完全相同的步骤,只是它们被颠倒了。
因此,在我们的例子中,如果我们想从RcadDaLDuP5fHtor3/Rfnq5EijEfhP02pvrlGkGr1Gc=返回到“wdzwdz.com”,我们所要做的就是追溯我们的步骤,直到我们到达最初的步骤,如下所示:
逆添加轮密钥 |
逆行移位 |
反向字节替换 |
逆添加轮密钥 |
反列混合 |
逆行移位 |
反向字节替换 |
根据密钥长度重复步骤4-7 9、11或13次 |
逆添加轮密钥 |
执行上述所有步骤后,我们应该得到原始文本片段“wdzwdz.com”。
AES加密安全吗?
当涉及到所有加密标准(不仅仅是AES)时,最紧迫的问题之一是它是否可以为你提供最佳的安全级别。在这种情况下,问题是:AES加密安全吗?
尽管你可以亲眼看到该加密标准部署了大量步骤,每个步骤都会扰乱原始文本并将其扭曲得面目全非,但这似乎并没有阻止攻击者设计潜在的方法来规避这些保护手段。
请注意,在现实生活中,攻击者(通常称为黑客或破解者)在尝试入侵你的PC、数据库、存档或任何你的虚拟堡垒时,不会追求最高、最厚的墙。他们正在努力保护。
相反,他们会绕着众所周知的墙壁转几圈,试图找到任何值得挖掘的裂缝,然后开始在那里钻孔。在我们的情况下,攻击者可能会希望发现AES加密过程中的任何漏洞,并从那里开始工作。
值得庆幸的是,密码学研究人员不断尝试发现AES加密过程的漏洞,以便能够防止来自首先发现漏洞并且(显然)不与全世界共享漏洞的人的潜在攻击。
到目前为止,研究人员已经能够识别出一系列可能危及AES的攻击,但这些攻击要么是纯粹的理论侧信道攻击,要么是使用已知安全密钥的破解尝试,你很快就会从以下内容中了解到部分。
1. 已知密钥识别攻击
密码学研究人员设计了一种使用已知密钥的攻击,并在行动中进行了观察,并显示出一些有希望的结果。该攻击由Vincent Rijmen和Lars Knudsen于2007年引入。
虽然这对于AES加密方法来说并不是很好,但这种攻击有两个缺陷,使其不太可能在现实生活中使用:它使用了一个已知密钥,以及它针对七轮版本的AES-128进行了测试。
考虑到大多数时候攻击者不知道密钥(除非他们碰巧偶然发现了它,并提供了有关其目的的精确说明),并且AES-128有10轮加密,因此每天AES-128可以放心攻击不太可能发生。
大多数提供AES-128的服务还具有对AES-256的本机支持这一事实意味着,如果你担心成为已知密钥区分攻击的目标,那么增强你的加密将再容易不过了。
2. 相关密钥攻击
相关密钥攻击更像是一个类别,因为它代表了所有形式的密码分析,攻击者可以在其中分析密码在多个密钥下的工作方式。在这种类型的攻击中,攻击者不知道密码中使用的密钥的值。
然而,虽然未知,但密钥之间也存在某种数学关系,攻击者确实知道这一点。最简单的例子之一是攻击者知道密钥的前16位始终相同,但不知道这些位实际上是什么。
尽管如果应用正确,相关的关键攻击可能会成功,但它们在现实世界中并不重要。为了使这种攻击起作用,攻击者需要成功说服密码学家使用数学上相互连接的各种密钥对数据进行加密,然后与攻击者共享秘密。
因此,这种类型的攻击服务器只是提醒人们,人为错误可能会导致AES盔甲中的一些扭结,因为该加密标准的实施不力。
3. 侧信道攻击
尽管AES目前几乎是不可破解的,但已经有许多尝试设计理论攻击来证明该加密标准的一些漏洞。
即使AES推出已经20年了,技术在过去20年中取得了一些巨大的进步,但暴力破解AES所需的计算能力仍然不够,我们仍然需要数十亿年才能破解它。
但是,破坏AES加密安全性的另一种尝试是旁道攻击。这种类型的攻击结合了多种类型的数据泄漏,以从算法中提取足够的数据以供破解。
例如,攻击者可以关注功耗、电磁辐射、执行各种计算所需的时间,甚至是计算过程中产生的声音,以提取有关算法的更多信息。
有几类侧信道,包括:
定时攻击 |
计时攻击围绕测量执行某些计算所需的时间(例如将已知密码与未知密码进行比较)。 |
缓存攻击 |
这些攻击只有在攻击者可以在各种环境中访问受害者的一些缓存时才可行,无论是虚拟化环境(虚拟机)、共享物理系统还是我们正在谈论的云服务。 |
电磁攻击 |
电磁攻击基于电磁辐射泄漏,可用于提取各种信息。测量电磁辐射泄漏有时会导致发现加密密钥。 |
电源监控攻击 |
攻击者在某些计算步骤期间监控硬件的功耗,以提取有关算法的信息。 |
声学密码术 |
类似于电源监控攻击,但攻击者在执行某些计算步骤时会聆听并分析硬件发出的声音,并从这些发现中提取信息。 |
数据剩磁 |
这种类型的攻击围绕着敏感数据,即使在被删除后仍然可以访问和读取。 |
光学分析 |
在这种复杂类型的攻击中,高分辨率摄像头用于捕获机密或敏感数据(例如分析硬盘活动指标或晶体管开关状态)。 |
微分故障分析 |
这种类型的攻击基于 |