RNGCryptoServiceProvider和Zeros?

Roy*_*mir 9 c# random encryption .net-4.0 rngcryptoserviceprovider

走过一些cryptogtaphy的东西,我看到RNGCryptoServiceProvider有两种方法:

链接

RNGCryptoServiceProvider.GetNonZeroBytes
Run Code Online (Sandbox Code Playgroud)

RNGCryptoServiceProvider.GetBytes 
Run Code Online (Sandbox Code Playgroud)

所以我问:

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

为什么他们创造了区别?

Ash*_*oss 11

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

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

GetNonZeroBytes(byte [])也可用于生成salt.Cryptography StackExchange站点有一个类似的问题,建议避免0x00使用可能将盐视为零终止字符串的库和API,这会意外截断盐.但是,除非使用P/Invoke,否则这不太可能成为.NET中的一个问题.

  • 盐只是增加了彩虹表的难度。它也可以用 GetBytes 来完成......对吗? (2认同)