程式設計師之網路安全系列(四):資料加密之非對稱祕鑰
系列目錄:
前文回顧
假如,明明和麗麗相互不認識,明明想給麗麗寫一封情書,讓隔壁老王送去
- 如何保證隔壁老王不能看到情書內容?(保密性)
- 如何保證隔壁老王不修改情書的內容?(完整性)
- 如何保證隔壁老王不冒充明明?(身份認證)
- 如何保證明明不能否認情書是自己寫的?(來源的不可否認)
但是上面的問題是明明和麗麗必須提前知道祕鑰,但是如果雙方提前不知道祕鑰,那麼明明就需要“隔壁的王叔叔" 把祕鑰告訴麗麗,這個顯然是風險太大了,因為”隔壁王叔叔“有了祕鑰和密文,那麼就等於有了明文。
非對稱祕鑰
DH(Diffie-Hellman)演算法
1976年,美國學者Dime和Henman為解決資訊公開傳送和金鑰管理問題,提出一種新的金鑰交換協議,允許在不安全的媒體上的通訊雙方交換資訊,安全地達成一致的金鑰,這就是“公開金鑰系統”。相對於“對稱加密演算法”這種方法也叫做“非對稱加密演算法”。
與對稱加密演算法不同,非對稱加密演算法需要兩個金鑰:公開金鑰(publickey)和私有金鑰(privatekey)。公開金鑰與私有金鑰是一對,如果用公開金鑰對資料進行加密,只有用對應的私有金鑰才能解密;如果用私有金鑰對資料進行加密,那麼只有用對應的公開金鑰才能解密。因為加密和解密使用的是兩個不同的金鑰,所以這種演算法叫作非對稱加密演算法。
演算法原理及示例
- 假如明明和麗麗希望交換一個金鑰。
- 明明取一個素數p =97和97的一個原根a=5,讓隔壁的王叔叔告訴麗麗。
明明和麗麗分別選擇祕密金鑰XA=36和XB=58,並計算各自的公開金鑰,然後讓隔壁的王叔叔幫忙交換公開祕鑰。
YA=a^XA mod p=5^36 mod 97=50 YB=a^XB mod p=5^58 mod 97=44
明明和麗麗交換了公開金鑰之後,計算共享金鑰如下:
明明:K=(YB) ^XA mod p=44^36 mod 97=75 麗麗:K=(YA) ^XB mod p=50^58 mod 97=75
由於只有明明知道XA, 而只有麗麗知道XB, 那麼“隔壁的王叔叔” 是不可能通過 P, A, YA, YB來得到最終密碼K的。
DiffieˉHellman不是加密演算法,它只是生成可用作對稱金鑰的祕密數值。
非對稱加密特點
與對稱加密演算法不同,非對稱加密演算法需要兩個金鑰:公開金鑰(publickey)和私有金鑰(privatekey)。公開金鑰與私有金鑰是一對,如果 用公開金鑰對資料進行加密,只有用對應的私有金鑰才能解密;如果用私有金鑰對資料進行加密,那麼只有用對應的公開金鑰才能解密。因為加密和解密使用的是兩個不同的金鑰,所以這種演算法叫作非對稱加密演算法。
那麼如果甲(收信方)想收到只有自己才能解讀的加密資訊,那麼需要把自己的公鑰告訴乙(傳送發), 乙通過甲的公鑰加密,把加密後的密文告訴甲,由於只有甲有私鑰,那麼也就只有甲才能加密。
由此可見,非對稱加密只需要儲存一對公鑰和私鑰,大大方便了祕鑰管理。但是由於要做更多的計算,非對稱加密只適合一些小資料量加密,一般情況都是用非對稱加密演算法來交換祕鑰,隨後通過對稱加密演算法來加密資料。
常用非對稱加密演算法
RSA、Elgamal、揹包演算法、Rabin、D-H、ECC(橢圓曲線加密演算法)。
使用最廣泛的是RSA演算法,Elgamal是另一種常用的非對稱加密演算法。
最後
我們對資料的完整性使用Hash進行了保證,用DH演算法交換了祕鑰,使用RSA演算法對數進行了加密,那麼如果王叔叔在交換祕鑰的過程中做了手腳呢?
如何做手腳?看下圖:
- 王叔叔自己生成一個公私鑰,和明明以及麗麗交換。
- 王叔叔冒充麗麗把自己的公鑰發給明明。
- 明明用王叔叔的公鑰對信件加密。
- 王叔叔用自己的私鑰解密就可以看到明明給麗麗的郵件。
- 王叔叔冒充明明把自己的公鑰發給麗麗。
- 麗麗用王叔叔的公鑰對信件加密。
- 王叔叔用自己的私鑰解密就可以看到麗麗給明明內容。
至此,郵件內容又赤裸裸地被王叔叔看到了,怎麼辦呢?我們下文繼續解釋。
相關推薦
程式設計師之網路安全系列(四):資料加密之非對稱祕鑰
系列目錄: 前文回顧 假如,明明和麗麗相互不認識,明明想給麗麗寫一封情書,讓隔壁老王送去 如何保證隔壁老王不能看到情書內容?(保密性) 如何保證隔壁老王不修改情書的內容?(完整性) 如何保證隔壁老王不冒充明明?(身份認證) 如何保證明明不能否認情書是自己寫的?(來源的不可否認) 但是上面的問題是明
程式設計師之網路安全系列(三):資料加密之對稱加密演算法
系列目錄: 前文回顧 假如,明明和麗麗相互不認識,明明想給麗麗寫一封情書,讓隔壁老王送去 如何保證隔壁老王不能看到情書內容?(保密性) 如何保證隔壁老王不修改情書的內容?(完整性) 如何保證隔壁老王不冒充明明?(身份認證) 如何保證明明不能否認情書是自己寫的?(來源的不可否認) 上一節,我們使用了Ha
程式設計師之網路安全系列(一):為什麼要關注網路安全?
系列目錄: 假如,明明和麗麗相互不認識,明明想給麗麗寫一封情書,讓隔壁老王送去 如何保證隔壁老王不能看到情書內容?(保密性) 如何保證隔壁老王不修改情書的內容?(完整性) 如何保證隔壁老王不冒充明明?(身份認證) 如何保證明明不能否認情書是自己寫的?(來源的不可否認) 前言 大家都知道最近幾年鬧的沸
程式設計師之網路安全系列(六):動態密碼
系列目錄 前文回顧 程式設計師之網路安全系列(五):數字證書以及12306的證書問題 我們使用了數字證書,確保了對方的公鑰身份,也就是網際網路中確定了要訪問的網站就是你要訪問的網站。 但是我們如何確定要訪問這個網站的使用者就是要訪問的使用者呢? 對銀行來說需要確保“敏捷的水”登入銀行時,必須是"敏捷
程式設計師之網路安全系列(五):數字證書以及12306的證書問題
系列目錄: 前文回顧 假如,明明和麗麗相互不認識,明明想給麗麗寫一封情書,讓隔壁老王送去 如何保證隔壁老王不能看到情書內容?(保密性) 如何保證隔壁老王不修改情書的內容?(完整性) 如何保證隔壁老王不冒充明明?(身份認證) 如何保證明明不能否認情書是自己寫的?(來源的不可否認) 中間人攻擊 上面
程式設計師之網路安全系列(二):如何安全儲存使用者密碼及雜湊演算法
系列目錄: 前言 在很多網站的早期,甚至是現在仍然有一些網站,當你點選忘記密碼功能時,你的郵箱會收到一封郵件,然後裡面赫然寫著你的密碼,很多普通使用者還會覺得慶幸,總算是找回來了,殊不知,這是多麼可怕地一件事,說明了網站是“幾乎是”明文儲存你的密碼,一旦資料使用者資料洩露或者被拖庫,那麼使用者密碼將赤裸裸
Web安全系列(四):XSS 的防禦
簡介 XSS 的防禦很複雜,並不是一套防禦機制就能就解決的問題,它需要具體業務具體實現。 目前來說,流行的瀏覽器內都內建了一些 XSS 過濾器,但是這隻能防禦一部分常見的 XSS,而對於網站來說,也應該一直尋求優秀的解決方案,保護網站及使用者的安全,我將闡述一下網站在設計上該如何避免 XSS 的攻擊。 H
docker系列(四):資料卷
1 引言 容器就相當於一個簡易的作業系統,我們在上面部署我們的環境,不可避免地產生一些資料,但是,可能由於斷電等等原因,容器退出了,那麼之前容器中的資料就不符存在,則往往不是我們想要的,更多的,我們是希望資料能夠持久儲存到硬碟中,這就需要用到資料卷。 資料卷是指一種目錄或者說檔案,其存在於一個或者多個容器
物聯網平臺構架系列 (四):Amazon, Microsoft, IBM IoT 平臺導論 之 平臺
物聯網; iot; aws; 亞馬遜; greengrass;microsoft; azure;ibm; watson; bluemix最近研究了一些物聯網平臺技術資料,以做選型參考。腦子裏積累大量信息,便想寫出來做一些普及。作為科普文章,力爭通俗易懂,不確保概念嚴謹性。我會給考據癖者提供相關英文鏈接,以便深
Python爬蟲系列(四):Beautiful Soup解析HTML之把HTML轉成Python對象
調用 nor 結束 版本 現在 name屬性 data 官方文檔 get 在前幾篇文章,我們學會了如何獲取html文檔內容,就是從url下載網頁。今天開始,我們將討論如何將html轉成python對象,用python代碼對文檔進行分析。 (牛小妹在學校折騰了好幾天,也沒把h
java程式設計師菜鳥進階(七) HTTP權威指南 之HTTP連線管理及對TCP效能的考慮
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
Docker系列(四):容器之間的網路通訊
首先我們需要知道:兩個容器要能通訊,必須要有屬於同一個網路的網絡卡。 先來正常情況下我們的容器預設是否是能通訊的,這裡執行兩個測試容器: docker run -it --name=bbox1 busybox docker run -it --name=bbox2 busybox 然後我們進入bb
從0到1使用Kubernetes系列(四):搭建第一個應用程式
上一篇文章《從0到1使用Kubernetes系列(三):使用Ansible安裝Kubernetes叢集》中,我們搭建了一套Kubernetes叢集,接下來將在本文中介紹如何使用Kubernetes部署一個Nginx並通過Pod IP、Service IP、Ingress這三種方式訪問Nginx。 傳統Kube
神經網路(四):應用示例之分類
一、 傳統分類模型的侷限 在之前的文章中(《神經網路(一)》、《神經網路(二)》和《神經網路(三)》),我們討論的重點是神經網路的理論知識。現在來看一個實際的例子,如何利用神經網路解決分類問題。(為了更好地展示神經網路的特點,我們在這個示例中並不劃分訓練集和測
程式設計師必會技能系列(2)git中merge和rebase比較-3
git中有兩個合併分支的方法,一個是git merge,另一個是git rebase。 一、git merge 講解 1、畫圖講解git merge 用merge合併分支時不會改變歷史(通俗的說就是commit號不會變)。在git中merge會創造一個
linux網路程式設計之posix 執行緒(四):posix 條件變數與互斥鎖 示例生產者--消費者問題
#include <unistd.h>#include <sys/types.h>#include <pthread.h>#include <semaphore.h>#include <stdlib.h>#include <stdio.h>
前端程式設計師學好算法系列(一)陣列
前端程式設計師怎麼才能學好演算法呢?目前演算法優秀的視訊集中在c++,java,python,本人通過幾個月專心看c++的視訊掌握了演算法的基本思路,都翻譯成前端程式碼一一寫出來,從真題到思維全面提升演算法思維面對演算法面試,不畏懼 二分查詢法O(logn)尋找陣列中的最大/最小值O(N)歸併排序演算法 O(
搜索引擎ElasticSearch系列(四): ElasticSearch2.4.4 sql插件安裝
china code als 插件 技術分享 -s fun nlp 4.0 一:ElasticSearch sql插件簡介 With this plugin you can query elasticsearch using familiar SQL syntax.
JavaScript難點系列(四):作用域
文章 this 的確 空間 console 知識點 人的 歧義 查找 深入了解js這門語言後,才發現它有著諸多眾所周知的難點(例如:閉包、原型鏈、內存空間等)。有的是因為js的設計缺陷導致的,而有的則是js的優點。不管如何,總需要去學會它們,在學習過程中我覺得只看別人的文章
Django系列(四):多表操作
例如 get city 定義 庫類 修改配置 銷售部 blog 返回 1、創建模型 例:我們來假定下面這些概念,字段和關系 作者模型:一個作者有姓名和年齡。 作者詳細模型:把作者的詳情放到詳情表,包含生日,手機號,家庭住址等信息。作者詳情模型和作者模型之間是一對一(