1. 程式人生 > >.Net之美讀書筆記9

.Net之美讀書筆記9

調用 fault message display creat 相同 數字簽名 64bit empty

加密與解密

在消息傳輸的情境下,加密與解密是為了保證消息的安全。

保證消息安全的三要性

  • 完整性 消息的接收方可以確保消息在傳輸過程中沒被篡改過
  • 保密性 消息的發送方能夠確定消息只有預期的接收方可理解(第三方截獲的消息加密,不能理解)
  • 可認證性 消息的接受方可以確定消息是誰發來的

    散列算法保證消息的完整性

    散列算法可以對任何數據進行散列運算的到摘要。散列算法的特點:運算的不可逆性 源極小修改摘要不同 摘要為64bit或128bit
    消息進行散列運算產生摘要,發送發將消息和摘要發送給接受方,接收方收到後以相同的散列算法得到消息摘要,再將兩份摘要比對。發送方和接收方對消息加鹽,得到摘要,放在第三方修改消息同事修改摘要。

    public class Sender
    {
        private string message = "Hello World!";
        private string salt = "[good]";
    
        private byte[] GetHasHData(string message)
        {
            HashAlgorithm alg = HashAlgorithm.Create("SHA1");
            byte[] plainData = Encoding.Default.GetBytes(this.salt + message);
            byte[] hashData = alg.ComputeHash(plainData);
            return hashData;
        }
    
        public Tuple<byte[], string> SendMessage()
        {
            byte[] hashData = this.GetHasHData(message);
            return Tuple.Create(hashData, message);
        }
    }
     public class Receiver
    {
        private string message = string.Empty;
        private string salt = "[good]";
    
        public bool ReceiveData(Tuple<byte[], string> data)
        {
            byte[] sourceHashData = data.Item1;
            string msg = data.Item2;
    
            HashAlgorithm alg = HashAlgorithm.Create("SHA1");
            byte[] plainData = Encoding.Default.GetBytes(this.salt + msg);
            byte[] hashData = alg.ComputeHash(plainData);
    
            if(sourceHashData.SequenceEqual(hashData))
            {
                this.message = msg;
                return true;
            }
            else
            {
                return false;
            }
        }
    
        public void DisplayMsg()
        {
            Console.WriteLine(this.message);
        }
    }
    //調用
     Sender sender = new Sender();
            Receiver receiver = new Receiver();
            if (receiver.ReceiveData(sender.SendMessage()))
            {
                receiver.DisplayMsg();
            }

    這裏散列算法都繼承自HashAlgorithm,創建方法為HashAlgorithm.Create("SHA1"),通過傳入不同的參數得到不同的算法(MD5,SHA,SHA1等)。

    對稱加密保證消息的保密性

    將消息通過密鑰加密得到消息的密文,發送方將密文發送,接收方用同一個密鑰對密文進行解密的到原文。

    非對稱加密

    非對稱加密有兩個密鑰,一個公鑰,一個私鑰。消息經公鑰加密得到密文,密文只能經對應的私鑰解密為明文。
    實現可認證性:甲方(發送方)有甲私鑰(自己的私鑰)與乙公鑰,乙方有甲方公鑰與乙私鑰(自己的)。
  1. 加密性
    甲方用乙方公鑰加密為密文,將密文發送給乙方。密文需要乙方私鑰解密,第三方無法理解秘聞。
  2. 認證性
    甲方用甲私鑰加密為密文,發送給乙方。乙方接到消息後用甲公鑰解密,能成功解密認證消息是甲方所發。

    數字簽名

    數字簽名保證消息的完整性和認證性,用散列得到消息摘要,再對摘要進行非對稱加密(為解決對稱加密和非對稱加密耗時問題)。

.Net之美讀書筆記9