FDE(全盘加密)如何如此迅速地工作?


13

我很好奇Ubuntu的全盘加密如何在后台运行。这是一个例子:

将以下字符串视为磁盘的所有内容:

hello world

在应用某种加密方法后,它将看起来像这样:(
在此示例中,我使用了+1位移的Caesar密码,例如A→B; B→C ...)

ifmmp xpsme

据我了解,当计算机关闭时,驱动器的内容就是上面的字符串。但是,当它重新打开时,Ubuntu需要再次恢复其内容hello world才能成功启动。

我没有真正得到的是,在现实世界中,磁盘的内容要多得多,加密算法要复杂得多,我发现计算机很难在几秒钟内完全加密/解密所有磁盘(启动或关闭不需要花费更长的时间)。

这怎么可能?

Answers:


10

AES / Rijndael加密一般如何工作?

该页面有一个有趣的高级加密标准(AES)简笔画指南,虽然看起来是50多个图像,但看起来很容易理解,例如以下两个:

在此处输入图片说明

在此处输入图片说明

在这里复制所有内容实在太多了,但是如果您必须拥有一张全合一的图像,那就是这张图像:

在此处输入图片说明


或者,在http://www.password-depot.com/know-how/blowfish_and_rijndael.htm中有更紧凑的解释

Rijndael加密方法基于对字节的替换,更改和执行异或运算。该方法如下所示:

  • Rijndael从128位密钥中生成10个每个128位的密钥。
  • 这些密钥放置在4x4阵列中。
  • 纯文本也分为4x4数组(每个128位)。
  • 每个128位纯文本项都经过10轮处理(128位密钥为10轮,192为12轮,对于256为14轮)。
  • 在第10轮之后,将生成代码。
  • 每个单个字节都在S框中替换,并由GF上的倒数(2 8)代替。
  • 然后应用按位模2矩阵,然后进行63的XOR运算。
  • 矩阵的线周期性地排序。
  • 矩阵乘法的列在GF(2 8)上互换。
  • 每个回合的子项都要进行XOR操作。

如果使用不同的子密钥多次执行Rijndael,则此加密方法的安全性级别会提高。


Ubuntu的全盘加密如何工作?

相信它可以通过使用LUKS(默认设置为AES)加密分区,然后使用LVM(如/swap)在其上放置一些卷,然后在输入密码后将其解密并挂载在启动中来工作。并且有一个常规的(未加密的)引导分区,可以引导足以要求输入密码的引导分区。

the_simple_computer的《 Ubuntu全磁盘加密指南》(2015年6月28日更新)说这是默认安装程序加密的工作原理,并提到双重引导将无法使用(至少不是现成可用)驱动器必须使用MBR,因此“ 如果您的计算机具有UEFI,则发行版将以旧版BIOS模式安装,因此您将无法使用安全启动 ”和“ 还可以为您提供与系统RAM相同的交换大小(通常是不必要的),并且对于使用哪种加密别无选择。


加密速度有多快?

如果运行cryptsetup benchmark它,它将运行测试并告诉您仅加密需要多长时间,请注意(当前)默认的aes-xts行:

#  Algorithm | Key |  Encryption |  Decryption
     aes-xts   256b    150.0 MiB/s    145.0 MiB/s

平均硬盘驱动器读取速度可能为80-160 MB / s,因此您的读取时间不会比常规读取时间长很多,而且在您仍在等待硬盘读取的情况下,刚刚读取的扇区可能已经被解密。硬盘阅读更多。

SSD 可能更快,可能为200-550MB / s,因此您可能会注意到。但是,随机读取的速度可能会变慢,而且我读到SSD的速度在使用后可能会减慢(也许当驱动器完全装满并且必须开始“擦除”扇区时?)

计算机如何在短短几秒钟内完全加密/解密所有驱动器(启动或关闭不需要花费更长的时间)?

它不必先解密所有内容。加密(LUKS)适用于数据块,可以随机解密任何块,并且像驱动器的加密数据和文件系统所见之间的一层。

当文件系统想要查看任何数据块时,LUKS首先解密该块,然后将解密的数据提供给文件系统。您首先要等待驱动器读取数据块(就像不使用加密一样),并且对单个数据块(或几个数据块)的解密只有额外的延迟 -如果解密速度比驱动器快可以读取,解密可以在驱动器读取下一个数据块之前完成。

所以,就像一个普通的文件系统并不需要阅读整个驱动器读取文件,当添加加密并不需要或者读取整个驱动器,它不会使事情很多慢。

硬盘驱动器上的数据始终加密的,因此在关闭时无需进行任何操作,除非忘记了密钥。


@Hewbot我已经在文件底部添加了一些有关解密速度的信息(在底部),因为您的Q的标题已编辑为添加“这么快?”。(标题仍然是您想要问的吗?)
Xen2050 '16

3

这将有点简化,但是我将尝试完成访问加密文件系统上文件的过程。

例如,假设在加密文件系统的开头有一个文件表;假设我们要阅读/foo.bar。因此,我们要做的第一件事是读取分区的开头,对其进行解密,然后在其中查找所需的文件。假设它说文件开始于0x10000000字节。因此,为了读取,我们开始从该位置的磁盘读取并解密。同样,要写入,我们可以加密新内容,然后将其写入该新位置。

希望这有助于消除该过程中的任何混乱。


1
我认为这是实际上回答了OP的问题的答案-他/她的误解是,它必须完全加密/解密整个驱动器,而不仅仅是使用时读取/写入的位。
SomeoneSomewhereSupports Monica '16

2

处理器使用专用指令集。因此可能是AES-NI。它启用了快速加密和解密,或者可以说它减少了开销。它速度快,因为它是硬件实现,如解释在这里

您可以在此处查看性能影响,为提高安全性,值得这样做。


1
另外,仅根据需要对磁盘上的数据进行加密/解密。例如,在启动时,仅解密启动脚本,用户信息,DM / WE可执行文件等
Nick

许多CPU 支持AES,并且Ubuntu的加密仍然可以在它们上面运行...即使它们可以使用,但这仍然无法真正回答Ubuntu的加密如何工作的问题
Xen2050 2016年

@shsh然后,如果我使用的是旧计算机,将无法使用FDE,因为没有硬件实现?那么我是否应该了解整个磁盘在启动和关闭时都进行了加密和解密?
Hewbot '16

@ MagikM18如果是这样,算法如何知道整个“字符串”中从哪里开始解密?我的意思是,如果我打开一个文档,它怎么知道它的“坐标”?
Hewbot '16

@Hewbot还是一样。基本上,加密是物理磁盘和文件系统守护程序之间的一层。因此,当它请求从磁盘读取数据时,先读取然后解密;因此,就像在常规fs中一样,它将首先读取文件表,找到文件的起始位置,然后从那里开始读取。
尼克·默丁

0

现代计算机每秒可以完成数十亿次操作,因此加密和解密速度很快也不足为奇。

这就是我直观地对计算机运行速度的排名方式:

  1. 在内存(特别是L1和L2内存)中进行计算
  2. 从本地存储读取,速度较慢(固态磁盘比硬盘快)
  3. 从网络读取,速度甚至更快。

要了解的另一个关键点是,该操作不需要解密整个硬盘即可启动系统。而是,操作系统知道如何仅对运行中的硬盘部分进行解密,并且写入过程也是如此。

从直觉上讲,全磁盘加密不会对性能产生太大影响,对此我并不感到惊讶,因为我认为瓶颈是磁盘。

当然,这些直觉并不总是与现实相符。例如,实际上,在某些情况下,全盘加密已引起明显的性能下降。但是通常这些问题是在开发人员经过几轮开发优化后才能解决的。


1
我找不到解决该问题的方法。仅使用USB 3.0复制1TB会花费几分钟,如果必须执行中间过程(解密),则可能需要花费几分钟来启动具有FDE的计算机。
Hewbot '16

@Hewbot我编辑了答案,以解释解密是即时进行的。操作系统不需要读取1TB的数据即可开始使用加密的1TB磁盘。
Flimm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.