CÁC GIẢI PHÁP LẬP TRÌNH C# - Trang 570

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

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

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

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;

Liên Kết Chia Sẽ

** Đây là liên kết chia sẻ bới cộng đồng người dùng, chúng tôi không chịu trách nhiệm gì về nội dung của các thông tin này. Nếu có liên kết nào không phù hợp xin hãy báo cho admin.