【发布时间】:2012-05-26 04:04:00
【问题描述】:
我在 GCM SP-800-38D 文档here 中为块乘法(算法 1)提供了一个 C 代码。第 11-12 页。
完成代码后,我想看看是否有任何方法可以测试代码。您可以在我提供的代码下方找到附件。请注意,我使用 24 位块代替了 128 位块,仅用于测试目的。如有必要,我将不胜感激。
void BLK_MUL (u8 *val_1,u8 *val_2, u8 *out_val)
{
u8 xdata R_val = 0xE1;
u8 xdata Z_val[3],V_val[3];
u8 mask_b = 0x80;
u16 i; u8 j;
bit rnd;
for(j=0;j<3;j++,++val_2)
{
Z_val[j]=0x00;
V_val[j]=*val_2;
}
for(i=0;i<24;i++)
{
if (*val_1 & mask_b)
{
for(j=0;j<3;j++)
Z_val[j]^=V_val[j];
}
if (!(V_val[2] & 0x01))
{//if LSB of V_val is 0
for(j=0;j<3;j++)
{ //V_val = rightshift(V_val)
if (j!=0)
if (V_val[2-j] & 0x01)
V_val[3-j] |= 0x80;
V_val[2-j]>>=1;
}
}
else
{//if LSB of V_val is 1
for(j=0;j<3;j++)
{//V_val = rightshift(V_val)
if (j!=0)
if (V_val[2-j] & 0x01)
V_val[3-j] |= 0x80;
V_val[2-j]>>=1;
}
V_val[0]^=R_val; //V_val = rightshift(V_val) ^ R
}
if(mask_b & 0x01) { val_1++; rnd=1;}
mask_b >>= 1;
if (rnd) { mask_b=0x80; rnd=0; }
}
STR_CPY(out_val,Z_val,3);
return ;
}
void main()
{
code unsigned char val_1[3] ={ 0x2b,0x7e,0x15 };
code unsigned char val_2[3] ={ 0x39,0x25,0x84 };
unsigned char out[3];
BLK_MUL (val_1,val_2,out);
return;
}
【问题讨论】:
-
在
if (!(V_val[2] & 0x01))子句和它的else子句中有相同的for 循环。这有充分的理由吗? -
@WilliamMorris 我在上面的代码中添加了一些 cmets(请检查)。我只是简单地遵循了代码步骤。有更好的选择吗? :)
-
是的,但重复仍然是多余的。我在下面添加了一些代码审查 cmets 作为答案
-
这段代码是否计算 GF(2^{128}) 乘法?
标签: encryption cryptography multiplication aes-gcm galois-field