我很好奇 Ubuntu 的全盘加密在底层是如何工作的。以下是一个例子:
将以下字符串视为磁盘的所有内容:
hello world
应用某种加密方法后,它看起来像这样:
(在这个例子中,我使用了移位 +1 的凯撒密码,例如 A → B;B→C...)
ifmmp xpsme
据我了解,当计算机关闭时,驱动器的内容将是上面的字符串。但是当计算机重新打开时,Ubuntu 需要其内容再次恢复hello world
才能成功启动。
我不太明白的是真实世界磁盘的内容非常多,加密算法也非常复杂,我发现计算机很难在几秒钟内完全加密/解密所有内容(启动或关闭并不需要更长的时间)。
这怎么可能?
答案1
AES/Rijndael 加密通常如何工作?
这个页面有一个有趣的高级加密标准 (AES) 的简笔画指南看起来很容易理解,尽管它看起来有 50 多张图像,例如这两张:
和
在这里重复太多了,但如果你必须有一个一体化的图像,那就是这个:
或者,这里有一个更简洁的解释http://www.password-depot.com/know-how/blowfish_and_rijndael.htm
Rijndael 加密方法基于对字节进行替换、更改和执行异或运算。该方法如下所示:
- 从 128 位密钥中,Rijndael 生成 10 个密钥,每个密钥 128 位。
- 这些键被放入 4x4 数组中。
- 纯文本也被分成 4x4 数组(每个 128 位)。
- 每个 128 位纯文本项都经过 10 轮处理(128 位密钥处理 10 轮,192 位密钥处理 12 轮,256 位密钥处理 14 轮)。
- 第 10 轮之后,代码生成。
- 每个单字节在 S 盒中被替换,并被 GF (2 8) 上的倒数所取代。
- 然后应用按位模2矩阵,然后与 63 进行异或运算。
- 矩阵的行按循环排序。
- 矩阵乘法的列在GF(2 8)上互换。
- 每轮的子密钥都要经过一次异或运算。
如果使用不同的子密钥多次执行 Rijndael 加密,则该加密方法的安全级别会增加。
Ubuntu 的全盘加密如何工作?
我相信它的工作原理是使用 LUKS 加密分区(默认设置使用 AES),然后使用 LVM 在其上放置一些卷(例如/
,交换),并在您输入密码后在启动时解密并挂载它们。还有一个常规(未加密)启动分区,启动后会要求输入密码。
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 首先解密该块,然后将解密的数据提供给文件系统。首先等待驱动器读取数据块(就像不使用加密一样),然后解密单个数据块(或几个数据块)时只需要额外的延迟- 如果解密速度快于驱动器读取速度,则解密可以在驱动器读取下一个数据块之前完成。
因此,就像常规文件系统不需要读取整个驱动器来读取文件一样,当添加加密时,它也不需要读取整个驱动器,并且不会使事情变得很多慢点。
硬盘上的数据是始终加密,因此关机时除了忘记密钥外无需做任何事情。
- 更多详情请访问维基百科上的磁盘加密理论
答案2
这将会稍微简单一些,但我会尝试完成访问加密文件系统上的文件的过程。
例如,假设加密文件系统的开头有一个文件表;假设我们要读取/foo.bar
。那么,我们要做的第一件事就是读取分区的开头,解密它,然后查找我们想要的文件;假设文件从 0x10000000 字节开始。因此,要读取,我们从该位置的磁盘开始读取并解密;同样,要写入,我们可以加密新内容,然后将其写入新位置。
希望这有助于消除过程中的任何困惑。
答案3
答案4
现代计算机每秒可以进行数十亿次运算,因此加密和解密速度很快并不令我感到惊讶。
这是我直观地对计算机执行操作的速度进行排名的方式:
- 在内存(尤其是 L1 和 L2 内存)内进行计算,速度极快
- 从本地存储读取,速度较慢(固态硬盘比硬盘快)
- 从网络读取,速度就更慢了。
另一个需要理解的关键点是,操作系统不需要解密整个硬盘来启动系统。相反,操作系统知道如何在运行过程中只解密硬盘中它需要的部分,写入也是如此。
因此直观地讲,我并不惊讶全盘加密对性能没有太大影响,因为我认为瓶颈是磁盘。
当然,这些直觉并不总是符合现实。例如,在现实中,确实存在全盘加密导致明显性能下降的情况。但通常这些问题在开发人员经过几轮开发优化后就会得到解决。