(01)Python密碼庫Cryptography探究學習---簡介和入門

一、簡介

Cryptography的目標是建立一個標準Python加密庫,支持 Python2.6-2.7, Python 3.3+, and PyPy 2.6+。如果對密碼學領域感興趣的話,可以學習Crypto101(作者是 Laurens Van Houtven),鏈接為Crypto 101,這本教材很不錯,適合初學者學習。

1.1 為什麼建立一個新的Python密碼庫?

現有的Python密碼庫,如M2Crypto, PyCrypto, or PyOpenSSL,存在一些問題:

  • 缺少PyPy和Python 3支持

  • 缺少維護

  • 使用了差評的演算法實現(例如旁路攻擊side-channel attacks)

  • 缺少高級(易於使用)的APIs
  • 缺少AES-GCM和HKDF等演算法
  • 經不住測試

  • 錯誤百出的APIs

1.2 特性

Cyptography密碼庫包括兩個部分:cryptographicrecipes and primitives.這是本密碼庫非常有意思的地方,很多現有的其他密碼庫並沒有這個特點。cryptographic recipes,直接翻譯為密碼學菜譜。其實個人也一時找不出合適的詞語來解釋。cryptographic primitives,即為密碼學原語,也就是基本的密碼概念,如加密、簽名、Hash等演算法。但是直接使用密碼學原語容易出錯,在實際應用中無法保證安全性。基於這一點,該庫對密碼學原語進行了安全集成,形成了更高層次的「密碼學菜譜」。這麼說吧,密碼學原語像是做菜的原材料,對於初學者來說,雖然手裡都有,但是不懂得如何去製作;如果有了「密碼學菜譜」,初學者直接按照說明,製作菜肴就可以了。

看看原文中,作者怎麼說吧:

One with safe cryptographic recipes, 「cryptography for humans」 if you will. These are safe and easy to use and don』t require developers to make many decisions.

The other level is low-level cryptographic primitives. These are often dangerous and can be used incorrectly. They require making decisions and having an in-depth knowledge of the cryptographic concepts at work. Because of the potential danger in working at this level, this is referred to as the 「hazardous materials」 or 「hazmat」 layer. These live in the cryptography.hazmat package, and their documentation will always contain an admonition at the top.We recommend using the recipes layer whenever possible, and falling back to the hazmat layer only when necessary.

1.3 安裝

使用Pip可以直接安裝,即

$ pip install cryptography

當然使用anaconda也可以安裝。

二、例子

Cryptography密碼庫實現了一個集成的對稱密碼函數,稱之為Fernet。它可以保證信息無法被篡改和破解。

2.1 一個加解密的例子

>>>from cryptography.fernet import Fernet>>>key = Fernet.generate_key()>>>keyOut[3]: "x10qxCPeNGhddcP5fASy5XB1JedmwXJeAF1gS-zeuvw=">>>f = Fernet(key)>>>fOut[6]: <cryptography.fernet.Fernet at 0xb969668>>>>token = f.encrypt(b"my deep dark secret")>>>tokenOut[8]: "gAAAAABYnKtVmGpMe6rM39jzSYFTlBxjXBwbCix8nZ2DBzsFh6BVzwtrYx0qDyohXQ3xqj232_DJsdN8bR9sMUQbEcPenZD-MAWqR-YkOdg7prc9e0QnMA4=">>>f.decrypt(token)Out[9]: "my deep dark secret"

解釋:

from cryptography.fernet import Fernet

該句為從函數庫中導入Fernet。

key = Fernet.generate_key()

產生加密所需的密鑰key,它通過調用相關函數而產生隨機數。這個隨機數是不是滿足密碼安全呢?我們下節進行詳細的解讀。

f = Fernet(key)。實例化Fernet

token = f.encrypt(b"my deep dark secret"),加密消息

f.decrypt(token),解密消息

2.2 密鑰輪換(Key rotation)的例子

MultiFernet的輸入為多個key的列表,它總是以第一個密鑰加密消息,而在解密時,依次使用每個密鑰。

Key rotation機制使得替代舊的密鑰變得容易。個人可以將新的密鑰添加在key列表的第一個,開始加密新的消息,而在解密以前的密文後,如果舊的密鑰不再需要則丟棄。

>>>from cryptography.fernet import Fernet, MultiFernet>>>key1 = Fernet(Fernet.generate_key())>>>key2 = Fernet(Fernet.generate_key())>>>f = MultiFernet([key1, key2])>>>token = f.encrypt(b"Secret message!")>>>tokenOut[6]: "gAAAAABYnKzqNxRAbwP6hMMGmB4eIBhiAR2oVG136Dpive8AhNBdtjwKKiOj_Zaxv8e1dHWp1_WpvktTCT5lRnm9ZnBIK4AoMw==">>>f.decrypt(token)Out[7]: "Secret message!">>>key3 = Fernet(Fernet.generate_key())>>>f = MultiFernet([key3,key1, key2])>>>f.decrypt(token)Out[10]: "Secret message!"

三、小結

簡要介紹了Cryptography密碼庫,最有意思的特性是包含的兩個部分cryptographic recipes 和 cryptographic primitives。

以Fernet(對稱加密)為例,介紹了cryptographic recipes的使用。

下一節將對Fernet的代碼進行分析,解釋為什麼它被稱之為cryptographic recipes,而不是cryptographic primitives


推薦閱讀:

如何理解前向安全性?和完美前向保密(perfect forward secrecy)區別?
經典分組密碼-DES演算法
解密NSA真正的竊聽技術
Ubuntu Linux下通過TPM保護SSH私鑰的安全

TAG:Python | 信息安全和密码学 | 密码学 |