1. 程式人生 > >密碼學基礎上篇

密碼學基礎上篇

本文首發自蟲洞社群,轉載請註明出處。

密碼學概念

密碼學是對資訊進行編碼實現隱蔽資訊的一門科學,採用密碼技術可以隱藏和保護需要保密的資訊,使未經授權者不能提取資訊。需要隱藏的訊息稱為“明文”;明文被變換成的另一種隱蔽的形式就是“密文”。這種變換稱為“加密”;加密的逆過程,即從密文恢復出對應的明文的過程稱為“解密”。對明文進行加密時採用的一組規則(函式)稱為“加密演算法”。對密文解密時使用的演算法稱為“解密演算法”。一般地,加密演算法和解密演算法都是在一組金鑰控制之下進行的,加密時使用的金鑰稱之為“加密金鑰”,解密時使用的金鑰稱之為“解密金鑰”。

密碼系統

什麼是密碼系統呢?密碼系統是一個概念,可以用以下的等式簡單概括:

  • 密碼系統 = 密碼演算法 + 明文空間 + 密文空間 + 金鑰集合

把密碼系統拆開來看,就容易理解,一個完整的密碼系統,必定包含演算法、祕鑰、明文、密文四個部分。

密碼系統應該滿足的要求:

  1. 系統的保密性不依賴與演算法的保密性,而依賴於金鑰
  2. 破譯加解密演算法在計算上是不可行的(破譯密文的代價超過被加密資訊的價值;破譯密文所花的時間操作資訊有用期)

密碼體制分類:

密碼體制中根據加密祕祕鑰是否相同,分為對稱加密演算法和非對稱加密演算法。顧名思義,非對稱加密演算法需要兩個不同金鑰:公開金鑰(publickey)和私有金鑰(privatekey)。公開金鑰與私有金鑰是一對,如果用公開金鑰對資料進行加密,只有用對應的私有金鑰才能解密;如果用私有金鑰對資料進行加密,那麼只有用對應的公開金鑰才能解密。反之使用同一祕鑰的演算法稱為對稱演算法。

對稱演算法:加解密使用同一祕鑰。 非對稱演算法:加解密使用不同的祕鑰。

對稱與非對稱加密方式對比:

常見對稱演算法

由於對稱演算法加解密祕鑰是相同的,所以對稱演算法的安全性依賴祕鑰的長度,通常情況下祕鑰越長,安全性越高。所以56bit的DES的安全性極低,極容易被暴力破解。而3DES是為了相容DES的折中方案,目前比較安全的演算法是AES。

常見非對稱演算法

說到非對稱演算法,一般都會先想到大名鼎鼎的RSA演算法。RSA的安全基於大數分解的難度。其公鑰和私鑰是一對大素數(100到200位十進位制數或更大)的函式。從一個公鑰和密文恢復出明文的難度,等價於分解兩個大素數之積(這是公認的數學難題)。RSA的公鑰、私鑰的組成,以及加密、解密的公式如下:

當然非對稱演算法還有橢圓曲線演算法ECC,其主要安全性在於利用了橢圓曲線離散對數問題的困難性,證明過程還是挺繁瑣,這邊不細講,有興趣同學可以自己蒐集資料瞭解下。

Hash函式

Hash函式定義

Hash演算法又叫做雜湊演算法、單項雜湊函式。雜湊函式就是把可變長度輸入串(叫預對映)轉化成固定長度的輸出串(叫雜湊值)的一種函式。

Hash函式的要求:

  1. 任意訊息大小都適用
  2. 輸出固定的長度
  3. 計算相對簡單:在有限時間和有限資源內能計算出 hash 值
  4. 抗第一原相性(單向性):給出一個輸出z,找到滿足h(x)=z的輸入x是不可能的
  5. 抗第二原相性:給定x1和h(x1),找到滿足h(x1)=h(x2)的x2在計算上是不可能的
  6. 抗衝突性滿足h(x1)=h(x2)的一對,在計算上是不可行的

Hash函式演算法特點:

  1. 正向快速:給定明文和 hash 演算法,在有限時間和有限資源內能計算出 hash 值。
  2. 逆向困難:給定(若干) hash 值,在有限時間內很難(基本不可能)逆推出明文。
  3. 輸入敏感:原始輸入資訊修改一點資訊,產生的 hash 值看起來應該都有很大不同。
  4. 衝突避免:很難找到兩段內容不同的明文,使得它們的 hash 值一致(發生衝突)。即對於任意兩個不同的資料塊,其hash值相同的可能性極小;對於一個給定的資料塊,找到和它hash值相同的資料塊極為困難。

生日攻擊

生日問題:假設每個人的生日都是等概率的,每年365天,在k箇中至少兩個人的生日概率大於1/2,問k最小是多少?

P(至少兩人生日相同)=1- P(k人生日都不同) P(365, k) = 1- (1-1/365)(1-2/365)…(1-k/365) p(365,23) = 0.5073

所以只要23個人,兩個人相同生日的概率就大於50%了。根據生日悖論可以得到這樣一個結論:對於hash值長度為2n的hash函式,生日攻擊的複雜度是2n/2,注意這邊攻擊的是hash函式的抗第二原性。

王小云教授破解hash函式又是怎麼回事。根據hash函式的特定我們知道,hash是不可能被破解的,這邊說的破解說的是一個概念叫理論破解,指的是提出一個演算法,使得可以用低於理論值得列舉次數找到碰撞。王小云的主要工作是給出了MD5,SHA-0的碰撞,以及SHA-1的理論破解,例如她證明了160位SHA-1,只需要大約2^69次計算就能找出來,而理論值是2^80次。所以王小云的貢獻就是找到了比生日攻擊複雜度低得多演算法來快速找到一對強碰撞,弱碰撞依舊是不行的。

Hash函式的應用

hash函式常用在密碼加密中,這樣即使密碼洩露也無法反向得到明文密碼。但是可以事先得到一些字元的hash值,然後對比這個hash值得到明文密碼,這就是常見的彩虹表破解。所以為了提高安全性,一些網站還會對密碼加salt後再進行hash計算,這邊所謂的salt就是幾位隨機字串。接下來重點說下hash函式在區塊鏈中的應用。雜湊演算法在區塊鏈系統中的應用很廣泛:比特幣使用雜湊演算法通過公鑰計算出錢包地址、區塊頭以及交易事務的雜湊值,梅克爾樹結構本身就是一顆雜湊樹,就連挖礦演算法都是使用的雜湊值難度匹配;以太坊中的挖礦計算也使用雜湊演算法,其中的梅克爾-帕特里夏樹同樣也是一顆雜湊樹。下面就舉兩例說明下hash在區塊鏈中的重要性。

一:梅克爾樹 在區塊主體中,所有交易資訊先進行兩個一組的雜湊計算,這種結構叫做梅克爾樹(Merkle Tree),而且是一棵倒掛的樹。例如一個區塊裡只有4筆交易,則默克爾樹生成過程。

二:Hash挖礦 那hash在區塊鏈中最為人知的應用是hash挖礦,那這到底是怎麼一回事呢?例如比特幣中的挖礦,簡單來說,即要找出類似 00010000000000000000000000000000 的目標hash。後面挖礦越來越困難,就是因為要找到hash值越來越小。所以,可以簡單理解為挖礦就是找出某隨機數的hash使得比目標hash還要小。