PEP 272 – 塊加密演算法 API v1.0
- 作者:
- A.M. Kuchling <amk at amk.ca>
- 狀態:
- 最終版
- 型別:
- 資訊性
- 建立日期:
- 2001年9月18日
- 釋出歷史:
- 2002年4月17日,2002年5月29日
摘要
本文件指定了秘密金鑰塊加密演算法(如DES或Rijndael)的標準API,從而更容易在不同的演算法和實現之間進行切換。
引言
加密演算法以某種依賴於可變金鑰的方式轉換其輸入資料(稱為明文),產生密文。當且僅當知道金鑰時,轉換才能輕鬆逆轉。金鑰是選自某個非常大的可能金鑰空間的一串位。加密演算法分為兩類:塊密碼和流密碼。
塊密碼加密固定大小(通常為8或16位元組長)的多位元組輸入,並可以在各種反饋模式下執行。本規範支援的反饋模式有
| 編號 | 常量 | 描述 |
|---|---|---|
| 1 | MODE_ECB | 電子密碼本 |
| 2 | MODE_CBC | 密碼塊連結 |
| 3 | MODE_CFB | 密文反饋 |
| 5 | MODE_OFB | 輸出反饋 |
| 6 | MODE_CTR | 計數器 |
這些模式將按照NIST出版物SP 800-38A [1]中的描述實現。前三種反饋模式的描述也可以在Bruce Schneier的著作《應用密碼學》[2]中找到。
(數值4保留給MODE_PGP,這是RFC 2440:“OpenPGP訊息格式”中描述的CFB變體。這種模式不被認為足夠重要,不值得要求所有塊加密密碼都必須支援它,儘管支援它是一個不錯的額外功能。)
從嚴格的正式意義上講,流密碼逐位加密資料;實際上,流密碼逐字元工作。本PEP僅旨在為塊密碼指定介面,儘管流密碼可以透過將“block_size”固定為1來支援此處描述的介面。反饋模式對於流密碼也沒有意義,因此唯一合理的反饋模式將是ECB模式。
規範
加密模組可以在本PEP描述的功能、方法和屬性之外新增其他功能、方法和屬性,但所有本PEP描述的功能都必須存在,模組才能聲稱符合本PEP。
秘密金鑰加密模組應定義一個函式
new(key, mode, [IV], **kwargs)
返回一個加密物件,使用字串“key”中包含的秘密金鑰,並使用反饋模式“mode”,該模式必須是上表中列出的常量之一。
如果“mode”是MODE_CBC或MODE_CFB,“IV”必須提供,並且必須是與塊大小相同的字串。不提供“IV”的值將導致引發ValueError異常。
根據演算法,模組可能支援此函式的其他關鍵字引數。本PEP指定了一些關鍵字引數,模組可以自由新增其他關鍵字引數。如果未為給定關鍵字提供值,則應使用安全的預設值。例如,如果演算法的回合數可以在1到16之間選擇,並且1回合加密不安全,8回合加密被認為是安全的,則“rounds”的預設值應為8或更多。(模組實現者也可以選擇一個非常慢但安全的值,例如此示例中的16。此決定留給實現者。)
下表列出了本PEP定義的關鍵字引數
| 關鍵字 | 含義 |
|---|---|
| 計數器 | 可呼叫物件,返回計數器塊(見下文;僅限CTR模式) |
| 回合數 | 要使用的加密回合數 |
| 分段大小 | 資料和密文段的大小,以位為單位測量(見下文;僅限CFB模式) |
計數器反饋模式需要一系列輸入塊,稱為計數器,用於產生輸出。當“mode”是MODE_CTR時,必須提供“counter”關鍵字引數,其值必須是可呼叫物件,例如函式或方法。對該可呼叫物件的連續呼叫必須返回一系列長度為“block_size”且永不重複的字串。(NIST出版物附錄B提供了一種生成此類序列的方法,但這超出了本PEP的範圍。)
CFB模式對明文和密文的“segment_size”位長的段進行操作。因此,當使用此模式時,輸入和輸出字串的長度必須是“segment_size”位的倍數。“segment_size”必須是介於1和block_size*8(包括兩者)之間的整數。(因子8是因為“block_size”以位元組而不是位為單位測量)。此引數的預設值應為block_size*8。為了簡單起見,允許實現者將“segment_size”限制為8的倍數,但鼓勵他們為了通用性支援任意值。
秘密金鑰加密模組應定義兩個變數
- block_size
一個整數值;此模組加密的塊的大小,以位元組為單位測量。對於所有反饋模式,傳遞給encrypt()和decrypt()的字串長度必須是塊大小的倍數。
- key_size
一個整數值;此模組所需的金鑰大小,以位元組為單位測量。如果key_size為None,則演算法接受變長金鑰。這可能意味著模組接受任何隨機長度的金鑰,或者有幾種不同的可能長度,例如16、24或32位元組。不能將長度為0的金鑰(即空字串'')作為變長金鑰傳遞。
密碼物件應具有兩個屬性
- block_size
一個整數值,等於此物件加密的塊的大小。對於具有可變塊大小的演算法,此值等於為此物件選擇的塊大小。
- IV
包含將用於啟動密碼反饋模式的初始值;它將始終是一個正好一個塊長度的字串。加密或解密字串後,此值會更新以反映修改後的反饋文字。它是隻讀的,不能賦新值。
密碼物件需要以下方法
- decrypt(string)
使用物件中依賴於金鑰的資料和適當的反饋模式解密“string”。字串的長度必須是演算法塊大小的精確倍數,或者在CFB模式下是段大小的精確倍數。返回包含明文的字串。
- encrypt(string)
使用物件中依賴於金鑰的資料和適當的反饋模式加密非空字串。字串的長度必須是演算法塊大小的精確倍數,或者在CFB模式下是段大小的精確倍數。返回包含密文的字串。
下面是一個使用名為“DES”的模組的示例
>>> import DES
>>> obj = DES.new('abcdefgh', DES.MODE_ECB)
>>> plaintext = "Guido van Rossum is a space alien."
>>> len(plaintext)
34
>>> obj.encrypt(plaintext)
Traceback (innermost last):
File "<stdin>", line 1, in ?
ValueError: Strings for DES must be a multiple of 8 in length
>>> ciphertext = obj.encrypt(plain+'XXXXXX') # Add padding
>>> ciphertext
'\021,\343Nq\214DY\337T\342pA\372\255\311s\210\363,\300j\330\250\312\347\342I\3215w\03561\303dgb/\006'
>>> obj.decrypt(ciphertext)
'Guido van Rossum is a space alien.XXXXXX'
參考資料
更改
2002-04:刪除了對流密碼的引用;重新命名PEP;反饋模式常量字首為MODE_;刪除了PGP反饋模式;添加了CTR和OFB反饋模式;澄清了哪裡以位元組為單位測量數字,哪裡以位為單位測量。
2002-09:透過使用“可變長度金鑰”而不是“任意長度”澄清了金鑰長度的討論。
致謝
感謝python-crypto列表的讀者對本PEP的評論。
版權
本文件已置於公共領域。
來源:https://github.com/python/peps/blob/main/peps/pep-0272.rst