TIN HỌC ỨNG DỤNG 2 - K11
Bạn hãy đăng ký làm thành viên để có thể xem các thông tin trong lớp và viết bài trong diễn đàn.

Không những thế, sau khi đăng ký bạn sẽ nhận được sự hỗ trợ của diễn đàn nhiều hơn.
Change background image
TIN HỌC ỨNG DỤNG 2 - K11

Khoa CNTT - ĐH Công nghiệp Hà Nội


Go downMessage [Page 1 of 1]

© FMvi.vn

on 21/10/2011, 20:13

Admin

Thư viện .NET cung cấp tất cả các yếu tố để bạn có thể mã hóa và giải mã chuỗi. Tuy nhiên, để thực hiện công việc này, chúng ta vẫn phải động não và bắt tay vào viết code. Tut sau đây tôi sẽ trình bày cách mã hóa và giải mã một chuỗi trong C#. Ta sẽ sử dụng thuật toán TripleDES để thực hiện công việc này.

Đặt Vấn Đề
Tôi có một chuỗi bất kì chứa trong biến Msg. Tôi muốn mã hóa chuỗi này và đặt password để có thể giải mã được chuỗi, biến chứa password có tên là Password. Kết quả trả về sẽ là một chuỗi đã được mã hóa bằng thuật toán Base64. Và việc cuối cùng ta cần làm chỉ là: Nhớ password trong đầu – Và cất chuỗi trả về ở một nơi an toàn
Code:

    string Msg = "Day La Chuoi Ma Chung Ta Can Ma Hoa";
    string Password = "bimatkhongthenoi";
    string EncryptedString = EncryptString(Msg, Password);
    string DecryptedString = DecryptString(EncryptedString, Password);
    Console.WriteLine("Message: {0}",Msg);
    Console.WriteLine("Password: {0}",Password);
    Console.WriteLine("Encrypted string: {0}",EncryptedString);
    Console.WriteLine("Decrypted string: {0}",DecryptedString);

Trong đoạn code trên, ta dễ dàng thấy cần tạo một hàm có tên là EncryptString() với hai biến truyền vào là Chuỗi cần mã hóa (Message) và Password (Passphrase). Như đã nói ở trên, trong nội dung bài viết này tôi sẽ áp dụng thuật toán [Bạn hãy đăng nhập để xem link này] trong hàm EncryptString sử dụng khóa 128 bit. Tuy nhiên, trước tiên ta cần phải đưa Cụm mật mã (Passpharse) về dạng khóa 128 bit. Một sự trùng hợp khá thú vị là thuật toán băm chuỗi bằng MD5 chấp nhận một tập hợp các byte có độ dài bất kì và đưa nó về dạng khóa 128 bit. Vậy công việc của chúng ta trở nên đơn giản (Nói nôm na khúc này, ta sẽ băm Passphrase bằng MD5)

Như vậy, công việc trước tiên của hàm mã hóa sẽ là:
Code:

MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(Passphrase));

Thuật toán Triple DES bản thân nó đã tự động chuyển một mảng byte vào một mảng byte đã được mã hóa. Vì thế, ta cần convert chuỗi nhập vào (Message – Đã được mã hóa Unicode) thành mảng byte thông qua bộ mã hóa System.Text.UTF8Encoding
Công việc đầu tiên ở bước thứ hai chính là khởi tạo thuật toán Triple DES:
// Step 2. Tao doi tuong TripleDESCryptoServiceProvider moi
Code:
TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();

Bước tiếp theo, ta cần xác định các điều kiện sau đây:
- Chỉ mã hóa kí tự (cụm) một lần bằng bộ mã hóa CipherMode.ECB: Xin giải thích một chút ở đây. Ví dụ trong chuỗi của tôi xuất hiện 2 cụm “123″ thì 2 cụm này đều sẽ được mã hóa với cùng một khóa. Đây là vấn đề trung tậm của bộ mã hóa này. ([Bạn hãy đăng nhập để xem link này])
- Sử dụng chế độ đệm PaddingMode.PKCS7 ([Bạn hãy đăng nhập để xem link này])

Vậy sau bước 2 và 3, ta sẽ có đoạn code sau đây:
Code:

// Step 2. Tao doi tuong TripleDESCryptoServiceProvider moi
TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
 
// Step 3. Cai dat bo ma hoa
TDESAlgorithm.Key = TDESKey;
TDESAlgorithm.Mode = CipherMode.ECB;
TDESAlgorithm.Padding = PaddingMode.PKCS7;

Cuối cùng, mảng byte sẽ được convert sang dạng chuỗi đã được mã hóa bằng thuật toán Base64 để tiện cho việc lưu trữ.

Hàm DecryptString() cũng có 2 đối số đó là Chuỗi đã mã hóa (Message), và password để giải mã (Passpharse). Vì là làm ngược lại của bộ mã hóa nên tôi sẽ không đi sâu vào chi tiết.
Code:

    using System;
    using System.Text;
    using System.Security.Cryptography;
   
    namespace EncryptStringSample
    {
        class MainClass
        {
   
            public static string EncryptString(string Message, string Passphrase)
            {
                byte[] Results;
                System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
   
                // Buoc 1: Bam chuoi su dung MD5
   
                MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
                byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(Passphrase));
   
                // Step 2. Tao doi tuong TripleDESCryptoServiceProvider moi
                TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
   
                // Step 3. Cai dat bo ma hoa
                TDESAlgorithm.Key = TDESKey;
                TDESAlgorithm.Mode = CipherMode.ECB;
                TDESAlgorithm.Padding = PaddingMode.PKCS7;
   
                // Step 4. Convert chuoi (Message) thanh dang byte[]
                byte[] DataToEncrypt = UTF8.GetBytes(Message);
   
                // Step 5. Ma hoa chuoi
                try
                {
                    ICryptoTransform Encryptor = TDESAlgorithm.CreateEncryptor();
                    Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length);
                }
                finally
                {
                    // Xoa moi thong tin ve Triple DES va HashProvider de dam bao an toan
                    TDESAlgorithm.Clear();
                    HashProvider.Clear();
                }
   
                // Step 6. Tra ve chuoi da ma hoa bang thuat toan Base64
                return Convert.ToBase64String(Results);
            }
   
            public static string DecryptString(string Message, string Passphrase)
            {
                byte[] Results;
                System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
   
                // Step 1. Bam chuoi su dung MD5
   
                MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
                byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(Passphrase));
   
                // Step 2. Tao doi tuong TripleDESCryptoServiceProvider moi
                TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
   
                // Step 3. Cai dat bo giai ma
                TDESAlgorithm.Key = TDESKey;
                TDESAlgorithm.Mode = CipherMode.ECB;
                TDESAlgorithm.Padding = PaddingMode.PKCS7;
   
                // Step 4. Convert chuoi (Message) thanh dang byte[]
                byte[] DataToDecrypt = Convert.FromBase64String(Message);
   
                // Step 5. Bat dau giai ma chuoi
                try
                {
                    ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor();
                    Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length);
                }
                finally
                {
                    // Xoa moi thong tin ve Triple DES va HashProvider de dam bao an toan
                    TDESAlgorithm.Clear();
                    HashProvider.Clear();
                }
   
                // Step 6. Tra ve ket qua bang dinh dang UTF8
                return UTF8.GetString(Results);
            }
   
            public static void Main(string[] args)
            {
                // Chuoi can ma hoa
                string Msg = "Day La Chuoi Can Ma Hoa";
                string Password = "bimatkhongthenoi";
   
                string EncryptedString = EncryptString(Msg, Password);
                string DecryptedString = DecryptString(EncryptedString, Password);
   
                Console.WriteLine("Message: {0}", Msg);
                Console.WriteLine("Password: {0}", Password);
                Console.WriteLine("Encrypted string: {0}", EncryptedString);
                Console.WriteLine("Decrypted string: {0}", DecryptedString);
                Console.ReadKey();
            }
        }
    }

Kết

Mã hóa và giải mã là một công việc không hề đơn giản. Những người giỏi nhất trong giới mã hóa cũng phải luôn tìm tòi và học hỏi để nâng cao khả năng của mình. Nếu bạn cảm thấy mình có khả năng về mã hóa, hãy thử đọc cuốn ebook tiếng Việt dưới đây trước khi vươn tới chân trời cao hơn nhé ^^
View user profile http://my.opera.com/anhlavip12a4/blog/

Thích

Báo xấu [0]

Gửi một bình luận lên tường nhà MinhTuan
Trả lời nhanh

Back to topMessage [Page 1 of 1]

  © FMvi.vn

« Xem bài trước | Xem bài kế tiếp »

Bài viết liên quan

    Quyền hạn của bạn:

    You cannot reply to topics in this forum