2009-05-12 11 views
7

No sé si estoy haciendo una pregunta tonta, pero quiero saber si la función Convert.ToBase64String en .NET devuelve la misma longitud que el tamaño del byte de origen o si es diferente. Quise probar el artículo de MSDN en sí mismo How To: Use Forms Authentication with SQL Server 2000 para cifrar mi contraseña, pero descubrí que la función que utilizaron para crear la cadena de sal está devolviendo 3 veces más de lo que se supone que debe devolver. Para aclarar aquí está el código en ese artículo.¿Convert.ToBase64String devuelve la misma longitud que su matriz de bytes de origen?

private static string CreateSalt(int size) 
{ 
    // Generate a cryptographic random number using the cryptographic 
    // service provider 
    RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); 
    byte[] buff = new byte[size]; 
    rng.GetBytes(buff); 
    // Return a Base64 string representation of the random number 
    return Convert.ToBase64String(buff); 
} 

Respuesta

1

La codificación base64 de una cadena de bytes es más larga que la cadena de bytes porque esa cadena de bytes tiene 2^8 posibilidades por "ubicación", mientras que una cadena base 64 tiene solo 2^6 posibilidades por ubicación (por eso la llamamos base 64).

Solo piense en los logaritmos y los agujeros de las palomas. Tome el número 5000. ¿Cuántas ubicaciones (palomas, bytes) necesita para almacenarlas en la base 256?

"Locations in base256" = ceil(log_2(5000)/8) = ceil(1.54) = 2 

Donde log_2 te dice cuántos bits necesitas. Ahora, ¿cuántos en base64?

"Locations in base64" = ceil(log_2(5000)/6) = ceil(2.04) = 3 
14

No, Base64 devuelve salida de 4 bytes para la entrada de 3 bytes, redondeado (rellenado con =) al siguiente límite de 4 bytes.

int outputLength = ((inputLength+2)/3)*4 

Esto se debe a que sólo utiliza 6 bits (básicamente un número 0-63) por byte con el fin de utilizar sólo caracteres ASCII que no se controlan caracteres y en el rango de 7 bits. Por lo tanto, obtienes 3 * 8 => 4 * 6 bits cuando codificas datos con Base64.

+0

Gracias buddy. Realmente me ayudó con el misterio de seguir "=". – User

5

base-64 rara vez devuelve una cadena de la misma longitud que la entrada. Esencialmente, solo usa 6 de los 8 bits disponibles, por lo que los mensajes grandes (en particular) requerirán un volumen adicional de 1/3. Hay unos pocos bytes de empaque (generalmente "=") al final para que el mensaje no sea ambiguo.

Cuestiones relacionadas