FDE(全盘加密)如何快速工作?

我很好奇Ubuntu的全盘加密是如何工作的。 这是一个例子:

考虑以下字符串作为所有磁盘的内容:

hello world 

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

 ifmmp xpsme 

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

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

这怎么可能?

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

这个页面有一个有趣的高级加密标准(AES)的棒图指南看起来很容易理解,虽然它看起来是50多个图像,例如这两个:

在此处输入图像描述

在此处输入图像描述

在这里复制它是太多了,但是如果你必须有一个多合一的图像就是这个:

在此处输入图像描述


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

Rijndael加密方法基于替换,更改和执行字节上的xor操作。 该方法如下所示:

  • Rijndael从128位密钥生成10个密钥,每个密钥128位。
  • 这些键放在4x4arrays中。
  • 纯文本也分为4x4arrays(每个128位)。
  • 每个128位纯文本项目在10轮中处理(对于128位密钥为10轮,对于192为12轮,对于256为14轮)。
  • 在第10轮之后生成代码。
  • 每个单字节在S框中被替换,并被GF(2 8)上的倒数替换。
  • 然后应用逐位模2矩阵,然后用63进行XOR运算。
  • 矩阵的行是循环排序的。
  • 矩阵乘法的列在GF(28)上互换。
  • 每轮的子键进行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首先解密该块,然后将解密的数据提供给文件系统。 您首先等待驱动器读取数据块(就像不使用加密一样),并且只有一个额外的延迟来解密单个块(或几个块)的数据 – 并且如果解密速度比驱动器快可以读取,解密可以在驱动器读取下一个数据块之前完成。

因此,就像常规文件系统不需要读取整个驱动器来读取文件一样,当添加加密时,它也不需要读取整个驱动器,并且它不会使速度变慢。

硬盘驱动器上的数据始终加密的 ,因此除非忘记密钥,否则关机时无需执行任何操作。

  • 维基百科上有关于磁盘加密理论的更多细节

处理器使用专用指令集。 因为它, AES-NI是可能的。 它可以实现快速加密和解密,或者你可以说它可以减少开销。 它很快,因为它是硬件实现,如此处所述。

您可以在此处查看性能影响,并且为了增加安全性,它们是值得的。

这将是一个简化,但我会尝试通过访问加密文件系统上的文件的过程。

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

希望这有助于消除对流程的任何混淆。

现代计算机每秒可以进行数十亿次操作,因此加密和解密速度很快并不令我感到惊讶。

这就是我如何直观地判断计算机执行速度的速度:

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

要理解的另一个关键点是操作不需要解密整个硬盘来引导系统。 相反,操作系统知道如何仅解密动态所需的硬盘部分,并且写入也是如此。

因此直观地说,全盘加密对性能没有太大影响我并不感到惊讶,因为我认为瓶颈是磁盘。

当然,这些直觉并不总是与现实相符。 例如,实际上,存在全盘加密导致性能受到显着影响的情况。 但通常这些都是在开发人员经过几轮开发优化之后解决的。