570
Chương 14: Mật mã
•
Sử dụng phương thức
RSACryptoServiceProvider.FromXmlString
để nạp dữ liệu khóa
công khai từ một chuỗi XML. Chủ sở hữu có thể tạo dữ liệu XML này bằng phương thức
RSACryptoServiceProvider.ToXmlString
và gửi nó cho bạn.
Cả phương thức
ExportParameters
và
ToXmlString
của lớp
RSACryptoServiceProvider
đều nhận một đối số luận lý, nếu là
true
, đối tượng
RSACryptoServiceProvider
sẽ xuất cả khóa công khai và khóa riêng. Bạn chỉ định
giá trị này là
false
khi cần xuất khóa cho mục đích phân phối hay lưu trữ.
Một khi đã nạp khóa công khai của người nhận vào đối tượng
RSACryptoServiceProvider
,
bạn có thể mật hóa dữ liệu. Giải thuật bất đối xứng chậm hơn giải thuật đối xứng khi mật hóa
và giải mật hóa dữ liệu. Vì lý do này, bạn không nên sử dụng giải thuật bất đối xứng để mật
hóa lượng dữ liệu lớn. Thông thường, nếu cần mật hóa lượng dữ liệu lớn, bạn nên sử dụng
giải thuật đối xứng và rồi mật hóa khóa đối xứng bằng giải thuật bất đối xứng để bạn có thể
gửi khóa đối xứng cùng với dữ liệu. Mục 14.10 sẽ thảo luận về vấn đề này. Để bảo đảm tính
nhất quán trong việc sử dụng, lớp
RSACryptoServiceProvider
không hỗ trợ mô hình mật hóa
và giải mật hóa dựa-trên-
System.IO.Stream
(đã được sử dụng trong mục 14.6).
Để mật hóa dữ liệu với đối tượng
RSACryptoServiceProvider
, bạn hãy gọi phương thức
Encrypt
, truyền cho nó một mảng byte chứa plaintext;
Encrypt
sẽ trả về một mảng byte chứa
ciphertext. Phương thức
Encrypt
cũng mhận một đối số luận lý cho biết kiểu padding mà đối
tượng
RSACryptoServiceProvider
sẽ sử dụng. Padding cho biết đối tượng bất đối xứng sẽ xử
lý plaintext như thế nào trước khi mật hóa. Padding bảo đảm giải thuật bất đối xứng không
cần xử lý từng khối dữ liệu, và bảo vệ ciphertext đối với các dạng tấn công bằng mật mã. Diễn
giải các dạng padding vượt quá phạm vi của quyển sách này. Nói chung, nếu đang sử dụng
Microsoft Windows XP trở về sau, bạn nên chỉ định đối số padding là
true
; nếu không, bạn
phải chỉ định đối số padding là là
false
(nếu không thì
Encrypt
sẽ ném ngoại lệ
System.Security.Cryptography.CryptographicException
).
Giải mật hóa dữ liệu cũng đơn giản như mật hóa dữ liệu. Người nhận cần tạo một đối tượng
RSACryptoServiceProvider
và nạp nó cùng với khóa riêng. Thông thường, khóa này sẽ được
lưu trữ trong một kho chứa khóa (key container) do CryptoAPI quản lý (sẽ được thảo luận kỹ
hơn trong mục 14.9). Người nhận gọi
RSACryptoServiceProvider.Decrypt
và truyền cho nó
ciphertext mà bạn đã gửi. Người nhận phải chỉ định cơ chế padding, và nó cũng phải giống
như khi mật hóa dữ liệu. Phương thức
Decrypt
trả về một mảng byte chứa plaintext đã-được-
giải-mật-hóa. Nếu plaintext mô tả một chuỗi, người nhận phải chuyển mảng byte thành giá trị
chuỗi thích hợp bằng lớp
System.Text.Encoding
.
Lớp
RSACryptoServiceProvider
thừa kế các phương thức có tên là
EncryptValue
và
DecryptValue
từ lớp cha của nó là
System.Security.Cryptography.RSA
. Lớp
RSACryptoServiceProvider
không hiện thực các phương thức này và ném ngoại lệ
System.NotSupportedException
nếu bạn gọi chúng.
Lớp
AsymmetricEncryptionExample
dưới đây trình bày cách sử dụng lớp
RSACryptoServiceProvider
để mật hóa một chuỗi và rồi giải mật hóa:
using System;