14

我有一个嵌入式系统。我希望它在开机或以其他方式重置时执行的操作是生成唯一 ID,以便在不同的重新启动时以高概率生成不同的唯一 ID。

它无法访问实时时钟,但可以访问 ADC 和 UART。我想知道是否有一种不错的方法可以从这些来源收集熵以生成唯一 ID。我对Yarrow依稀熟悉。有没有使用这个的好方法?

不幸的是,我没有任何可预测特征的噪声源;ADC 连接到多个相对低噪声的输入,所以我想我可以只使用 ADC 的最低有效位作为输入。

编辑:物有所值,这是 TI TMS320F28335 处理器。


更新/澄清:我正在寻找一种收集熵的软件方法。我找到了另一种方法来解决我的问题,所以在某种程度上,我的问题是一个有争议的问题,但我仍在寻找有关特定软件解决方案的指导,以从低熵源(如 ADC 和系统的最低有效位)收集熵接收UART字符的时间。

4

5 回答 5

12

我用过:

  • 浮动 ADC 输入的最低位,但你触及了那个

  • 一个极高分辨率的计时器(~10ns),并在用户按键之间计时时采用最低的“n”位。如果您接受用户按键(在最高时间分辨率下)在时间上实际上是随机的,那么它会很好地工作。

您还可以对网络数据包之间的时间等进行计时,但这些可能比很多人的事情更具确定性/可预测性。电噪声和用户交互是更好的熵源。

顺便说一句,关于“按键之间的时间”的东西,我倾向于将它们存储在嵌入式系统上,从开机开始,在最后 8 个左右的循环缓冲区中,因为你永远不知道什么时候需要他们。(换句话说:不要等到你需要随机位,然后强迫用户按下按钮 3 次!)

于 2010-09-22T01:44:57.823 回答
3

这取决于:

  • 你想要什么程度的独特性?
  • 有非易失性存储吗?
  • 您需要多久得到答复?

如果你有闪存/NVRAM/磁盘,读取你的随机种子,增加它,然后写回。如果您不需要设备/刷新/NVRAM 电池耗尽之间的唯一性,则种子可以是一个简单的计数器。如果你想要唯一性,那么一旦你收集到“足够”的熵,就重写种子。

(显然,如果您正在使用闪存并且您的闪存控制器没有磨损均衡,或者实现您自己的磨损均衡,您可能想做其他事情。)

如果你不这样做,那么从所有可以收集的来源收集熵,并且只有在你有足够的熵之后才生成 UUIDZvi Gutterman (2006)指出,OpenWRT 的唯一熵来源是网络访问,这很容易观察到。

使用 ADC 输出似乎是明智的,有一些简单的指导方针:

  • 使用所有位(或至少比您的熵估计更多的位),但保守地增加您的熵估计。
  • ADC 输出在削波时具有零熵(并且在几乎削波时可能具有低熵)。

测量输入的噪声量。我怀疑每个样本至少会得到一个位。然后散列您的位并生成版本 4 UUID。

于 2010-09-26T22:04:36.247 回答
3

另见Niels Ferguson 和 Bruce Schneier在Practical Cryptography中描述的Fortuna 。虽然,对于嵌入式系统来说,Yarrow 和 Fortuna 可能都太重了。

与 Yarrow 不同,Fortuna 不需要您估计随机源的熵。

于 2010-12-28T22:13:10.477 回答
1

我做了类似于丹的回答的事情。我在非易失性存储器中有一个缓冲区,在包含最后 256 次击键时间的用户击键之间使用高分辨率定时器 (20ns) 的定时器差。然后,我计算一个 32 位 CRC,以在每次系统开机时获得一个唯一的数字。一些没有用户交互的版本测量了串行端口上收到消息之间的时间

这些唯一编号被用作网络上的节点标识符,并且从未出现任何重复问题。

后来增加了一个DS2401,它提供了一个持久但唯一的 ID,但这只有在您可以更改硬件时才对您有用。

于 2010-09-28T08:30:04.887 回答
0

除了上面丹的回答之外……如果您的系统包含某种收音机,您可以阅读 RSSI。

于 2010-09-22T17:40:31.097 回答