Following system colour scheme - Python 增強提案 Selected dark colour scheme - Python 增強提案 Selected light colour scheme - Python 增強提案

Python 增強提案

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

最後修改:2025-02-01 08:59:27 GMT