托馬斯.普塔切克曾經發過一條Twitter「若是你不是編寫攻擊代碼的時候學習的密碼學,那麼你可能根本沒有在學密碼學」。 從Twitter上對這條信息的關注及其引用數來看,它彷佛獲得了不少人的認同。儘管我很尊重託馬斯,但我絕對不一樣意他的觀點。我認爲學習密碼學,不只不須要寫代碼,並且編寫攻擊代碼對於學習現代密碼學根本毫無用處。學習現代密碼學最好的方式是研究數學論證。html
若是咱們仍然是處在20世紀90年代的話,我會贊成托馬斯的觀點。當時的密碼學充滿了漏洞,你能想到的最浪漫的事就是了解你的工具是如何崩潰的,由於以後你就能夠去解決它們的問題。那時,DES和RC4加密算法,儘管有不少已知的缺陷,卻被普遍地使用;那時,人們避免使用CTR模式去轉換塊密碼到序列密碼,由於他們擔憂若是所提供的輸入數據塊中包含有不少相同(0)數據的話,脆弱的塊密碼會被破解;那時,人們關心塊密碼的偏差傳播能力,這關係到在密文中有少許的位發生未知變化後,對於解密數據的正確性會產生多少影響;那時,人們一般建議在加密數據前,先對其進行壓縮,由於這將會「壓縮」信息熵使得攻擊者即便獲得了祕鑰也很難理解密文。所以,誕生於這個時代的SSL,有不少不少的缺陷,也就不足爲奇了。算法
可是,從2010年開始密碼學變得徹底不一樣了。如今,咱們開始有了能夠高度信賴的的基礎構件——好比:塊密碼已被確信是近似隨機排列,而且已經從數學上證實它是足夠安全的,能夠抵禦某些類型的攻擊——好比:AES是已知的能夠抵禦差分密碼分析的加密算法。咱們以這些組件爲基礎,利用已被證實是不會引入漏洞的機制建立高階的系統。例如,若是你在CTR模式下,使用類隨機排列的塊加密算法(好比,AES)對數據加密,從而產生一個有序的分組序列,並使用分組序列號做爲CTR隨機數,而後追加一個不易僞造的針對被加密數據的MAC地址(好比,HMAC-SHA256)及分組序列號,那麼這些分組既能夠保密數據,也能夠禁止任何未聲明的篡改(包括報文重放和從新排序)。一旦Keccak(即SHA-3)獲得更加普遍地檢驗和信任,生活甚至會變得更加美好,由於它相似海綿的彈性結構去構造大量重要的加密構件,這已經被證實是安全的了。segmentfault
在20世紀90年代的密碼學就像是在嘗試建一種橋,你花了許多時間確保你的橋能屹立不倒,而且爲此憂心忡忡,即便有一些地方焊接的不夠完美,一些螺絲生鏽了,因爲週期性的負載致使的金屬疲勞,等等。雖然從理論上講量身定製能夠有很好效果,但你知道的實際老是與理論不符,所以這座橋實際是建在了安全與不安全的邊界上,這使得橋的構形成本更高,也更加複雜。這就是純粹的工程學。安全
可是,現代密碼學是大相徑庭的,它不是在建造一座橋,而是像規劃一個依靠重力輔助的星際的軌道。固然,這是複雜的,你必須正確的掌握全部的細節。可是,若是你作到了,一旦開始運行,使你沒法到達目的地的惟一可能就是物理或數學定理改變了。現代密碼學已經充分地發展到理論與實際相符,所以,相比經過觀察橋的倒塌進行學習,理論學習就已經十分有效了,而後你須要聽從一個簡單的原則:只作數學告訴你你能作的事情。這就是純粹的科學。工具
我相信託馬斯所作的事情,以及他在實施密碼攻擊上所積累的經驗是很是有用的。畢竟,他是以挖掘應用缺陷爲生,但他所遇到的絕大多數加密方法極可能是20世紀90年代的加密方法,那是一個已經逝去的時代。所以對於開發者,我推薦以一個更加現代化的方法學習密碼學,那就是學習理論並設計出你能證實是安全的系統。學習
原文 Cryptography is a science, not engineering
翻譯 周耀平
via idf.cn加密