前言 無論你有沒有意識到,日常生活中我們幾乎每天都在跟密碼學打交道。只要你接觸過互聯(lián)網(wǎng),那么基本上離不開密碼學。舉個最簡單的例子,現(xiàn)在的很多網(wǎng)站都是通過HTTPS協(xié)議進行通信的,而支撐著HTTPS協(xié)議正常運行的正是密碼學這一理論基礎。作為程序員,我們更是有必要了解下密碼學的一些基本理論及其背后的原理。本文將通過通俗易懂的語言為大家介紹下密碼學的概念,希望大家看完能夠?qū)γ艽a學有初步的認識。 一、加密 在介紹加密之前,我們先引入一個場景。假設有2個人小明和小白,他們倆通過電子郵件進行溝通。由計算機網(wǎng)絡的知識我們可以知道,小明發(fā)給小白的郵件會被拆分成多個數(shù)據(jù)報文在網(wǎng)絡中進行傳輸,假如說有個竊聽者小黑截獲了小明發(fā)給小白的數(shù)據(jù)報文,并將截獲的數(shù)據(jù)報文按順序組裝起來,然后按照標準郵件傳輸協(xié)議進行解析,則小黑就可以獲得小明發(fā)送給小白的郵件內(nèi)容了,因此在這個發(fā)郵件的過程中就存在被第三者竊聽的風險。為了解決這個問題,我們需要對信息進行加密以防止數(shù)據(jù)被竊聽。接下來介紹今天要講的第一個內(nèi)容:加密。 在上述例子中,之所以存在數(shù)據(jù)被竊聽的風險,是因為在通信的過程中郵件內(nèi)容是通過明文進行傳輸?shù)?。明文就是未加密處理的消息?nèi)容,在上述例子中就是郵件內(nèi)容。假如說小明跟小白在郵件通信的過程中采用了只有雙方看得懂的文字,那么即使這些文字被第三者截獲了,那么第三者也看不懂其中的含義,這樣就可以防止竊聽了。而這個過程就是加密,即將明文轉(zhuǎn)換成密文的過程,密文對于第三者而言就是沒有任何意義的數(shù)據(jù),只有通信雙方才有辦法將密文轉(zhuǎn)換成明文,進而獲取郵件里傳輸?shù)脑伎勺x內(nèi)容。而將密文轉(zhuǎn)換成明文的過程就是解密。 既然要進行加密跟解密就必須用到密鑰。密鑰與數(shù)據(jù)的關系可以理解成保險柜鑰匙跟保險柜的關系,只有正確的保險柜鑰匙才能打開對應的保險柜,同理也只有正確的密鑰才能對數(shù)據(jù)進行加密或解密。而根據(jù)密鑰的特點,可以將加密分為對稱加密和非對稱加密(也叫公鑰加密)。 1)對稱加密 對稱加密是指在加密和解密的過程使用同一密鑰的加密方式。在上述收發(fā)郵件的例子中,如果小明和小白約定好對稱加密的算法(比如說DES)跟密鑰,則小明在發(fā)送郵件給小白時,可以用雙方約定好的算法跟密鑰進行加密后發(fā)送給小白,小白收到加密后的郵件數(shù)據(jù)后,還是用之前約定好的算法跟密鑰進行解密,這樣一來小白就能獲取到小明發(fā)送給小白的原始郵件內(nèi)容了。而在通信過程中,即使竊聽者竊聽了通信內(nèi)容,由于他不知道加密算法跟密鑰,因此無法解析出原始的郵件信息,從而達到了防止竊聽的目的。 2)非對稱加密 非對稱加密,顧名思義就是加密跟解密的過程使用不同的密鑰的加密方式。用于加密的密鑰稱為公鑰,用于解密的密鑰稱為私鑰。公鑰是公開的,即任何人都可以獲取到,而私鑰只有數(shù)據(jù)的接受者才有。因此任何人都可以獲取公鑰對數(shù)據(jù)進行加密后再發(fā)送數(shù)據(jù)給私鑰的擁有者,由于只有私鑰才能對數(shù)據(jù)進行解密,因此也就只要私鑰的擁有者才能正確將密文解密成明文,故而也能實現(xiàn)防止竊聽的功能。 大家可能會問,既然有了對稱加密,為什么還會出現(xiàn)非對稱加密呢?非對稱加密對于對稱加密而言究竟有什么優(yōu)點呢?在現(xiàn)實世界中,使用對稱加密方式,必定會遇到一個密鑰配送的問題。因為在對稱加密的過程中,密鑰必須通信雙方都知曉才能安全通信,假如密鑰泄露了,那么整個通信過程還是存在被竊聽的風險。因此對稱加密能正常運作的前提是密鑰能夠做到可靠配送,而密鑰配的可靠配送有時候并不簡單。 而如果使用非對稱加密就不存在密鑰配送的問題,因為用于加密的公鑰是公開的,不具有私密性,任何人都可以獲取到,因此只要數(shù)據(jù)的接受者保管好私鑰就能正常使用非對稱加密進行通信了。這就是非對稱加密相對于對稱加密的優(yōu)點。 二、單向散列函數(shù) 在介紹單向散列函數(shù)之前,我們還是先引入一個場景。相信我們大家都在網(wǎng)上下載過軟件或者文檔,那么大家有沒有想過一個問題就是當你把網(wǎng)絡上的文檔下載到你自己的電腦上時,你怎么確定你下載的文件沒有被別人修改過呢?根據(jù)計算機網(wǎng)絡的知識我們可以知道,你從遠程主機下載的文件是分成多個數(shù)據(jù)報文傳輸?shù)侥阕约旱碾娔X上的,這個時候第三者是可以截獲到這些數(shù)據(jù)報文的,假如這個第三者他不止截獲了數(shù)據(jù)報文,他還修改了其中的一些內(nèi)容,然后再轉(zhuǎn)發(fā)給你,這個時候你怎么識別出你下載的文件是否被篡改呢?這就要借助單向散列函數(shù)了。 單向散列函數(shù)是一個輸入跟輸出的映射,輸入是指數(shù)據(jù)(也叫做消息),輸出就是散列值。大家可以理解成就是一個函數(shù):y=f(x),其中x是原始數(shù)據(jù),y是散列值。只是這個函數(shù)有2個比較特殊的地方就是:1、數(shù)據(jù)不同,輸出的散列值也不同,也就是不同的x,算出來的y是不同的;2、函數(shù)是單向的,就是由數(shù)據(jù)可以算出散列值,但是由散列值無法算出原始數(shù)據(jù)。單向散列函數(shù)中的數(shù)據(jù)跟散列值的關系大家可以理解成一個人跟他的指紋的關系,一個人跟他的指紋是一一對應的,不同人的指紋是不一樣的,具有唯一性;同時根據(jù)一個人可以得到他的指紋信息,但是根據(jù)指紋信息沒法獲得一個人的所有信息,因此是單向性的。 根據(jù)單向散列函數(shù)的上述2個主要特點,就能用來確認數(shù)據(jù)的完整性了。因為即使數(shù)據(jù)只被修改了1比特,其算出來的散列值差異也會非常大,根據(jù)這一點就能確保數(shù)據(jù)的完整性了。此外,由于單向散列函數(shù)的單向性,使得他不能用于加密,因為只能從數(shù)據(jù)算出散列值,而無法從散列值算出原始數(shù)據(jù)。 在上述的檢測下載文件完整性的例子中,只要在下載了文件之后,再從源網(wǎng)站查詢該文件的散列值,然后對下載到本機的文件計算散列值,并與源網(wǎng)站的散列值進行對比,就能確認數(shù)據(jù)的完整性了。 |
|