pub fn sm4ks<const BS: u8>(x: u32, k: u32) -> u32
🔬This is a nightly-only experimental API. (
stdsimd
#48556)Available on RISC-V RV64 and target feature
zksed
only.Expand description
加速 SM4 分组密码算法中的密钥调度操作
该指令包含在扩展 Zksed
中。它被定义为:
SM4KS(x, k, BS) = x ⊕ T'(ki)
... where
ki = k.bytes[BS]
T'(ki) = L'(τ(ki))
bi = τ(ki) = SM4-S-Box(ki)
ci = L'(bi) = bi ⊕ (bi ≪ 13) ⊕ (bi ≪ 23)
SM4KS = (ci ≪ (BS * 8)) ⊕ x
其中 ⊕
表示 32 位异或,≪ k
表示左移 k
位。
如上所述,T'
是非线性 S-Box 转换 τ
和替换线性层转换 L'
的组合转换。
在 SM4 算法中,密钥调度定义为:
rk[i] = K[i+4] = K[i] ⊕ T'(K[i+1] ⊕ K[i+2] ⊕ K[i+3] ⊕ CK[i])
... where
K[0..=3] = MK[0..=3] ⊕ FK[0..=3]
T'(K) = L'(τ(K))
B = τ(K) = (SM4-S-Box(k0), SM4-S-Box(k1), SM4-S-Box(k2), SM4-S-Box(k3))
C = L'(B) = B ⊕ (B ≪ 13) ⊕ (B ≪ 23)
其中 MK
表示 128 位加密密钥,常量 FK
和 CK
是由 SM4 算法定义的固定系统配置特性值。
因此,按键调度操作可以通过 sm4ks
指令来实现,例如:
let k = k1 ^ k2 ^ k3 ^ ck_i;
let c0 = sm4ks::<0>(k0, k);
let c1 = sm4ks::<1>(c0, k); // c1 代表 c[0..=1],等。
let c2 = sm4ks::<2>(c1, k);
let c3 = sm4ks::<3>(c2, k);
return c3; // c3 代表 c[0..=3]
Run根据 RISC-V Cryptography Extensions, Volume I,该指令的执行延迟必须始终独立于它所操作的数据。