2009-05-12 12 views
7

Nie wiem, czy zadaję głupie pytanie, ale chcę wiedzieć, czy funkcja Convert.ToBase64String w .NET zwraca tę samą długość, co jego bajt źródłowy, czy jest inny? Chciałem wypróbować artykuł od samego MSDN'a How To: Use Forms Authentication with SQL Server 2000, aby zaszyfrować moje hasło, ale odkryłem, że funkcja, której użyli do utworzenia ciągu soli, zwraca 3 dodatkowe długości, niż powinna. Aby wyjaśnić tutaj, jest kod w tym artykule.Czy Convert.ToBase64String zwraca tę samą długość, co jej tablica bajtów źródłowych?

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

Odpowiedz

1

Kodowanie base64 ciągu bajtów jest dłuższe niż ciąg bajtów, ponieważ ten ciąg bajtów ma 2^8 możliwości na "lokalizację", podczas gdy łańcuch podstawowy ma tylko 2^6 możliwości na lokalizację (dlatego nazywamy to podstawa 64).

Wystarczy pomyśleć o logarytmach i otworach dla gołębi. Podaj liczbę 5000. Ile lokalizacji (dziury gołębi, bajty) potrzebujesz, aby przechowywać ją w bazie 256?

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

Gdzie log_2 mówi, ile bitów potrzebujesz. Teraz ile w base64?

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

Nie base64 powraca 4 bajty wyjście wejście 3 bajty zaokrągleniu (dopełnione =) do następnej granicy 4 bajtów.

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

To dlatego, że używa tylko 6 bitów (w zasadzie numer 0-63) na bajt, aby używać tylko znaków ASCII, które nie kontrolują i znaki w zakresie 7-bitowym. Dlatego podczas kodowania danych za pomocą Base64 uzyskuje się 3 * 8 => 4 * 6 bitów.

+0

Dziękuję kolego. Naprawdę pomogło mi to w tajemniczej trailing "=". – User

5

base-64 rzadko zwraca ciąg o tej samej długości co wejście. Zasadniczo używa tylko 6 z dostępnych 8 bitów, więc duże wiadomości (w szczególności) będą wymagać dodatkowej 1/3 objętości. Istnieje kilka bajtów pakowania (zwykle "=") na końcu, aby wiadomość była jednoznaczna.

Powiązane problemy