最近在研讀《圖解密碼技術》這本書,將有一系列的密碼學學習筆記,涉及到密碼的相關概念、對稱加密、非對稱加密、單向散列函數、消息認證碼、數字簽名、數字證書等內容,同時涉及到代碼部分也會使用Golang進行展現,感興趣的能夠關注更新哦。好了,今天先講講密碼學中的一些概念性的問題。程序員
請想象一個Alice向Bob發送電子郵件的場景。在這個場景中,發出郵件的Alice稱爲 發送者(sender),而收到郵件的Bob則稱爲 接收者(receiver)。算法
當某我的向另外一我的發送信息時,發出信息的人稱爲發送者,而收到信息的人稱爲接收者。另外,被髮送的信息有時也統稱爲 消息(message)。安全
郵件是經過互聯網從Alice的計算機發送到Bob的計算機的。在發送郵件時,郵件會通過許多臺計算機和通訊設備進行中轉,在這個過程當中,就存在被惡意竊聽者(eavesdropper)偷看到的可能性服務器
竊聽者Eve並不必定是人類,有多是安裝在通訊設備上的某種竊~聽~器,也多是安裝在郵件軟件和郵件服務器上的某些程序。ide
儘管郵件內容本來應該只有發送者和接收者兩我的知道,但若是不採起相應的對策,就存在被第三方知道的風險。函數
那麼如何防止竊聽者的竊聽呢?Alice不想讓別人看到郵件的內容,因而她決定將郵件進行**加密(encrypt)**後再發送出去。學習
加密以前的消息稱爲明文(plaintext),加密以後的消息稱爲密文(cipher-text)。加密
Bob收到了來自Alice的加密郵件,但做爲接收者的Bob也是沒法直接閱讀密文的,因而 Bob須要對密文進行解密(decrypt)以後再閱讀。解密就是將密文恢復成明文的過程。spa
將消息加密後發送的話,即便消息被竊聽,竊聽者獲得的也只是密文,而沒法得知加密前的明文內容3d
將消息加密後發送, 竊聽者只能獲得密文
在上述場景中,Alice將郵件進行加密,而Bob則進行解密,這樣作的目的,是爲了避免讓竊聽者Eve讀取郵件的內容Alice和Bob經過運用密碼(cryptography)技術,保證了郵件的機密性(confidentiality)。
用於解決複雜問題的步驟,一般稱爲算法(algorithm)。從明文生成密文的步驟,也就是加密的步驟,稱爲「加密算法",而解密的步驟則稱爲「解密算法"。加密、解密的算法合在一塊兒統稱爲密碼算法。
密碼算法中須要密鑰(key)。現實世界中的「鑰'',是像 :key: 這樣的形狀微妙而複雜的小金屬片。然而,密碼算法中的密鑰,則是像203554728568477650354673080689430768這樣的一串很是大的數字。
加密、解密與祕鑰
不管是在加密時仍是在解密時,都須要知道密鑰。
正如保險櫃的鑰匙能夠保護保險櫃中存放的貴重物品同樣,密碼中的密鑰能夠保護你的重要數據。即便保險箱再堅固,若是鑰匙被盜, 裏面的貴重物品也會被盜。一樣地咱們也必須注意不要讓密碼的密鑰被他人竊取。
愷撒密碼(Caesar cipher)是一種相傳尤利烏斯·愷撒曾使用過的密碼。愷撒於公元前100年左右誕生於古羅馬,是一位著名的軍事統帥。
愷撤密碼是經過將明文中所使用的字母表按照必定的字數「平移」來進行加密的。好比在日語(例如平假名)或者漢語(例如漢語拼音)或者英文字母表中均可以用一樣的思路來實現愷撒密碼。
爲了講解方便,咱們用小寫字母(a,b,c,…)來表小明文,用大寫字母(A,B,C,...)來表示密文。
如今咱們將字母表平移3個字母,因而,明文中的a在加密後就變成了與其相隔3個字母的D,以此類推。b變成E,c變成F,d變成G......v變成Y,w變成Z,而x則會回到字母表的開頭而變成A,相應地,y變成B,z變成C。經過下圖咱們能夠很容易地理解「平移"的具體工做方式。
這裏,咱們假設要保密的信息爲monkey d luffy這個男孩的名字。咱們暫且無論這個名字到底表明一位真實的男性,仍是隻是一種暗號,只考慮將它在保密的狀態下發送給接收者。
此時,明文包含下列12個字母:monkeydluffy, 接下來咱們對明文中的字母逐一加密:
m ---> P
o ---> R
n ---> Q
k ---> N
e ---> H
y ---> B
d ---> G
l ---> O
u ---> X
f ---> I
f ---> I
y ---> B
複製代碼
這樣,明文 monkey d luffy 就被轉換成了密文PRQNHB G OXIIB,monkey d luffy這個詞咱們可以看懂,但
PRQNHB G OXIIB就看不懂了。
愷撒密碼中,將字母表中的字母平移這個操做就是密碼的算法,而平移的字母數量則至關於密鑰。在上面的例子中,密鑰爲3(以下圖)。
如今,假設接收者已經收到了密文PRQNHB G OXIIB,因爲密文自己是看不懂的,所以必須將它解密成明文。
愷撒密碼的解密過程是使用與加密時相同的密鑰進行反向的平移操做。用剛纔的例子來講,只要反向平移3個字母就能夠解密了。
P ---> m
R ---> o
Q ---> n
N ---> k
H ---> e
B ---> y
G ---> d
O ---> l
X ---> u
I ---> f
I ---> f
B ---> y
複製代碼
這樣咱們就獲得了明文monkeydluffy。
在這個場景中, 祕鑰3必須由發送者和接收者事先約定好。
在繼續下面的內容以前,咱們先來介紹一些關於密碼的常識。剛剛開始學習密碼的人經常會對如下這幾條感到難以想象,由於它們有悖於咱們的通常性常識。
不少企業都有下面這樣的想法:
「由公司本身開發一種密碼算法,並將這種算法保密,這樣就能保證安全。然而,這樣的想法倒是大錯特錯,使用保密的密碼算法是沒法得到高安全性的。咱們不該該製做或使用任何保密的密碼算法,而是應該使用那些已經公開的、被公認爲強度較高的密碼算法。
這樣作的緣由主要有如下兩點:
密碼算法的祕密遲早會公諸於世
從歷史上看,密碼算法的祕密最終無一例外地都會被暴露出來。例如: RSA公司開發的RC4密碼算法曾經也是保密的,但最終仍是有一位匿名人士開發並公開了與其等效的程序。
一旦密碼算法的詳細信息被暴露,依靠對密碼算法自己進行保密來確保機密性的密碼系統也就土崩瓦解了。反之,那些公開的算法從一開始就沒有設想過要保密,所以算法的暴露絲絕不會削弱它們的強度。
開發高強度的密碼算法是很是困難的
- 要比較密碼算法的強弱是極其困難的,由於密碼算法的強度並不像數學那樣能夠進行嚴密的證實。密碼算法的強度只能經過事實來證實,若是專業密碼破譯者通過數年的嘗試仍然沒有破解某個密碼算法,則說明這種算法的強度較高。
- 稍微聰明一點的程序員很容易就可以編寫出「本身的密碼系統"。這樣的密碼在外行看來貌似牢不可破,但在專業密碼破譯者的眼裏,要破解這樣的密碼幾乎是手到擒來。
- 如今世界上公開的被認爲強度較高的密碼算法,幾乎都是通過密碼破譯者長期嘗試破解未果而存活下來的。所以,若是認爲「公司本身開發的密碼系統比那些公開的密碼系統更強」,那隻能說是過於高估本身公司的能力了。
- 試圖經過對密碼算法自己進行保密來確保安全性的行爲,通常稱爲隱蔽式安全性(securitybyobscurity),這種行爲是危險且愚蠢的。
- 反過來講,將密碼算法的詳細信息以及程序源代碼所有交給專業密碼破譯者,而且爲其提供大量的明文和密文樣本,若是在這樣的狀況下破譯一段新的密文依然須要花上至關長的時間,就說明這是高強度的密碼。
通常人們會認爲.就算密碼的強度再低,也比徹底不加密要強吧?其實這樣的想法是很是危險的。
**正確的想法應該是:**與其使用低強度的密碼,還不如從一開始就不使用任何密碼這主要是因爲用戶容易經過「密碼」這個詞得到一種「錯誤的安全感」。對於用戶來講,安全感與密碼的強度無關,而只是由「信息已經被加密了」這一事實產生的,而這一般會致使用戶在處理一些機密信息的時候麻痹大意。
若是某種密碼產品宣稱「本產品使用了絕對不會被破解的密碼算法」,那麼你就要對這個產品的安全性打個問號了,這是由於絕對不會被破解的密碼是不存在的。
不管使用任何密碼算法所生成的密文,只要將全部可能的密鑰所有嘗試一遍,就總有一天能夠破譯出來。所以,破譯密文所須要花費的時間,與要保密的明文的價值之間的權衡就顯得很是重要。
咱們仍是回到Alice給Bob發送加密郵件的例子。即使不去破解密碼算法,也依然有不少方法可以知道Alice所發送的郵件內容, 例如:
攻擊者能夠不去試圖破譯通過加密的郵件,而是轉而攻擊Alice的電腦以獲取加密以前的郵件明文。
上面提到的攻擊手段,都與密碼的強度毫無關係。要保證良好的安全性,就須要理解「系統」這一律念自己的性質複雜的系統就像一根由無數個環節相連組成的鏈條,若是用力拉,鏈條就會從其中最脆弱的環節處斷開。所以,系統的強度取決於其中最脆弱的環節的強度。
最脆弱的環節並非密碼,而是人類本身。
咱們將信息安全所面臨的威脅與用來用對這些威脅的密碼技術直接的關係用一張圖標來表示出來。
歡迎與我交流