569
Chương 14: Mật mã
Encrypt
và khóa công khai (public key) của người nhận để mật hóa thông điệp.
Sau đo, người nhận sẽ sử dụng phương thức
RSACryptoServiceProvider.Decrypt
và khóa riêng (private key) để giải mật hóa bí mật đã-được-mật-hóa.
.NET Framework định nghĩa một hệ thống phân cấp theo lớp cho các giải thuật bất đối xứng
tương tự như đã định nghĩa cho các giải thuật đối xứng (đã được thảo luận trong mục 14.6).
Tất cả các giải thuật bất đối xứng phải thừa kế một lớp cơ sở trừu tượng chung có tên là
System.Security.Cryptography.AsymmetricAlgorithm
. Có hai hiện thực giải thuật bất đối
xứng cụ thể:
•
System.Security.Cryptography.RSACryptoServiceProvider
•
System.Security.Cryptography.DSACryptoServiceProvider
Vì có đuôi là
CryptoServiceProvider
nên cả hai lớp này đều bọc lấy các chức năng do Win32
CryptoAPI cung cấp. Tuy nhiên, chỉ có lớp
RSACryptoServiceProvider
là hỗ trợ việc mật hóa
dữ liệu. Lớp
DSACryptoServiceProvider
hiện thực Digital Signature Algorithm (DSA), bạn có
thể sử dụng giải thuật này chỉ để tạo chữ ký số (xem Federal Information Processing
Standard [FIPS] 186-2 tại
[
http://www.itl.nist.gov/fipspubs]
để biết thêm chi tiết về DSA).
Mặc dù bạn có thể tạo một đối tượng giải thuật bất đối xứng bằng phương thức tĩnh
Create
của lớp cơ sở
AsymmetricAlgorithm
, nhưng bù lại bạn sẽ phải trả giá chút ít cho việc này. Lớp
AsymmetricAlgorithm
không khai báo các phương thức mà
RSACryptoServiceProvider
sử
dụng để mật hóa và giải mật hóa dữ liệu. Thay vào đó, bạn phải trực tiếp thể hiện hóa lớp
RSACryptoServiceProvider
bằng một trong các phương thức khởi dựng của nó.
Trước khi mật hóa hay giải mật hóa dữ liệu với đối tượng
RSACryptoServiceProvider
, bạn cần
truy xuất các khóa thích hợp. Khóa của giải thuật bất đối xứng khác nhiều so với khóa của giải
thuật đối xứng. Thứ nhất, nó có hai thành phần: khóa công khai (public key) và khóa riêng
(private key). Thứ hai, thay vì chỉ là một dãy các byte được sinh ngẫu nhiên, khóa bất đối
xứng được tạo theo một cách thức đặc biệt. Có một mối quan hệ toán đặc biệt giữa khóa công
khai và khóa riêng; mối quan hệ này cho phép giải thuật bất đối xứng mật hóa dữ liệu bằng
một khóa và giải mật hóa dữ liệu bằng một khóa khác. Mỗi giải thuật bất đối xứng sử dụng
cách thức tạo khóa của chính nó, và các lớp hiện thực cụ thể đóng gói các chức năng cần thiết
để tạo ra các khóa mới.
Khóa công khai không cần được giữ bí mật và chủ sở hữu có thể tùy ý gửi nó cho bạn thông
qua e-mail, hoặc post nó lên một website hay một server phân phối khóa để mọi người cùng
thấy. Những ai muốn gửi bí mật thì sử dụng khóa công khai để mật hóa bí mật. Sau đó, người
nhận sử dụng khóa riêng để giải mật hóa bí mật. Khóa riêng phải được giữ bí mật; những ai sở
hữu khóa riêng đều có thể giải mật hóa dữ liệu đã-được-mật-hóa bằng khóa công khai.
Để tạo một bí mật được-mật-hóa-bất-đối-xứng, bạn phải có khóa công khai của người nhận và
nạp nó vào một đối tượng
RSACryptoServiceProvider
. Có hai cách nạp khóa công khai:
•
Sử dụng phương thức
RSACryptoServiceProvider.ImportParameters
để nhập một cấu
trúc
System.Security.Cryptography.RSAParameters
, cấu trúc này chứa thông tin khóa
công khai của người nhận. Chủ sở hữu có thể tạo cấu trúc
RSAParameters
bằng phương
thức
RSACryptoServiceProvider.ExportParameters
và gửi nó cho bạn. Tuy nhiên,
người này có thể gửi cho bạn khóa công khai ở dạng byte, và bạn phải tự nạp giá trị này
vào cấu trúc
RSAParameters
.