1. 程式人生 > 程式設計 >密碼學入門之密碼

密碼學入門之密碼

最近在研讀《圖解密碼技術》這本書,將有一系列的密碼學學習筆記,涉及到密碼的相關概念、對稱加密、非對稱加密、單向雜湊函式、訊息認證碼、數字簽名、數字證書等內容,同時涉及到程式碼部分也會使用Golang進行展示,感興趣的可以關注更新哦。好了,今天先講講密碼學中的一些概念性的問題。

傳送者、接收者和竊聽者

請想象一個Alice向Bob傳送電子郵件的場景。在這個場景中,發出郵件的Alice稱為 傳送者(sender),而收到郵件的Bob則稱為 接收者(receiver)

當某個人向另一個人傳送資訊時,發出資訊的人稱為傳送者,而收到資訊的人稱為接收者。另外,被髮送的資訊有時也統稱為 訊息(message)

郵件是通過網際網路從Alice的計算機傳送到Bob的計算機的。在傳送郵件時,郵件會經過許多臺計算機和通訊裝置進行中轉,在這個過程中,就存在被惡意竊聽者(eavesdropper)偷看到的可能性

竊聽者Eve並不一定是人類,有可能是安裝在通訊裝置上的某種竊~聽~器,也可能是安裝在郵件軟體和郵件伺服器上的某些程式。

儘管郵件內容原本應該只有傳送者和接收者兩個人知道,但如果不採取相應的對策,就存在被第三方知道的風險。

加密和解密

那麼如何防止竊聽者的竊聽呢?Alice不想讓別人看到郵件的內容,於是她決定將郵件進行**加密(encrypt)**後再發送出去。

加密之前的訊息稱為明文(plaintext)

,加密之後的訊息稱為密文(cipher-text)

  • 明文加密之後就會變成看不懂的密文

Bob收到了來自Alice的加密郵件,但作為接收者的Bob也是無法直接閱讀密文的,於是 Bob需要對密文進行解密(decrypt)之後再閱讀。解密就是將密文恢復成明文的過程。

  • 密文解密之後就變成了原來的明文

將訊息加密後傳送的話,即使訊息被竊聽,竊聽者得到的也只是密文,而無法得知加密前的明文內容

  • 將訊息加密後傳送,竊聽者只能得到密文

    在上述場景中,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的電腦以獲取加密之前的郵件明文。

上面提到的攻擊手段,都與密碼的強度毫無關係。要保證良好的安全性,就需要理解“系統”這一概念本身的性質複雜的系統就像一根由無數個環節相連組成的鏈條,如果用力拉,鏈條就會從其中最脆弱的環節處斷開。因此,系統的強度取決於其中最脆弱的環節的強度。

最脆弱的環節並不是密碼,而是人類自己。

密碼資訊威脅

我們將資訊保安所面臨的威脅與用來用對這些威脅的密碼技術直接的關係用一張圖示來表示出來。

歡迎與我交流