.Net之美讀書筆記9
阿新 • • 發佈:2017-12-17
調用 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等)。對稱加密保證消息的保密性
將消息通過密鑰加密得到消息的密文,發送方將密文發送,接收方用同一個密鑰對密文進行解密的到原文。
非對稱加密
非對稱加密有兩個密鑰,一個公鑰,一個私鑰。消息經公鑰加密得到密文,密文只能經對應的私鑰解密為明文。
實現可認證性:甲方(發送方)有甲私鑰(自己的私鑰)與乙公鑰,乙方有甲方公鑰與乙私鑰(自己的)。
- 加密性
甲方用乙方公鑰加密為密文,將密文發送給乙方。密文需要乙方私鑰解密,第三方無法理解秘聞。 認證性
甲方用甲私鑰加密為密文,發送給乙方。乙方接到消息後用甲公鑰解密,能成功解密認證消息是甲方所發。數字簽名
數字簽名保證消息的完整性和認證性,用散列得到消息摘要,再對摘要進行非對稱加密(為解決對稱加密和非對稱加密耗時問題)。
.Net之美讀書筆記9