通过一些密码学习,我看到RNGCryptoServiceProvider
有两种方法:
RNGCryptoServiceProvider.GetNonZeroBytes
和
RNGCryptoServiceProvider.GetBytes
所以我问:
什么是奇数,用一个加密强大的随机值序列填充一个字节数组,其中某些(0或更多)是零? (它是随机值,显然不会有很多零,仍然为零也是常规数字)
为什么他们创造了区别?
答案 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中的一个问题。