RNGCryptoServiceProvider和Zeros?

时间:2012-10-03 07:33:24

标签: c# encryption .net-4.0 random rngcryptoserviceprovider

通过一些密码学习,我看到RNGCryptoServiceProvider有两种方法:

link

RNGCryptoServiceProvider.GetNonZeroBytes

RNGCryptoServiceProvider.GetBytes 

所以我问:

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

为什么他们创造了区别?

1 个答案:

答案 0 :(得分:10)

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

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

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