Linux-Kernel
Linux 核心中的非同步和並行算法
在 Linux 核心配置中,我看到了以下選項:
config CRYPTO_PCRYPT tristate "Parallel crypto engine" depends on SMP select PADATA select CRYPTO_MANAGER select CRYPTO_AEAD help This converts an arbitrary crypto algorithm into a parallel algorithm that executes in kernel threads. config CRYPTO_CRYPTD tristate "Software async crypto daemon" select CRYPTO_BLKCIPHER select CRYPTO_HASH select CRYPTO_MANAGER select CRYPTO_WORKQUEUE help This is a generic software asynchronous crypto daemon that converts an arbitrary synchronous software crypto algorithm into an asynchronous algorithm that executes in a kernel thread.
密碼學中的任意算法、非同步算法和並行算法有什麼區別?
- 在同步執行中,您等待任務完成,然後再繼續執行另一個任務。
- 在非同步執行中,您可以在前一個任務完成之前繼續執行另一個任務。
這些術語與密碼學無關。一般來說,密碼算法的教科書描述既不是同步的也不是非同步的,但算法的實現可以是。
考慮例如AES的高級描述:
AES 是一種分組密碼,因此每個 128 位輸入塊都經過以下轉換:
密鑰擴展
初始回合
- 加圓鍵
輪次(根據密鑰大小重複 10、12 或 14 輪)
- 子字節
- 換檔行
- 混合列
- 加圓鍵
最後一輪
- 子字節
- 移位行
- 加圓鍵
根據所使用的密碼模式,塊的加密可以是獨立的也可以是獨立的。例如,在密碼塊連結 (CBC) 模式加密中,前一個塊的密文用於在實際 AES 轉換之前轉換下一個塊的明文。在這種情況下,算法的實現必須是同步的,因為上一步的輸出需要作為下一步的輸入。
另一方面,在電子密碼本(ECB)模式下,每個塊都是單獨加密的。這意味著算法的實現可以像以前一樣是同步的,也可以是非同步的,在這種情況下,即使在前一個塊的 AES 輪次正在進行時,下一個塊的加密也可以開始。
在我們的範例中,執行可以在每個塊的單獨執行執行緒中進行,或者流水線化,即算法被分成多個獨立的部分。例如,下一個塊的初始輪可以在前一個塊的輪重複正在進行時執行。流水線是硬體加密實現中的一種常用技術。
該
cryptd
模組是一個模板,它採用同步軟體加密算法並通過在核心執行緒中執行將其轉換為非同步算法。非同步算法的並發執行可以是交錯的,例如算法在單個 CPU 核心上執行,並在兩個塊上的操作之間來回切換,也可以是並行的,例如算法的執行在多個核心上同時進行,每個核心處理自己的塊。
並行加密模板採用
pcrypt
加密算法並將其轉換為並行處理加密轉換。我認為在這些情況下任意只是指模組的體系結構足夠通用,可以應用於任何加密算法。我相信目前只有AEAD算法受
pcrypt
.