我只是在查看比特币-包的源代码。据我所知,当你创建一个新的比特币键盘时
Key privateKey = new Key();
(不传递一些随机数据作为自己生成的私钥)然后库使用随机数生成器为您生成一个私钥。很平常。但是,我偶然发现,随机数生成器的输出不会直接用作私钥: NBitcoin还在这个字节数组上应用了一个PushEntropy-function:
private static void PushEntropy(byte[] data)
{
if (!UseAdditionalEntropy || additionalEntropy == null || data.Length == 0)
return;
int pos = entropyIndex;
var entropy = additionalEntropy;
for (int i = 0; i < data.Length; i++)
{
data[i] ^= entropy[pos % 32];
pos++;
}
entropy = Hashes.SHA256(data);
for (int i = 0; i < data.Length; i++)
{
data[i] ^= entropy[pos % 32];
pos++;
}
entropyIndex = pos % 32;
}我理解这个函数的作用,但我不明白为什么我们需要这个函数来生成私钥。
为什么密码安全的随机数生成器(生成私钥(又名data-bytearray) )不够?
这个功能会增加任何类型的安全性吗?
发布于 2021-04-17 20:16:00
为什么密码安全的随机数生成器(生成私钥,也就是数据字节数组)不够?
密码安全的真正随机数生成器就足够了。此代码使用皮带和吊杆的方法.这在RNGs中很常见,因为它认识到RNGs传统上是密码实现中最脆弱的组件之一(参见SmartFacts)。
其意图似乎是:如果UseAdditionalEntropy是true的缺省值,而additionalEntropy被设置为某种不可猜测或/和真正随机的东西,则调用两个表单 of AddEntropy中的一个
data最初包含一些可猜测的内容,请尝试通过将两者混合(在第一个循环中)来节省时间。data为32字节,entropyIndex以零开始时,此转换为\mathtt{data}\mapsto\operatorname{SHA-256}(\mathtt{data})\oplus\mathtt{data}.给定输出,唯一希望找到输入的方法是枚举可能的输入值。步骤1可能会适得其反,例如,如果data通过的是以前传递给AddEntropy的SHA-256散列。
步骤2稍微减少了熵(如果data是全熵,则减少小于1位,请参见这;如果data小于全熵,则为否定),但在上下文中,这很好。
这个功能会增加任何类型的安全性吗?
如果Random.GetBytes of 调用上下文有缺陷,并且AddEntropy被使用并传递了一些秘密(包括一些随机的、独立于Random.GetBytes输出的内容;或者仅仅是安装时随机生成的一个秘密常量),就会发生这种情况。只要PushEntropy、additionalEntropy和entropyIndex保持private (因此不会意外调用),这种预防措施就不会意外地适得其反。
如果在SHA-256圆函数的最后混合步骤中将+=变换为^=,则这一变换是可逆的。如果我们在所示的代码中将^=更改为-=,这将是危险的接近可逆的。
https://crypto.stackexchange.com/questions/89454
复制相似问题