該軟體包包含用于保護機密性的演算法 的資料,Crypto.Cipher
有三種型別的加密演算法:
- 對稱密碼:所有各方都使用相同的密鑰 解密和加密資料, 對稱密碼通常非常快,可以處理 非常大量的資料,
- 非對稱密碼:發送方和接收方使用不同的密鑰, 發送方使用公鑰(非機密)加密,而接收方 使用私鑰(機密)解密, 非對稱密碼通常非常慢,可以處理 只有非常小的有效載荷,示例:PKCS#1 OAEP (RSA),
- 混合密碼:上述兩種型別的密碼可以組合使用 在繼承兩者優點的結構中, 非對稱密碼用于保護短期 對稱鍵, 和對稱密碼(在該密鑰下)加密 實際訊息,
對稱密碼
有兩種型別的對稱密碼:
-
流密碼:最自然的密碼型別: 它們一次加密一個位元組的資料, 參見ChaCha20和XChaCha20和Salsa20,
-
分組密碼:只能以固定數量操作的密碼 的資料,最重要的分組密碼是AES,它具有 塊大小為 128 位(16 位元組),
通常,分組密碼通常僅與 一種操作模式,允許加密 可變數量的資料,某些模式(如點擊率)可以有效地轉動 將分組密碼轉換為流密碼,
廣泛的共識是,密碼提供 只有機密性,沒有任何形式的身份驗證,是不可取的, 相反,基元已被定義為集成對稱加密和 身份驗證 (MAC),例如:
- 分組密碼(如 GCM)的現代操作模式,
- 流密碼與 MAC 函式配對,如 ChaCha20-Poly1305 和 XChaCha20-Poly1305,
ChaCha20 和 XChaCha20
ChaCha20是由Daniel J. Bernstein設計的流密碼, 密鑰長度為 256 位(32 位元組), 密碼需要亂數,不得重復使用 跨使用同一密鑰執行的加密,
有三種變體,由亂數的長度定義:
| 亂數長度 | 描述 | 最大資料 | 如果隨機亂數和相同的鍵 |
|---|---|---|---|
| 8 位元組(默認) | 由伯恩斯坦設計的原始ChaCha20, | 無限制 | 最多 200 000 條訊息 |
| 12 位元組 | RFC7539 中定義的 TLS ChaCha20, | 256 千兆位元組 | 最多 130 億條訊息 |
| 24 位元組 | XChaCha20,仍處于草稿階段, | 256 千兆位元組 | 無限制 |
這是ChaCha20(Bernstein的版本)如何加密資料的一個例子: import json from base64 import b64encode from Crypto.Cipher import ChaCha20 from Crypto.Random import get_random_bytes plaintext = b'Attack at dawn' key = get_random_bytes(32) cipher = ChaCha20.new(key=key) ciphertext = cipher.encrypt(plaintext) nonce = b64encode(cipher.nonce).decode('utf-8') ct = b64encode(ciphertext).decode('utf-8') result = json.dumps({'nonce':nonce, 'ciphertext':ct}) print(result) {"nonce": "IZScZh28fDo=", "ciphertext": "ZatgU1f30WDHriaN8ts="} 這就是您解密它的方式: import json from base64 import b64decode from Crypto.Cipher import ChaCha20 # We assume that the key was somehow securely shared try: b64 = json.loads(json_input) nonce = b64decode(b64['nonce']) ciphertext = b64decode(b64['ciphertext']) cipher = ChaCha20.new(key=key, nonce=nonce) plaintext = cipher.decrypt(ciphertext) print("The message was " + plaintext) except (ValueError, KeyError): print("Incorrect decryption") 為了擁有符合 RFC7539 標準的 ChaCha20 密碼, 您需要顯式生成 96 位(12 位元組)引數并將其傳遞給:noncenew() nonce_rfc7539 = get_random_bytes(12) cipher = ChaCha20.new(key=key, nonce=nonce_rfc7539)
警告
ChaCha20不保證您解密的資料的真實性! 換句話說,攻擊者可能會操縱傳輸中的資料, 為了防止這種情況,您還必須使用訊息身份驗證 用于驗證密文的代碼(如 HMAC) (加密然后 Mac),或者,您可以使用ChaCha20_Poly1305,
- .class
Crypto.Cipher.ChaCha20.ChaCha20Cipher(鍵,亂數) -
ChaCha20(或XChaCha20)密碼物件, 不要直接創建它,請改用
new(),變數: 亂數 (位元組)– 長度為 8、12 或 24 位元組的亂數 decrypt(密文,輸出=無)-
解密一段資料,
引數: 密文 (位元組/位元組陣列/記憶體視圖)– 要解密的資料,任何大小, 關鍵字引數: 輸出 (位元組/位元組陣列/記憶體視圖)– 明文的位置 被寫到,如果為 ,則回傳明文, None回傳: 如果是,則明文回傳為 , 否則, outputNonebytesNone
encrypt(純文本,輸出 = 無)-
加密一段資料,
引數: 明文 (位元組/位元組陣列/記憶體視圖)– 要加密的資料,任何大小, 關鍵字引數: 輸出 (位元組/位元組陣列/記憶體視圖)– 密文的位置 被寫到,如果為 ,則回傳密文, None回傳: 如果是,則密文回傳為 , 否則, outputNonebytesNone
seek(位置)-
查找密鑰流中的某個位置,
引數: 位置 (整數)– 密鑰流中的絕對位置,以位元組為單位,
Crypto.Cipher.ChaCha20.new(**夸格斯)-
創建新的 ChaCha20 或 XChaCha20 密碼
關鍵字引數: - key (bytes/bytearray/memoryview) – 要使用的密鑰, 它必須為 32 位元組長,
- nonce(bytes/bytearray/memoryview) –
強制值 不得重用于任何其他加密 使用此密鑰完成,
對于 ChaCha20,它必須為 8 或 12 個位元組,
對于 XChaCha20,它必須為 24 位元組長,
如果未提供,將隨機生成 8 個位元組 (您可以在屬性中找到它們),
nonce
回傳: 一個
Crypto.Cipher.ChaCha20.ChaCha20Cipher物件轉載:ChaCha20 和 XChaCha20 — PyCryptodome 3.17.0 檔案
ChaCha20-Poly1305 和 XChaCha20-Poly1305
ChaCha20-Poly1305 是具有關聯資料 (AEAD) 的經過身份驗證的密碼, 它與一個 32 位元組的密鑰和一個亂數一起作業 絕不能在同一密鑰下執行的加密中重復使用, 密碼生成一個 16 位元組標記,接收方必須使用該標記來驗證訊息,
該演算法有三種變體,由亂數的長度定義:
亂數長度 描述 最大明文數 如果隨機亂數和相同的鍵 8 位元組 基于伯恩斯坦的原始ChaCha20, 無限制 最多 200 000 條訊息 12 位元組(默認) 在 TLS 中使用并在 RFC7539 中指定的版本, 256 千兆位元組 最多 130 億條訊息 24 位元組 XChaCha20-Poly1305,仍處于草稿階段, 256 千兆位元組 無限制 密碼的 API 及其有限狀態機與分組密碼的現代操作模式相同,
通過呼叫
Crypto.Cipher.ChaCha20_Poly1305.new()創建新密碼,以下是 ChaCha20-Poly1305(TLS 版本)如何加密和驗證資料的示例: import json from base64 import b64encode from Crypto.Cipher import ChaCha20_Poly1305 from Crypto.Random import get_random_bytes header = b"header" plaintext = b'Attack at dawn' key = get_random_bytes(32) cipher = ChaCha20_Poly1305.new(key=key) cipher.update(header) ciphertext, tag = cipher.encrypt_and_digest(plaintext) jk = [ 'nonce', 'header', 'ciphertext', 'tag' ] jv = [ b64encode(x).decode('utf-8') for x in (cipher.nonce, header, ciphertext, tag) ] result = json.dumps(dict(zip(jk, jv))) print(result) {"nonce": "4EE/9uqhoZ3mQXmm", "header": "aGVhZGVy", "ciphertext": "Wmmo4Vzn+eS3tUPv2a8=", "tag": "/FgVbM8qhzssPRY80T0iVA=="} 在上面的示例中,會自動創建一個 96 位(12 位元組)亂數, 可以將其作為物件中的成員進行訪問,noncecipher 這是您解密資料并檢查其真實性的方式: import json from base64 import b64decode from Crypto.Cipher import ChaCha20_Poly1305 # We assume that the key was securely shared beforehand try: b64 = json.loads(json_input) jk = [ 'nonce', 'header', 'ciphertext', 'tag' ] jv = {k:b64decode(b64[k]) for k in jk} cipher = ChaCha20_Poly1305.new(key=key, nonce=jv['nonce']) cipher.update(jv['header']) plaintext = cipher.decrypt_and_verify(jv['ciphertext'], jv['tag']) print("The message was: " + plaintext) except (ValueError, KeyError): print("Incorrect decryption")
- .class
Crypto.Cipher.ChaCha20_Poly1305.ChaCha20Poly1305Cipher(鍵,亂數)? -
ChaCha20-Poly1305 和 XChaCha20-Poly1305 密碼物件, 不要直接創建它,請改用
new(),變數: 亂數 (位元組字串)– 長度為 8、12 或 24 位元組的亂數 decrypt(密文,輸出=無)?-
解密一段資料,
引數: 密文 (位元組/位元組陣列/記憶體視圖)– 要解密的資料,任何大小, 關鍵字引數: 輸出 (位元組/位元組陣列/記憶體視圖)– 明文的位置 被寫到,如果為 ,則回傳明文, None回傳: 如果是,則明文回傳為 , 否則, outputNonebytesNone
decrypt_and_verify(密文,received_mac_tag)?-
一步執行
decrypt()和verify(),引數: - 密文(位元組/位元組陣列/記憶體視圖)– 要解密的資料片段,
- received_mac_tag(位元組)— 這是從發送方接收的 16 位元組二進制 MAC,
回傳: 解密的資料(作為
bytes)提高: 值錯誤 – 如果 MAC 不匹配,郵件已被篡改 或者密鑰不正確,
digest()?-
計算二進制身份驗證標記 (MAC),
回傳: MAC 標記,作為 16 . bytes
encrypt(純文本,輸出 = 無)?-
加密一段資料,
引數: 明文 (位元組/位元組陣列/記憶體視圖)– 要加密的資料,任何大小, 關鍵字引數: 輸出 (位元組/位元組陣列/記憶體視圖)– 密文的位置 被寫到,如果為 ,則回傳密文, None回傳: 如果是,則密文回傳為 , 否則, outputNonebytesNone
encrypt_and_digest(明文)?-
在一個步驟中執行
encrypt()和digest(),引數: 明文 (位元組/位元組陣列/記憶體視圖)– 要加密的資料,任何大小, 回傳: 包含兩個物件的元組: bytes- 密文,長度與明文相同
- 16 位元組 MAC 標簽
hexdigest()?-
計算可列印的身份驗證標記 (MAC),
此方法類似于
摘要(),回傳: MAC 標記,作為十六進制字串,
hexverify(hex_mac_tag)?-
驗證可列印的身份驗證標記 (MAC),
此方法類似于
verify(),引數: hex_mac_tag (字串)– 這是可列印的 MAC, 提高值錯誤: 如果 MAC 不匹配,郵件已被篡改 或者密鑰不正確,
update(資料)?-
保護關聯的資料,
關聯資料(也稱為其他經過身份驗證的資料 - AAD) 是必須保持清晰的資訊部分,而 仍然允許接收器驗證其完整性, 資料包標頭就是一個例子,
關聯的資料(可能拆分為多個段)為 在呼叫
decrypt() 或encrypt() 之前輸入到update()中, 如果沒有關聯的資料,則不呼叫update(),引數: assoc_data (位元組/位元組陣列/記憶體視圖)– 一段關聯資料,它的大小沒有限制,
verify(received_mac_tag)?-
驗證二進制身份驗證標記 (MAC),
接收方在最后呼叫此方法, 檢查相關資料(如果有)和解密 訊息有效,
引數: received_mac_tag (位元組/位元組陣列/記憶體視圖)– 這是從發送方收到的 16 位元組二進制 MAC, 提高值錯誤: 如果 MAC 不匹配,郵件已被篡改 或者密鑰不正確,
Crypto.Cipher.ChaCha20_Poly1305.new(**夸格斯)?-
創建新的 ChaCha20-Poly1305 或 XChaCha20-Poly1305 AEAD 密碼,
關鍵字引數: - key – 要使用的密鑰,它必須為 32 位元組長,
- 亂數 –
不得重用于任何其他加密的值 使用此密鑰完成,
對于 ChaCha20-Poly1305,它的長度必須為 8 或 12 個位元組,
對于 XChaCha20-Poly1305,它必須為 24 位元組長,
如果未提供,將隨機生成 12 個 (您可以在屬性中找到它們),
bytesnonce
回傳: 一個物件
Crypto.Cipher.ChaCha20.ChaCha20Poly1305Cipher
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/546172.html
標籤:Python
上一篇:專案中多級快取設計實踐總結
