【发布时间】:2013-12-13 10:02:23
【问题描述】:
我正在为 AES-GCM 实施做一个 GHASH。
我需要实现这个
其中v是A的最后一个块的位长,u是C的最后一个块的位长,||表示位串的串联。
如何连接 A 块以填充从 v 到 128 位的零填充,因为我不知道 A 的整个块的长度。 所以我只是把 A 块和一个 128 位的数组异或它
void GHASH(uint8_t H[16], uint8_t len_A, uint8_t A_i[len_A], uint8_t len_C,
uint8_t C_i[len_C], uint8_t X_i[16]) {
uint8_t m;
uint8_t n;
uint8_t i;
uint8_t j;
uint8_t zeros[16] = {0};
if (i == m + n) {
for(j=16; j>=0; j--){
C_i[j] = C_i[j] ^ zeros[j]; //XOR with zero array to fill in 0 of length 128-u
tmp[j] = X_i[j] ^ C_i[j]; // X[m+n+1] XOR C[i] left shift by (128bit-u) and store into tmp
gmul(tmp, H, X_i); //Do Multiplication of tmp to H and store into X
}
}
我很确定我是不正确的。但我不知道该怎么做。
【问题讨论】:
-
1) 请确认
v是否总是8 的倍数。 2)C_i[j] = C_i[j] ^ zeros[j]不会改变C_i[j]。也许你想要C_i[j] = C_i[j] & zeros[j]或者只是C_i[j] = 0。 -
与零异或不会改变值。它什么都不做。传递
uint8_t A_i[len_A]是不合法的,并且不会很好地移植。 -
安妮,我已经给了它一个小赏金,但你能同时回答 chux 吗?
-
我不明白你不明白什么。最终的 A 块可能不完整,因此用零填充。你怎么会不知道A的长度?它是给定的。与 C 类似。上面的
||0公式所说的只是“用零填充到 128 位”。 -
@chux v 并不总是 8 的倍数。它是最后一个 128 位块中的提醒位数。它可以是 0 到 128 位之间的任意数字。
标签: c cryptography aes-gcm