551
Chương 14: Mật mã
System.Security.Cryptography.RandomNumberGenerator
. Đây là một lớp trừu tượng mà tất cả
các bộ tạo số ngẫu nhiên cụ thể đều sẽ thừa kế từ nó. Hiện tại, chỉ có một hiện thực là lớp
RNGCryptoServiceProvider
. Lớp này cung cấp một vỏ bọc được-quản-lý cho hàm
CryptGenRandom
của Win32 CryptoAPI, và bạn có thể sử dụng để đổ vào một mảng byte các
giá trị byte ngẫu nhiên.
Các số do
RNGCryptoServiceProvider
sinh ra không thật sự ngẫu nhiên. Tuy
nhiên, chúng “đủ” ngẫu nhiên để đáp ứng yêu cầu cho các ứng dụng mật mã và
bảo mật trong hầu hết các môi trường chính phủ và thương mại.
Lớp cơ sở
RandomNumberGenerator
là một factory cho các lớp hiện thực dẫn xuất từ đó. Gọi
RandomNumberGenerator.Create("System.Security.Cryptography.RNGCryptoServiceProvider")
sẽ trả về một thể hiện của
RNGCryptoServiceProvider
, và bạn có thể sử dụng nó để tạo số
ngẫu nhiên. Ngoài ra, vì
RNGCryptoServiceProvider
là hiện thực duy nhất nên nó sẽ là lớp
mặc định được tạo ra khi bạn gọi phương thức
Create
không có đối số:
RandomNumberGenerator.Create()
.
Ví dụ dưới đây tạo một đối tượng
RNGCryptoServiceProvider
và sử dụng nó để tạo các giá trị
ngẫu nhiên. Phương thức
GetBytes
đổ vào một mảng byte các giá trị byte ngẫu nhiên. Bạn có
thể sử dụng phương thức
GetNonZeroBytes
nếu cần dữ liệu ngẫu nhiên không chứa giá trị
zero.
using System;
using System.Security.Cryptography;
public class SecureRandomNumberExample {
public static void Main() {
// Tạo mảng byte dùng để lưu trữ dữ liệu ngẫu nhiên.
byte[] number = new byte[32];
// Tạo bộ tạo số ngẫu nhiên mặc định.
RandomNumberGenerator rng = RandomNumberGenerator.Create();
// Tạo dữ liệu ngẫu nhiên.
rng.GetBytes(number);
// Hiển thị dữ liệu ngẫu nhiên.
Console.WriteLine(BitConverter.ToString(number));
}
}