13

浏览一些密码学的东西,我看到RNGCryptoServiceProvider有两种方法:

关联

RNGCryptoServiceProvider.GetNonZeroBytes

RNGCryptoServiceProvider.GetBytes 

所以我问:

用加密强的随机值序列填充字节数组有什么奇怪的,其中一些(0或更多)是零? (它是随机值,显然不会有很多零,而且零也是一个常规数字)

他们为什么要创造与众不同的东西?

4

1 回答 1

16

在 .NET 框架内,GetNonZeroBytes(byte[])用于为 RSA 加密生成 PKCS#1 填充,0x00用作分隔符。

使用 Reflector 之类的工具,您可以看到它在RSAPKCS1KeyExchangeFormatter.CreateKeyExchange(byte[])中用于根据RFC 2313第 8.1.2 节实现填充(RFC 3218有一些很好的 ASCII 艺术,可以更清楚地演示字节布局)。

GetNonZeroBytes(byte[])也可以用来生成盐。Cryptography StackExchange 站点有一个类似的问题,它表明避免0x00是帮助库和 API 可能将 salt 视为以零结尾的字符串,这会意外截断 salt。但是,除非使用P/Invoke ,否则这在 .NET 中不太可能成为问题。

于 2012-10-03T08:29:30.927 回答