Danh mục

Các giải pháp lập trình CSharp- P69

Số trang: 10      Loại file: pdf      Dung lượng: 2.63 MB      Lượt xem: 3      Lượt tải: 0    
10.10.2023

Xem trước 2 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

Các giải pháp lập trình CSharp- P69: Các giải pháp lập trình C# khảo sát chiều rộng của thư viện lớp .NET Framework và cung cấp giải pháp cụ thể cho các vấn đềthường gặp. Mỗi giải pháp được trình bày theo dạng “vấn đề/giải pháp” một cách ngắn gọn và kèm theo là các ví dụ mẫu.
Nội dung trích xuất từ tài liệu:
Các giải pháp lập trình CSharp- P69 571 Chương 14: Mật mãusing System.Text;using System.Security.Cryptography;public class AsymmetricEncryptionExample { public static void Main(string[] args) { // 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); } // Hiển thị thông điệp plaintext gốc. Console.WriteLine(Original message = {0}, args[0]); // Chuyển thông điệp gốc thành mảng byte. Tốt nhất là không // truyền các thông tin bí mật ở dạng chuỗi giữa các phương thức.572Chương 14: Mật mã byte[] plaintext = Encoding.Unicode.GetBytes(args[0]); // Mật hóa thông điệp bằng phương thức EncryptMessage. // Phương thức này cần PUBLIC KEY của người nhận. byte[] ciphertext = EncryptMessage(plaintext, recipientsPublicKey); // Hiển thị ciphertext do phương thức EncryptMessage trả về. // Sử dụng phương thức BitConverter.ToString method cho đơn giản // mặc dù nó chèn dấu gạch nối (-) vào giữa các giá trị byte // (không đúng với biểu diễn dữ liệu trong bộ nhớ). Console.WriteLine(Formatted Ciphertext = {0}, BitConverter.ToString(ciphertext)); // Giải mật hóa thông điệp (đã-được-mật-hóa) bằng phương thức // DecryptMessage. Phương thức này cần truy xuất PRIVATE KEY // của người nhận (chỉ có người nhận mới có thể truy xuất được). // Chúng ta sẽ truyền cho nó một đối tượng CspParameters // (cho biết PRIVATE KEY được lưu trữ trong kho chứa khóa nào). // Giải pháp này an toàn hơn là truyền PRIVATE KEY thô // giữa các phương thức. byte[] decData = DecryptMessage(ciphertext, cspParams); // Chuyển thông điệp đã-được-giải-mật-hóa từ mảng byte // thành chuỗi và hiển thị nó ra cửa sổ Console. Console.WriteLine(Decrypted message = {0}, Encoding.Unicode.GetString(decData)); // Nhấn Enter để kết thúc. Console.ReadLine(); } // Phương thức dùng để mật hóa (theo RSA) một thông điệp bằng // PUBLIC KEY (nằm trong một cấu trúc RSAParameters). private static byte[] EncryptMessage(byte[] plaintext, RSAParameters rsaParams) { 573 Chương 14: Mật mã // Khai báo mảng byte chứa ciphertext. byte[] ciphertext = null; // Tạo một thể hiện của giải thuật RSA. using (RSACryptoServiceProvider rsaAlg = new RSACryptoServiceProvider()) { rsaAlg.ImportParameters(rsaParams); // Mật hóa plaintext bằng OAEP padding // (chỉ được hỗ trợ trên Windows XP trở về sau). ciphertext = rsaAlg.Encrypt(plaintext, true); } // Xóa các giá trị được giữ trong mảng byte chứa plaintext. // Điều này bảo đảm dữ liệu bí mật không còn trong bộ nhớ // sau khi bạn giải phóng tham chiếu đến nó. Array.Clear(plaintext, 0, plaintext.Length); return ciphertext;}// Phương thức dùng để giải mật hóa một thông điệp (đã-được-mật-hóa-// theo-RSA) bằng PRIVATE KEY (do đối tượng CspParameters chỉ định).private static byte[] DecryptMessage(byte[] ciphertext, CspParameters cspParams ) { // Khai báo mảng byte chứa plaintext (đã-được-giải-mật-hóa). byte[] plaintext = null; // Tạo một thể hiện của giải thuật RSA. using (RSACryptoServiceProvider rsaAlg = new RSACryptoServiceProvider(cspParams)) { // Giải mật hóa plaintext bằng OAEP padding. plaintext = rsaAlg.Decrypt(ciphertext, true); } 574 Chương 14: Mật mã return plaintext; }}Lệnh AsymmetricEncryptionExample I love you! sẽ sinh ra kết xuất tương tự như sau:Original message = I love you!Formatted Ciphertext = 1F-53-05-2B-9D-CC-20-6B-5D-D3-D4-0B-C9-5F-CA-FA-C1-61-6C-3B-5B-9E-EA-B9-D0-AF-E5-2B-05-BC-D4-94-DD-71-D6-21-2A-B0-82-6B-16-C0-89-3E-24-B3-B3-A3-15-FE-16-7A-B0-58-14-43-CD-69-1A-FD-08-39-2D-09-A6-41-86-96-78-B4-3D-D6-C7-39-8A-90-84-D6-68-E6-5D-86-32-14-67-51-A7-B7-5A-EF-CF-F4-6D-E4-B0-18-6A-16-2A-AF-54-B7-3C-B8-19-6E-A5-86-BF-3E-B2-6D-17-E3-1D-E8-AD-D1-A8-D9-54-93-8E-F1-E8-5D-AC-4ADecrypted message = I love you! Nếu bạn chạy ví dụ này nhiều lần với cùng thông điệp và khóa, ciphertext sẽ khác nhau. Đó là vì cơ chế padding sinh ra dữ liệu ngẫu nhiên để tránh các dạng tấn công bằng mật mã. Mặc dù hơi rắc rối nhưng đây chính là cách hành xử mà ta mong đợi.9. Lưu trữ khóa bất đối xứng một cách an toàn Bạn cần lưu trữ cặp khóa bất đối xứng vào một nơi an toàn để ứng dụng của bạn có thể truy xuất được d ...

Tài liệu được xem nhiều: