我們有這樣的乙個場景,有傳送方,接收方,第三方。傳送方想要傳送訊息給接收方,第三方想要截取消並篡改訊息,然後再**給接收方。
怎樣才能襯得上是安全的交流方式呢?一般來說需要滿足下面的三個條件:
完整性(訊息不被篡改),保密性(第三方無法解密),可認證性(接收方知道訊息是由誰傳送的)。
首先,我們來講下md5加密,嚴格來說,md5並不能稱為加密,它只是一種雜湊運算,對訊息進行雜湊運算,可以獲得訊息的摘要(digest,指紋)。
md5演算法有三個特點,
1. 雜湊演算法是不可逆的,可以將雜湊運算理解為單向的加密:根據原訊息運算得到摘要,根據摘要,無法推導出原訊息。比如只要有乙個完整的人,就可以獲取它的指紋;但是如果只有指紋,是無法獲取這個人的全部資訊的。
2.任何不同的檔案,哪怕只有乙個位元組的細微差別,得到的摘要都是完全不同的。
3.無論原始訊息的大小如何,運算得到的摘要資訊是固定長度的。
下面是判斷訊息是否被篡改的流程。
傳送方對訊息進行雜湊運算,得到訊息摘要,傳送訊息摘要和訊息,並說明摘要所使用的雜湊演算法,如md5。
接收方獲得訊息和摘要,使用相同的雜湊演算法對收到的訊息進行雜湊運算,獲得新的摘要
接收方判斷傳送方的摘要和自己生成的摘要是否相同,相同則認為訊息沒有被篡改,否則就被篡改了。
但是這個不能保證第三方擷取訊息,篡改訊息,重新生成摘要,再**。
對稱加密
對稱加密表示加密解密使用相同的金鑰,對稱加密演算法des(資料加密標準),aes(高階加密標準)等。
對稱加密需要雙方都持有金鑰,並保證金鑰不被洩露。但是傳送至和接受者總要有一次初始的通訊,用來傳遞金鑰,此時如何保證安全。
非對稱加密
非對稱加密有一組金鑰對,乙個是對外公開的,任何人都可以獲取,稱為公鑰。乙個是自行保管並嚴格保密的,稱為私鑰。訊息由公鑰加密則只能由私鑰解密,由私鑰加密只能由公鑰解密。通過rsa演算法加密解密。
這種加密方式,第三方沒有私鑰,是無法解密的。但是公鑰是任何人都可以獲得,任何人都可以用公鈅來加密並傳送給接收者,因此它無法滿足條件可認證性。
認證模式
在認證模式中,有訊息的傳送方發布公鑰,持有私鑰,步驟如下
1.傳送方公布自己的公鑰,任何人都可以獲得
2.傳送發使用自己的私鑰對訊息進行加密,然後傳送
3.接收方使用傳送方的公鑰對訊息進行解密。
在這種模式下,假如傳送方a,接收方b,因為b持有a的公鑰,所以b能夠解密並且知道訊息是由a傳送過來的。這樣就滿足了可認證性的條件
但是因為a的公鑰是公開的,所以第三方擷取了訊息都能通過公鑰解密,訊息相當於是公開的。不滿足保密性
非對稱加密運算過程相對耗時,不適合大資料。因此,對它的認證模式進行了改進,形成一種新的加密方式,叫做數字簽名。
數字簽名
數字簽名和認證模式很相似,只不過加入了雜湊演算法。步驟如下
1.傳送方對訊息進行雜湊運算,得到原始訊息摘要。
2.傳送方使用自己的私鑰對訊息摘要進行加密,該過程也叫作簽名。
3.接收方使用傳送方的公鑰對收到的訊息進行解密,得到摘要。
4.接收方對訊息進行雜湊運算,得到本地摘要。
5.判斷傳送方的摘要和本地摘要是否相等,以判斷訊息是否被篡改。
數字簽名同時滿足了完整性和可認證性。但是沒有對訊息本身進行加密,第三方如果截獲訊息,就能看到訊息的內容。如果傳遞的是保密性不高的非敏感資料,那麼數字簽名將是非常好的選擇。
綜合實現
傳送方步驟
1.將訊息進行雜湊運算,得到訊息摘要。
2.使用傳送方的私鑰對訊息摘要加密(認證模式,確保了接收方能夠確認自己)
3.使用接收方的公鑰對訊息進行加密(加密模式,確保了訊息只能由期望的接收方解密)
4.傳送訊息和訊息摘要
接收方步驟
1.使用傳送方的公鑰對訊息摘要進行解密(認證模式:確認訊息是由誰傳送的),獲取原始訊息摘要
2.使用自己的私鑰對訊息進行解密(加密模式:安全地獲得訊息內容)
3.將訊息進行雜湊運算,獲取本地訊息摘要。
4.將原始訊息摘要和本地訊息摘要進行對比,確認訊息是否被篡改。
可以看到,通過上面的方式,綜合使用了接收方,傳送方全部的四個金鑰,再配合使用雜湊演算法,是的前面提出的三個安全條件都滿足了。但是非對稱加密演算法是一種相對耗時的操作,這個方案對於大資料來說是低效的。但是實際上,可以通過它來解決對稱加密中的金鑰傳遞問題,也就是說,金鑰傳遞使用這種綜合的方式來加密,之後採用對稱加密,因為現在這樣已經安全了。
證書機制
與數字簽名相關的乙個概念就是證書機制,證書用來做什麼呢?在上面的各種模式中,一直存在這樣的乙個假設:就是接收方或傳送方所持有的,對方的公鑰總是正確的。可實際上除非對方當面交接公鑰,否則在傳遞公鑰的時候,一樣有可能被篡改。那怎麼解決這個問題呢?這是就需要證書機制了:可以引入乙個公正的第三方機構,當某一方想要發布公鑰時,它將自身的身份資訊及公鑰提交給第三方,第三方對其身份進行證實,如果沒有問題,則將其資訊和公鑰打包成證書。當需要獲取公鑰時,只需要獲取其證書,就可以從中提取出公鑰了。
加密解密實驗
定義加密文字 str1 你好啊 str2 我很好 str3 吃了嗎 str4 馬上吃 利用函式置換密碼 table1 str.maketrans str1,str2 table2 str.maketrans str2,str3 table3 str.maketrans str3,str4 table...
RC4加密解密實現
首先引用下別人的圖吧很清晰的流程圖,加密解密都是同乙個金鑰流實現的。1 第一步是生成s盒 初始化s和t 開始時,s中元素的值被置為按公升序從0到255,即s 0 0,s 1 1,s 255 255。同時建立乙個臨時向量t 長度與s相同 如果金鑰k的長度為256位元組,則將k賦給t k的長度為可能小於...
基於口令的加密解密實現
加密 建立sha1雜湊物件 messagedigest md messagedigest.getinstance sha1 雜湊金鑰 md.update password.getbytes 獲得des金鑰 deskeyspec dks new deskeyspec md.digest 獲得des加密...