使用梅森旋转算法擦除磁盘

使用梅森旋转算法擦除磁盘

目前,当我想在 Linux 中擦除带有伪随机数据的 USB 磁盘时,我会执行以下操作:

dd if=/dev/urandom of=/dev/sdb conv=notrunc

urandom速度非常非常慢,以至于瓶颈不再是设备。

我知道另一种方法——梅森旋转算法。DBAN 曾使用这种方法作为 PRNG 来安全地擦除数据,而且它足够“随机”以擦除驱动器——而且速度非常快。但是,我不确定如何在 Linux 中使用它。是否有一个梅森旋转算法程序,然后我可以通过管道将其输入 dd 来擦除驱动器?

答案1

wipe实用程序使用 Mersenne Twister PRNG 进行随机传递。

答案2

为什么要使用 DD 来擦除驱动器?撕碎是专门为此而设计的,并且适用于所有现代发行版。

答案3

梅森旋转算法在密码学上并不安全。在观察了算法的 624 个输出后,可以预测所有过去和未来的输出。我认为它比全是 0 和 1 要好,因为它可以更好地掩盖底层的磁性特征,但效率较低,因为你的对手会知道写入的确切模式。

我不是安全专家,但我想我的答案是不要出于这个原因使用梅森旋转算法来完成这项任务。但话又说回来,这一切都是没有实际意义的,因为用任何事物将无法利用现有技术恢复其先前的内容。

答案4

梅森旋转算法具有巨大的周期性,如果不使用 pari/GP,甚至很难在机器上获取其值。我的理解是,#include <random>c++ 中的 mt19937 (nmersenne twister) 更像是http://www.cplusplus.com/reference/random/mersenne_twister_engine/http://www.cplusplus.com/reference/random/mt19937/

w=32 n=624 表示周期性(使用 ttcalc)为 (2^((n-1)*w)-1)/32=(2^((624-1)*32)-1)/32=big huge huge number - CPU 内部无法处理如此大小的数字,除非将其截断为一些非常小的数字。因此,让我们找出该周期的位数:ceil(log(abs((2^((624-1)*32)-1)/32)+1;10)/log(10;10)) = 6000 位数字。即使 ttcalc 也只能达到 99 位数字。给你一个想法,2^64=18,446,744,073,709,551,616,可以用 CPU 指令计算,但即使你处理器中的 IEEE754 FPU 也无法处理这种大小的数字。这时你就需要用到大数数学和数论计算器了,比如 pari/GP,它可以轻松处理 10,000 位数字 - 并将其打印出来。

我对 /dev/urandom 和 /dev/random 的理解是,它们对于擦除磁盘等长时间运行来说非常差,不应该用于稳定的随机数流,而只能用于单数获取,如密码和其他加密等。

为了提高磁盘擦除程序的性能,使用 mt19937(虽然速度慢,但有效)的 nwipe 或自己编写 c++ 实用程序可能是个好主意。您可以将 32 位截断为 8 位,或者使用 16 位将带宽翻倍,64 位 mt19937 应该为您提供 32 位(相同 - 应该编写有关 gcc 中实现问题的错误报告)。高位是没用的,我猜他们认为每个人都会使用有符号数,而从不使用负数。c <random>++ 模板库应该同时适应有符号和无符号数据类型,而不仅仅是有符号数据类型。

最好的办法是写一个 C++ 程序。我认为 wipe 这个想法是有缺陷的,因为http://linux.die.net/man/1/shredhttp://linux.die.net/man/4/urandom在使用中,它说“它是为安全而不是速度而设计的,并且不适合生成大量随机数据。”

如果你唯一担心的是周期性(重复模式之间的距离),我认为这不是问题。密码学不是我的专业之一,但是

我对 NIST 擦除的理解是您应该进行 8 或 15 次 MT 之类的操作,以将磁重影降至最低。当然,越多越好,但做的越多,收益可能会递减。

不确定这种压力会对驱动器造成什么影响。请注意您使用的 USB 基座,startech SATDOCKU3SEF 是我发现的唯一一款带有良好且可用风扇(调到最大)的 USB 基座,如果有必要的话。

另外,我喜欢并行执行作业以节省时间。只需在命令末尾添加 &,然后执行与通道数量相同的作业。每个作业将使用 1 个线程。如果您的服务器有 120 个线程(4cpux30T),那么您最多可以有 120-1 个作业,剩下 1 个用于系统。要检查作业,请使用 jobs 命令,我认为要等待作业执行完毕或使用 wait 命令。例如wait ; shutdown -r 0

我仍在尝试弄清楚如何使用foreach带有“ls /dev/disk/by-id”的命令,BASH 中一定有一个错误,因为要从 livecd 中擦除所有内容,我应该能够使用

我正在开发一个网页 http://JesusnJim.com/pc-repair/disks-int-ext/wiping-refreshing-drives-free-fast-and-in-PARALLEL.html

相关内容