Linux 内核中的异步和并行算法

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.

密码学中的任意算法、异步算法和并行算法有什么区别?

答案1

  • 同步执行时,您需要等待任务完成,然后再继续执行另一个任务。
  • 异步执行时,您可以在前一个任务完成之前继续执行另一个任务。

这些术语与密码学没有具体关系。一般来说,密码算法的教科书描述既不是同步也不是异步,而是实施算法的可以是其中之一。

例如,考虑以下的高级描述AES:

AES 是一种分组密码,因此每个 128 位输入块都会经历以下转换:

  • 按键扩展
  • 初始回合
    • 添加轮密钥
  • 轮数(10、12 或 14 轮重复,具体取决于密钥大小)
    • 子字节
    • 行移
    • 混合列
    • 添加轮密钥
  • 最后一轮
    • 子字节
    • 行移
    • 添加轮密钥

取决于密码模式使用时,块的加密可以是相关的或独立的。例如,在密码块链接 (CBC) 模式加密中,前一个块的密文用于在实际 AES 转换之前转换下一个块的明文。在这种情况下,算法的实现必须是同步的,因为需要上一步的输出作为下一步的输入。

另一方面,在电子密码本(ECB)模式下,每个块都是单独加密的。这意味着算法的实现可以像以前一样是同步的,也可以是异步的,在这种情况下,即使前一个块的 AES 轮正在进行,下一个块的加密也可以开始。

在我们的示例中,执行可以单独进行执行线程对于每个块,或者流水线式的,即算法被分成多个独立的部分。例如,可以在前一个块的循环重复正在进行的同时执行下一个块的初始循环。流水线是硬件加密实现中的常用技术。

cryptd模块是一个模板,它采用同步软件加密算法,并通过在内核线程中执行将其转换为异步算法。

同时异步算法的执行可以是交错的,例如算法在单个CPU核心上执行,并在两个块上的操作之间来回切换,或者平行线,例如算法的执行在多个核心上同时进行,每个核心处理自己的块。

pcrypt并行加密模板采用加密算法并将其转换以并行处理加密转换。

我觉得随意的在这些情况下仅指模块的体系结构足够通用,可以应用于任何密码算法。我相信只是暂时AEAD算法由pcrypt.

相关内容