我正在学习密码学,我在Wikipedia上看到了以下声明:
这些键可能是相同的,或者可能在两个键之间进行简单的转换。
当需要对密钥进行转换时,密钥如何对称?更准确地说,“对称”不是意味着“相同”吗?
在对称密钥加密中,通常在两个方向(加密和解密)上使用相同的密钥。它是对称的,因为解密是通过反转加密操作的内部顺序来执行的。您提供的密钥的不同部分可能由算法在内部生成和使用(就像 AES 中的情况一样) - 但显然这在本质上不会完全随机,因为加密和解密过程必须反转效果另一个,因为这仍然是对称密钥加密. 正如您可能知道的那样,许多加密方法在内部都有多个轮次 - 通常对于每个这样的轮次,都会从您提供的密钥生成一个子密钥或轮次密钥。生成轮/子密钥的过程在密码学中称为密钥调度算法,标准 AES 使用Rijndael 密钥调度算法。
因此,您提供给加密和解密例程的密钥会发生在那里描述的转换。但是,您提供的密钥仍然是相同的(这就是重点),并且操作都将“相同”但相反。
在crypto.stackoverflow.com上有一个问题,询问 AES-128(具有 128 位密钥的 AES)、AES-196(196 位密钥)和 AES-256(256 位密钥)有何不同。您会发现 Paŭlo Ebermann 的答案有助于进一步了解原始密钥如何转换为轮/子密钥。从那里引用他的回答:
k_0 k_1 k_2 k_3 ─→┃f_1┃─╮
│ │ │ │ ┗━━━┛ │
╭──│──────│──────│──────│──────────╯
│ ↓ ↓ ↓ ↓
╰─→⊕ ╭─→⊕ ╭─→⊕ ╭─→⊕
│ │ │ │ │ │ │
↓ │ ↓ │ ↓ │ ↓ ┏━━━┓
k_4 ─╯ k_5 ─╯ k_6 ─╯ k_7 ─→┃f_2┃─╮
│ │ │ │ ┗━━━┛ │
╭──│──────│──────│──────│──────────╯
│ ↓ ↓ ↓ ↓
╰─→⊕ ╭─→⊕ ╭─→⊕ ╭─→⊕
│ │ │ │ │ │ │
↓ │ ↓ │ ↓ │ ↓ ┏━━━┓
k_8 ─╯ k_9 ─╯ k_10 ╯ k_11 ─→┃f_3┃─╮
│ │ │ │ ┗━━━┛ │
╭──│──────│──────│──────│───────────╯
│ ↓ ↓ ↓ ↓
.......................................
│ ↓ ↓ ↓ ↓
╰─→⊕ ╭─→⊕ ╭─→⊕ ╭─→⊕
│ │ │ │ │ │ │
↓ │ ↓ │ ↓ │ ↓
k_40 ╯ k_41 ╯ k_42 ╯ k_43
密钥扩展的工作方式是 ki 仅直接取决于 ki-1 和 ki-Nk(其中 Nk 是密钥中的列数,即 AES-128 为 4)。在大多数情况下,它是一个简单的 ⊕,但在每个 Nk 个键列之后,应用一个非线性函数 fi....函数 fi 是从 AES S-box 构建的非线性函数(分别应用于每个字节),a旋转一个字节,以及一个取决于 i 的具有舍入常数的 XOR(这是 GF(28) 中对应于 xi-1 的元素,但标准中也有一个表格)。然后密钥选择算法简单地将 k0…k3 作为第一轮密钥,k4…k7 作为第二轮密钥,直到 k40…k43 作为最后一个。
Martin Dinov 很好地解释了使用密钥调度派生子密钥的方法。但是在某些算法中甚至可能不存在子键。即使这样,子密钥对于加密和解密都是对称的,那么不对称在哪里呢?
更有可能的是,维基百科暗示密钥派生。这在许多加密协议中使用,例如许多旅行卡。大多数当前的旅行卡是每张卡包含(一组)对称密钥的存储卡。这些密钥是通过使用唯一标识符(通常是 MIFARE 或 DESFire 等非接触式芯片的 UID)和主密钥执行密钥导出机制而导出的。因此卡终端拥有主密钥,读取 UID 并计算卡特定密钥以获得读或写访问权限。
因此,即使卡和终端在开始安全通信之前具有不同的密钥,卡密钥——然后可能还有会话密钥——是由终端通过密钥导出机制导出的。会话密钥(用于保护传输协议的密钥)有时在高端芯片上使用某种经过身份验证的密钥协商协议(例如 Diffie Hellman)进行计算。