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

Dev*_*son 4 cryptography linux-kernel

在 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.
Run Code Online (Sandbox Code Playgroud)

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

Tho*_*man 6

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

这些术语与密码学没有特别的关系。通常,密码算法教科书描述既不同步不同步,但是实施方式的算法的可以是。

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

AES 是块密码,因此每个 128 位输入块都经过以下转换:

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

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

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

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

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

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

pcrypt并行加密模板需要一个加密算法并将其转换为并行处理加密变换。

我认为在这些情况下的任意性仅指模块的架构足够通用以适用于任何密码算法。我相信目前仅支持AEAD算法pcrypt