本文首發自蟲洞社區,轉載請注明出處。
密碼學概念
密碼學是對信息進行編碼實現隱蔽信息的一門科學,采用密碼技術可以隱藏和保護需要保密的信息,使未經授權者不能提取信息。需要隱藏的消息稱為“明文”;明文被變換成的另一種隱蔽的形式就是“密文”。這種變換稱為“加密”;加密的逆過程,即從密文恢復出對應的明文的過程稱為“解密”。對明文進行加密時采用的一組規則(函數)稱為“加密算法”。對密文解密時使用的算法稱為“解密算法”。一般地,加密算法和解密算法都是在一組密鑰控制之下進行的,加密時使用的密鑰稱之為“加密密鑰”,解密時使用的密鑰稱之為“解密密鑰”。
密碼系統
什么是密碼系統呢?密碼系統是一個概念,可以用以下的等式簡單概括:
- 密碼系統 = 密碼算法 + 明文空間 + 密文空間 + 密鑰集合
把密碼系統拆開來看,就容易理解,一個完整的密碼系統,必定包含算法、秘鑰、明文、密文四個部分。
密碼系統應該滿足的要求:
- 系統的保密性不依賴與算法的保密性,而依賴於密鑰
- 破譯加解密算法在計算上是不可行的(破譯密文的代價超過被加密信息的價值;破譯密文所花的時間操作信息有用期)
密碼體制分類:
密碼體制中根據加密秘秘鑰是否相同,分為對稱加密算法和非對稱加密算法。顧名思義,非對稱加密算法需要兩個不同密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。公開密鑰與私有密鑰是一對,如果用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密;如果用私有密鑰對數據進行加密,那么只有用對應的公開密鑰才能解密。反之使用同一秘鑰的算法稱為對稱算法。
對稱算法:加解密使用同一秘鑰。
非對稱算法:加解密使用不同的秘鑰。
對稱與非對稱加密方式對比:
常見對稱算法
由於對稱算法加解密秘鑰是相同的,所以對稱算法的安全性依賴秘鑰的長度,通常情況下秘鑰越長,安全性越高。所以56bit的DES的安全性極低,極容易被暴力破解。而3DES是為了兼容DES的折中方案,目前比較安全的算法是AES。
常見非對稱算法
說到非對稱算法,一般都會先想到大名鼎鼎的RSA算法。RSA的安全基於大數分解的難度。其公鑰和私鑰是一對大素數(100到200位十進制數或更大)的函數。從一個公鑰和密文恢復出明文的難度,等價於分解兩個大素數之積(這是公認的數學難題)。RSA的公鑰、私鑰的組成,以及加密、解密的公式如下:
當然非對稱算法還有橢圓曲線算法ECC,其主要安全性在於利用了橢圓曲線離散對數問題的困難性,證明過程還是挺繁瑣,這邊不細講,有興趣同學可以自己搜集資料了解下。
Hash函數
Hash函數定義
Hash算法又叫做雜湊算法、單項散列函數。散列函數就是把可變長度輸入串(叫預映射)轉化成固定長度的輸出串(叫散列值)的一種函數。
Hash函數的要求:
- 任意消息大小都適用
- 輸出固定的長度
- 計算相對簡單:在有限時間和有限資源內能計算出 hash 值
- 抗第一原相性(單向性):給出一個輸出z,找到滿足h(x)=z的輸入x是不可能的
- 抗第二原相性:給定x1和h(x1),找到滿足h(x1)=h(x2)的x2在計算上是不可能的
- 抗沖突性滿足h(x1)=h(x2)的一對,在計算上是不可行的
Hash函數算法特點:
- 正向快速:給定明文和 hash 算法,在有限時間和有限資源內能計算出 hash 值。
- 逆向困難:給定(若干) hash 值,在有限時間內很難(基本不可能)逆推出明文。
- 輸入敏感:原始輸入信息修改一點信息,產生的 hash 值看起來應該都有很大不同。
- 沖突避免:很難找到兩段內容不同的明文,使得它們的 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還要小。