Hỏi đáp

Chia sẻ kiến thức, cùng nhau phát triển

[Hỏi - C#] Việc mã hóa dữ liệu sau khi serializer/deserializer

8 năm trước 1.225 lượt xem 7 bình luận 8 năm trước

Qua ngâm cứu hướng dẫn từ HowKteam.com, mình đã serializer file (chứa thông tin kết nối đến CSDL), giờ muốn mã hóa (đã có hàm mã hóa) thì mò mãi mà chả ra, mong mọi người giúp với ạ! tks trước!

 

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập
Huy Tran đã bình luận 8 năm trước

Cái này bạn dùng vậy nè. 

using System;
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;
using System.Xml;

class DataEncryptor
    {
        // Class encrypt and decrypt file xml
        private EncryptedXml mainEncryptor; // Instance of encrypted XML
        private TripleDESCryptoServiceProvider tripleDes; //instance of TripleDES algorithm
        private const string keyName = "Cai nay ban dat pass tuy y nhung phai theo dinh dang cua thuat toan Triple Des, ban search Google MSDN TripleDES de xem";

        private DataEncryptor()
        {
            //Setting
            tripleDes = new TripleDESCryptoServiceProvider();
            tripleDes.Key = Convert.FromBase64String(keyName);
            //mode of operation. there are other 4 modes. We choose ECB(Electronic code Book)
            tripleDes.Mode = CipherMode.ECB;
            //padding mode(if any extra byte added)
            tripleDes.Padding = PaddingMode.PKCS7;
            mainEncryptor = new EncryptedXml();
        }

        private static DataEncryptor instance;
        public static DataEncryptor Instance {
            get{
                if (instance == null)
                {
                    instance = new DataEncryptor();
                }
                return instance;
            }
        }

        public void DataEncrypt(XmlDocument xmldoc, string filename)
        {
            try
            {
                byte[] encrypted = mainEncryptor.EncryptData(xmldoc.DocumentElement, tripleDes, false);
                EncryptedData encdata = new EncryptedData();

                // Create a CipherData element.
                encdata.CipherData = new CipherData();

                // Set the CipherData element to the value of the encrypted XML element.
                encdata.CipherData.CipherValue = encrypted;
                // Specify the namespace URI for XML encryption elements.
                encdata.Type = EncryptedXml.XmlEncElementUrl;

                // Specify the namespace URI for the TrippleDES algorithm.
                encdata.EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncTripleDESUrl);

                // Replace the plaintext XML elemnt with an EncryptedData element.
                EncryptedXml.ReplaceElement(xmldoc.DocumentElement, encdata, false);
                xmldoc.Save(filename);
            }catch(Exception ex)
            {}
        }

        public bool DataDecrypt(XmlDocument xmldoc)
        {
            try
            {
                EncryptedData encdata = new EncryptedData();
                encdata.LoadXml(xmldoc.DocumentElement);
                byte[] decrypted = mainEncryptor.DecryptData(encdata, tripleDes);
                mainEncryptor.ReplaceData(xmldoc.DocumentElement, decrypted);
                return true;
            }
            catch(Exception ex)
            {
                return false;
            }
        }
    }

Đại khái bạn phải có một biến lớp là EncryptedXML để giữ cái file XML cần mã hóa cho bạn với một biến lớp TripleDESCryptoServiceProvider để lấy ra với nắm cái thuật toán mã hóa và cái key mã hóa. Quá trình Encrypt thì khá rắc rối, bạn cứ setting như trên chớ không biết giải thích ra sao, đại khái là sau khi nó mã hóa file XML của bạn nó sẽ bọc trong 1 cái định dạng XML nữa và mình phải theo chuẩn như vậy để sau này nó hiểu mà Decrypt. Còn Decrypt cứ lấy nguyên cái key đó là được.

Bạn setting Key, Mode và Padding cho nó, Key bạn tự đặt theo tiêu chuẩn của TripleDES còn Mode và Padding chuẩn thì như trên. Và thêm nữa bạn đọc file XML lên bằng lớp XmlDocument thì nó mới mã hóa, sử dụng cái khác nó không hiểu đâu. Nhớ thêm Reference System.Security

Có nhiều thuật toán mã hóa nữa, hình như có mã hóa 2 key nữa mà mình nghĩ chừng này đủ rồi. Chi tiết bạn lên đây đọc https://msdn.microsoft.com/en-us/library/system.security.cryptography.xml.encryptedxml(v=vs.110).aspx

K9 SuperAdmin, KquizAdmin, KquizAuthor đã bình luận 8 năm trước

đâu thấy bạn mã hóa đâu

không bao giờ bó tay đã bình luận 8 năm trước

Qua ngâm cứu từ google thấy thèn này cũng khá hay (nhưng khổ nổi trình độ có giới hạn nên chưa thể hiểu hết những thâm thúy code), Mong HowKteam giải thích giúp + tôi muốn đặt pass để mã hóa thì làm như thế nào! tks nhiều.

//Encryption
public static void EncryptAndSerialize(string filename, MyObject obj, SymmetricAlgorithm key)
{
    using(FileStream fs = File.Open(filename, FileMode.Create))
    {
        using(CryptoStream cs = new CryptoStream(fs, key.CreateEncryptor(), CryptoStreamMode.Write))
        {
            XmlSerializer xmlser = new XmlSerializer(typeof(MyObject));
            xmlser.Serialize(cs, obj); 
        }
    }
}

//Decryption
public static MyObject DecryptAndDeserialize(string filename, SymmetricAlgorithm key)    
{
    using(FileStream fs = File.Open(filename, FileMode.Open))
    {
        using(CryptoStream cs = new CryptoStream(fs, key.CreateDecryptor(), CryptoStreamMode.Read))
        {
            XmlSerializer xmlser = new XmlSerializer(typeof(MyObject));
            return (MyObject) xmlser.Deserialize(cs);
        }
    }
}

//Sử dụng
DESCryptoServiceProvider key = new DESCryptoServiceProvider();
MyObject obj = new MyObject();
EncryptAndSerialize("testfile.xml", obj, key);
MyObject deobj = DecryptAndDeserialize("testfile.xml", key);

 

Bài viết
0
Câu hỏi
11
Bình luận
22