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

20:11 24-07-2017 1.184 lượt xem 7 bình luận 11:56 31-07-2017

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!

public void Serialize(Connect cnn)
        {
            XmlSerializer seri = new XmlSerializer(typeof(Connect));

            using (StreamWriter sw = new StreamWriter(new FileStream("Connect.cn", FileMode.Create)))
            {
                seri.Serialize(sw, cnn);

                sw.Close();
            }
        }

public Connect Deserialize(string FileConnName)
        {
            Connect conn = new Connect();

            XmlSerializer seri = new XmlSerializer(typeof(Connect));

            StreamReader sr = new StreamReader(new FileStream(FileConnName, FileMode.Open));

            object obj = seri.Deserialize(sr);

            conn = (Connect)obj;

            sr.Close();

            return conn;
        }

private void btnConnect_Click(object sender, EventArgs e)
        {
            Connect cnn = new Connect();

            cnn.ServerName = txbServer.Text;
            cnn.Database = txbDatabase.Text;
            cnn.UserName = txbUser.Text;
            cnn.PassWord = txbPassword.Text;
            
            if (ConnectBUS.Instance.CheckConnect(cnn.ToString()))
            {
                MessageBox.Show("Kết nối thành công đến CSDL!");
                
                //Thực hiện mã hóa ngày chổ này, trước khi Serialize
                ConnectBUS.Instance.Serialize(cnn);
            }
        }

public string Encrypt(string sEncrypt, string sPassEncrypt)
        {
            byte[] keyArray;
            byte[] sEncryptArray = UTF32Encoding.UTF32.GetBytes(sEncrypt);

            MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();
            keyArray = hashMD5.ComputeHash(UTF32Encoding.UTF32.GetBytes(sPassEncrypt));

            TripleDESCryptoServiceProvider tDES = new TripleDESCryptoServiceProvider();
            tDES.Key = keyArray;
            tDES.Mode = CipherMode.ECB;
            tDES.Padding = PaddingMode.PKCS7;

            ICryptoTransform cTransForm = tDES.CreateEncryptor();
            byte[] resultArray = cTransForm.TransformFinalBlock(sEncryptArray, 0, sEncryptArray.Length);

            return Convert.ToBase64String(resultArray, 0, resultArray.Length);
        }

 

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 11:43 31-07-2017

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 20:22 24-07-2017

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

không bao giờ bó tay đã bình luận 22:59 26-07-2017

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);

 

Câu hỏi mới nhất