2009-05-12 35 views
7

Tôi không biết nếu tôi đang hỏi một câu hỏi ngớ ngẩn nhưng tôi muốn biết liệu chức năng Convert.ToBase64String trong .NET có trả về cùng độ dài với kích thước byte nguồn hay không? Tôi muốn thử các bài viết từ MSDN chính nó How To: Use Forms Authentication with SQL Server 2000 để băm mật khẩu của tôi, nhưng tôi phát hiện ra rằng các chức năng mà họ sử dụng để tạo ra chuỗi muối là trở về 3 chiều dài hơn nó là vụ phải trả lại. Để làm rõ ở đây là mã trong bài viết đó.Convert.ToBase64String có trả về cùng độ dài với mảng byte nguồn không?

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

Trả lời

1

Mã hóa base64 của chuỗi byte dài hơn chuỗi byte vì chuỗi byte có 2^8 khả năng cho mỗi "vị trí", trong khi chuỗi 64 cơ sở chỉ có 2^6 khả năng cho mỗi vị trí (đó là lý do chúng tôi gọi nó là cơ sở 64).

Chỉ cần nghĩ về logarit và lỗ chim bồ câu. Lấy số 5000. Bạn cần bao nhiêu vị trí (lỗ chim bồ câu, byte) để lưu trữ nó trong cơ sở 256?

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

Trường hợp log_2 cho bạn biết bạn cần bao nhiêu bit. Bây giờ có bao nhiêu trong base64?

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

Không, Base64 trả về 4 byte đầu ra cho đầu vào 3 byte, được làm tròn (đệm bằng =) đến ranh giới 4 byte tiếp theo.

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

Đó là bởi vì nó chỉ sử dụng 6 bit (về cơ bản một số 0-63) mỗi byte để chỉ sử dụng ký tự ASCII mà không được kiểm soát chars và trong phạm vi 7-bit. Vì vậy, bạn nhận được 3 * 8 => 4 * 6 bit khi mã hóa dữ liệu với Base64.

+0

Cảm ơn bạn. Nó thực sự đã giúp tôi với bí ẩn của dấu "=". – User

5

base-64 hiếm khi trả về một chuỗi có cùng độ dài như đầu vào. Về cơ bản, nó chỉ sử dụng 6 trong số 8 bit sẵn có, vì vậy các thông điệp lớn (đặc biệt) sẽ yêu cầu thêm 1/3 khối lượng. Có một vài byte đóng gói (thường là "=") ở cuối để làm cho thông báo rõ ràng.

Các vấn đề liên quan