2009-05-12 12 views
7

Non so se sto facendo una domanda stupida ma voglio sapere se la funzione Convert.ToBase64String in .NET restituisce la stessa lunghezza della dimensione del byte sorgente o è diversa? Volevo provare l'articolo da MSDN How To: Use Forms Authentication with SQL Server 2000 per cancellare la mia password, ma ho scoperto che la funzione utilizzata per creare la stringa salt restituisce 3 lunghezze in più rispetto a quanto dovrebbe restituire. Per chiarire qui è il codice in quell'articolo.Does Convert.ToBase64String restituisce la stessa lunghezza del suo array di byte di origine?

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); 
} 

risposta

1

La codifica base64 di una stringa di byte è più lunga della stringa di byte perché quella stringa di byte ha 2^8 possibilità per "posizione", mentre una stringa di base 64 ha solo 2^6 possibilità per posizione (ecco perché la chiamiamo base 64).

Basta pensare ai logaritmi e ai buchi dei piccioni. Prendi il numero 5000. Quante posizioni (colombe, byte) ti servono per memorizzarla nella base 256?

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

Dove log_2 indica quanti bit sono necessari. Ora quanti in base64?

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

No, Base64 restituisce uscita 4 byte per byte di ingresso 3, arrotondato (riempito con =) al successivo limite di 4 byte.

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

Ecco perché utilizza solo 6 bit (sostanzialmente un numero 0-63) per byte per utilizzare solo caratteri ASCII che non controllano caratteri e nella gamma 7 bit. Pertanto, si ottengono 3 * 8 => 4 * 6 bit durante la codifica dei dati con Base64.

+0

Grazie amico. Mi ha davvero aiutato con il mistero del trailing "=". – User

5

base-64 restituisce raramente una stringa della stessa lunghezza dell'input. Essenzialmente, utilizza solo 6 degli 8 bit disponibili, quindi i messaggi di grandi dimensioni (in particolare) richiedono un volume aggiuntivo di 1/3. Ci sono alcuni byte di imballaggio (di solito "=") alla fine per rendere il messaggio non ambiguo.

Problemi correlati