C ũng như nên sử dụng một khóa đối xứng có chiều dài phù hợp với tính bí mật của dữ liệu đang được bảo vệ, bạn nên mật hóa khóa phiên bằng một giải thuật
DeformatKeyExchange với đối số là dữ liệu trao đổi đã được định dạng và đối tượng
CspParameters chứa một tham chiếu đến kho chứa khóa MyKeys (chứa khóa riêng của người nhận). Trong suốt quá trình này, phương thức Main sẽ hiển thị khóa phiên gốc, dữ liệu trao đổi nhận). Trong suốt quá trình này, phương thức Main sẽ hiển thị khóa phiên gốc, dữ liệu trao đổi đã được định dạng, và cuối cùng là khóa phiên đã được giải định dạng.
using System; using System.Text;
using System.Security.Cryptography; public class KeyExchangeExample { public static void Main() {
// Khai báo một biến RSAParameters, biến này sẽ
// chứa thông tin PUBLIC KEY của người nhận. RSAParameters recipientsPublicKey;
// Khai báo một biến CspParameters, biến này sẽ cho biết // PRIVATE KEY được lưu trữ trong kho chứa khóa nào. // Thông thường, chỉ có người nhận mới có thể truy xuất // thông tin này. Với mục đích minh họa, chúng ta sẽ tạo // một cặp khóa ngay đầu ví dụ và sử dụng các khóa này // cho cả bên gửi và bên nhận.
CspParameters cspParams = new CspParameters(); cspParams.KeyContainerName = "MyKeys";
// Tạo cặp khóa bất đối xứng bằng lớp RSACryptoServiceProvider. // Lưu các khóa này vào một kho chứa khóa có tên là "MyKeys" // và trích thông tin PUBLIC KEY vào biến recipientsPublicKey. using (RSACryptoServiceProvider rsaAlg =
new RSACryptoServiceProvider(cspParams)) {
// Cấu hình cho giải thuật lưu khóa vào kho chứa khóa. rsaAlg.PersistKeyInCsp = true; // Trích PUBLIC KEY. recipientsPublicKey = rsaAlg.ExportParameters(false); } // Tạo giải thuật đối xứng Triple-DES và sử dụng // khóa được sinh tự động làm khóa phiên.
using (SymmetricAlgorithm symAlg = SymmetricAlgorithm.Create("3DES")) {
// Hiển thị khóa phiên gốc.
Console.WriteLine("Session Key at Source = {0}\n\r", BitConverter.ToString(symAlg.Key));
// Chuẩn bị khóa phiên đối xứng dùng cho trao đổi // (sử dụng phương thức FormatKeyExchange, phương thức // này cần khóa dùng để mật hóa và PUBLIC KEY
// của người nhận). byte[] exchangeData =
FormatKeyExchange(symAlg.Key, recipientsPublicKey);
// Hiển thị khóa phiên đã-được-mật-hóa (do phương thức // FormatKeyExchange trả về).
Console.WriteLine("Exchange Data = {0}\n\r", BitConverter.ToString(exchangeData)); // ****** GỬI KHÓA ******
// Bây giờ, khóa phiên có thể được gửi đi bằng các // kênh giao tiếp bình thường.
// Trích khóa phiên từ dữ liệu trao đổi bằng // phương thức DeformatKeyExchange.
byte[] sessionKey = DeformatKeyExchange(exchangeData, cspParams);
// Hiển thị khóa phiên vừa được trích.
Console.WriteLine("Session Key at Destination = {0}\n\r", BitConverter.ToString(sessionKey));
// Nhấn Enter để kết thúc. Console.ReadLine();
} }
// Phương thức dùng để mật hóa và định dạng khóa phiên đối xứng. // Để mật hóa khóa phiên, chúng ta cần truy xuất PUBLIC KEY // của người nhận (trong cấu trúc RSAParameters).
private static byte[] FormatKeyExchange(byte[] sessionKey, RSAParameters rsaParams) {
// Tạo một giải thuật bất đối xứng RSA. using (RSACryptoServiceProvider asymAlg = new RSACryptoServiceProvider()) {
// Nạp PUBLIC KEY của người nhận. asymAlg.ImportParameters(rsaParams);
// Tạo một RSA OAEP formatter để định dạng dữ liệu trao đổi. RSAOAEPKeyExchangeFormatter formatter
= new RSAOAEPKeyExchangeFormatter();
// Chỉ định giải thuật RSA dùng để mật hóa khóa phiên. formatter.SetKey(asymAlg);
// Mật hóa và định dạng khóa phiên rồi trả về kết quả. return formatter.CreateKeyExchange(sessionKey);
} }
// Phương thức dùng để giải mật hóa dữ liệu trao đổi và trích khóa phiên // đối xứng. Để giải mật hóa dữ liệu trao đổi, chúng ta cần truy xuất // PRIVATE KEY (từ kho chứa khóa do đối số cspParams chỉ định).
private static byte[] DeformatKeyExchange(byte[] exchangeData, CspParameters cspParams) {
// Tạo một giải thuật bất đối xứng RSA. using (RSACryptoServiceProvider asymAlg = new RSACryptoServiceProvider(cspParams)) {
// Tạo một RSA OAEP deformatter để trích khóa phiên // từ dữ liệu trao đổi.
RSAOAEPKeyExchangeDeformatter deformatter = new RSAOAEPKeyExchangeDeformatter();
// Chỉ định giải thuật RSA dùng để giải mật hóa dữ liệu trao đổi. deformatter.SetKey(asymAlg);
// Giải mật hóa dữ liệu trao đổi và trả về khóa phiên. return deformatter.DecryptKeyExchange(exchangeData); }
} }