c# encryption .net-4.0 random rngcryptoserviceprovider

c# - RNGCryptoServiceProvider y Zeros?



encryption .net-4.0 (1)

caminando por algunas cosas de criptografía, vi que RNGCryptoServiceProvider tiene 2 métodos:

enlazar

RNGCryptoServiceProvider.GetNonZeroBytes

y

RNGCryptoServiceProvider.GetBytes

Y entonces pregunto:

¿Qué tiene de extraño llenar un conjunto de bytes con una secuencia criptográficamente fuerte de valor aleatorio que algunos (0 o más) de ellos son ceros? (Son valores aleatorios y aparentemente no habrá muchos ceros, y aún cero es también un número regular)

¿Por qué crearon la distinción?


Dentro del marco de .NET, GetNonZeroBytes (byte []) se utiliza al generar el relleno PKCS # 1 para el cifrado RSA, que usa 0x00 como separador.

Usando una herramienta como Reflector, puede ver que se usa en RSAPKCS1KeyExchangeFormatter.CreateKeyExchange (byte []) para implementar el relleno según RFC 2313 , sección 8.1.2 ( RFC 3218 tiene un buen arte ASCII que demuestra el diseño de bytes con mayor claridad).

GetNonZeroBytes (byte []) también se podría usar para generar sal. El sitio Cryptography StackExchange tiene una pregunta similar que sugiere que evitar 0x00 es ayudar con bibliotecas y API que pueden tratar la sal como una cadena terminada en cero, lo que accidentalmente truncaría la sal. Sin embargo, a menos que uno esté usando P / Invoke , es poco probable que esto sea una preocupación en .NET.