Thứ Tư, ngày 29 tháng 6 năm 2011

// // Leave a Comment

Mã hóa XOR - Phép mã hóa đơn giản - C#

Mã hóa Exclusive-OR là phép mã hóa đối xứng sử dụng hàm đại số boolean XOR. Do tính đối xứng cả hai encryptor và decryptor phải biết được khóa mã, trong khi thuật toán xử dụng thật đơn giản, gần như là không thể phá vỡ.

Các vấn đề thực ta phải quan tâm: Dễ bị khớp mẫu, nhưng điểm yếu này có thể tránh được thông qua việc nén trước thông tin (để có thể loại bỏ các mẫu).  Một số điều lưu ý:
1. XOR áp dụng cho 1 chuỗi văn bản không là thuật toán mã hóa mạnh.
2. Mã hóa thông tin trong ứng dụng XML dễ bị đụng độ với các ký tự chuẩn trong XML
3. Nếu cần mã hóa mạnh, KHÔNG sử dụng thuật toán XOR đơn thuần. Cần có các hệ mật mã an toàn đang được sử dụng (DES, TDES, AES, RC4, RC6, IDEA .. RSA, Elgamal, hệ mật sắp ba lô, hệ mã tuyến tính [n, k, d], ...) hoặc cần được sử dụng phức hợp.



Mã hóa XOR hoạt động bằng cách sử dụng hàm đại số boolean exclusive-OR (XOR). XOR là 1 toán tử nhị phân (tức là toán tử hai ngôi có 2 tham số - giống như phép cộng). Theo tên của nó, exclusive - OR, nó dễ dàng để suy ra (đúng, hoặc sai). Bảng chân lý cho toán tử XOR.

A   B    A XOR B
T   T       F
T   F       T  
F   T       T 
F   F       F

Tham khảo:
http://www.cprogramming.com/tutorial/xor.html
http://www.eggheadcafe.com/tutorials/aspnet/8b53894c-a889-4914-8c46-122980cc44ae/simple-xor-encryption.aspx

Trước khi xem đoạn code dưới đây ta có một kết luận về phép toán XOR như sau: Giả sử ta cần mã hóa bản rõ P bằng khóa K. Ta thu được bản mã C = P xor KP = C xor K.
Ví dụ sử dụng XOR để mã hóa một chuỗi bất kỳ:


    public void Encrypt(byte[] ip_secret_buffer, byte[] ip_key_buffer)
    {
        for (int i = 0, j =0; i < ip_secret_buffer.Length; i++)
        {
            ip_secret_buffer[i] ^= ip_secret_buffer[j];
            j = (++j < m_app_initial_data.Length) ? j : 0;
        }
    }

    public void Decrypt(byte[] ip_secret_buffer, byte[] ip_key_buffer)
    {
        Encrypt(ip_secret_buffer, ip_key_buffer);
    }

    public string Encrypt(string ip_str_plaintext, string ip_str_key)
    {
        var v_secret_buffer = Encoding.UTF8.GetBytes(ip_str_plaintext);
        var v_key_buffer = Encoding.UTF8.GetBytes(ip_str_key);
        Encrypt(v_secret_buffer, v_key_buffer);
        return Encoding.UTF8.GetString(v_secret_buffer);
    }

Vậy là ta đã có một hàm mã hóa đơn giản không quá phức tạp.

0 comments: