密碼學-到底是什麼,又如何工作?

密碼學-到底是什麼,又如何工作?

正如 Bruce Schneier 在其應用密碼學(Applied Cryptography) 一書中所定義的那樣, “The art and science of keeping messages secure is cryptography […].” 密碼學雖然現在被認為是我們數字生活的基礎,但與計算無關。幾千年來它已經以各種形式存在。下面是維基百科關於密碼學歷史的文章節選:

已知的最早使用密碼學的地方是在公元前1900年左右從埃及古王國雕刻到墓葬牆上的非標準象形文字中發現的。雖然,並不能嚴謹的說明是在進行加密通信,更像是試圖給別的文明添加神秘。以下是密碼學在實際用途方面的例子。之後,一些來自Mesopotamia的粘土片顯然是為了保護信息 –可以追溯到公元前1500年左右的黏土片被發現用來加密一名工匠的陶器釉料配方,據推測,這種釉料具有商業價值。再後來,大約在500至600年之間,希伯來學者開始使用簡單的單字母替代密碼(如 Atbash 密碼)。在印度,大約在公元前400年至公元前200年,Mlecchita vikalpa 或許是理解了在 cypher 中的寫作藝術,用一種特殊方式寫作的文字記載於「Kama Sutra」中,為了戀人之間進行溝通。這也可能是一個簡單的替代密碼。埃及 Greek Magical Papyri 的部分是用密碼腳本編寫的。

你可能以前見過簡單的密碼學例子。Caesar cipher 或 shift cipher 通常用於解密秘密信息的兒童遊戲。ROT13 是一種非常常見的移位密碼,其中字母按13步旋轉,如下所示:

密碼學-到底是什麼,又如何工作?

很容易看出,這種密碼不提供真正的安全性,但它簡單而有趣的說明了密碼學背後的基本思想。

今天當我們談論密碼學時,我們通常會在技術環境中談論它。例如,當我們進行購買或查看我們的銀行賬戶時,個人和財務信息是如何在網絡上安全的進行傳輸(保護傳輸中的數據)的?如何安全地存儲數據(稱為保護靜態數據),以便別人不能夠打開計算機,彈出硬盤驅動器,還能在現場獲得有關此信息的日期?

定義

在網絡安全方面,涉及到數據時,我們會關注很多事情。這些包括數據的 Confidentiality(機密性),integrity (完整性),availability (可用性) 和 non-repudiation (不可否認性)。

integrity 意味著我們的數據 100% 還原,並且沒有被修改,無論是由惡意參與者、數據丟失還是其他原因造成的。

availability 意味著我們的數據在需要時可以訪問。

non-repudiation 意味著,如果 Bob 將一些數據發送給 Mary,那麼他就不能在以後聲稱他不是那個信息的發送者。換句話說,有一些方法可以確定除了 Bob 之外沒有人可以發送數據。

密碼學在可用性方面對我們沒有多大幫助,但是我們將研究各種形式的數字密碼學,以及它們如何幫助我們實現上述其他的三個目標。當我們談論數字密碼學時,我們通常指的是以下其中之一:

  1. 對稱加密
  2. 非對稱加密
  3. 散列函數
  4. 數字簽名

接下來會對每一個進行擴展。所有的代碼示例都是改編自 Jesus Castello 在 SitePoint 上的精彩文章,「Exploring Cryptography Fundamentals in Ruby」以及官方 Ruby 文檔。同時請記住,這些示例是為了說明這些概念,而不是提供數據安全性的最佳實踐。

對稱加密

為了正確加密和解密我們的數據,我們需要數據和一個密鑰(它決定了我們的密碼輸出)。

使用對稱加密,用於加密和解密數據的密鑰是相同的。

非對稱加密

對稱加密的問題在於:如果需要在惡劣環境(如 Internet)中安全地發送數據,該怎麼辦?如果使用相同的密鑰來加密和解密數據,那麼首先需要向您發送解密密鑰來建立安全連接。但這意味著我將密鑰通過一個不安全的連接發送,密鑰可以被第三方攔截和使用!如何解決這個問題?輸入非對稱加密。

以下有一個大概的想法。要使用非對稱密碼,需要生成兩個數學關聯的密鑰。一個是私鑰(只有您有權訪問),以及公鑰(顧名思義)可以與任何人公開共享。

因此,請求安全的連接到服務器,服務器發送它的公鑰,客戶端為對稱密碼生成密鑰並使用服務器的公鑰對其進行加密,服務器使用其私鑰對包含對稱密鑰的消息進行解密,現在雙方都有對稱密鑰,可以使用對稱加密建立安全連接。

可是接下來我們有另一個問題。我怎麼知道服務器的公鑰是合法的,即屬於該服務器!?通常,處理這個問題有兩種方法,但最常用的方法(以及網上使用的方法)是通過使用公鑰基礎結構(PKI)。有一種情況就是網站,有一個證書頒發機構,該機構有一個包含所有已頒發證書的網站的目錄以及它們的公鑰。當您連接到網站時,首先使用證書頒發機構驗證它的公鑰。

散列函數

散列函數與對稱/非對稱加密不同,是一種單向函數。您可以從某些數據創建散列,但無法真正逆轉該過程。因此,它對於存儲數據沒有用,但它是在驗證某些數據完整性方面很有效果。

散列函數將一些數據作為輸入,並輸出一個看起來隨機(但不是全部)的字符串,該字符串的長度始終相同。理想的散列函數為不同的輸入創建唯一的值。完全相同的輸入將始終產生完全相同的散列 - 這就是為什麼我們可以使用它來驗證數據完整性。

數字簽名

數字簽名對完整性和不可否認性都有很好的應用。數字簽名是散列和非對稱加密的組合。也就是說,信息首先被散列函數計算,並且該散列用發送者的私鑰加密。這就組成了簽名,與消息一起發送。

收件人使用發件人的公鑰從簽名中提取散列,然後對信息進行散列處理以與提取的散列進行比較。如果您確信公鑰屬於發件人,並且公鑰解密成功,那麼您可以確信郵件確實來自發件人。如果提取的散列與信息的計算散列匹配,則可以確定消息的完整性。

請記住,數字簽名不一定會使信息保密; 因為有可能簽署明文消息。 數字簽名將與加密的消息一起工作,但是信息本身的加密必須單獨執行。


分享到:


相關文章: