近期对我们LTE空口项目中增加了ZUC 祖冲之算法的加密和完整性保护。当然是从官方网站找到了算法协议标准和源代码以及测试数据样本。
但是移植过程中发现一些问题,这里我把自己走过的弯路分享出来!
Note:下文中提到的 identifier "z","L"均来自算法官方源代码的上下文,这里不作详细说明。
1. EEA算法过程,官方代码没有错误,但是在小端平台不兼容,因此要适配改善。加密最后用Keystream对plainText进行异或加密时,
由于z[i]是大端存储的码流,而plainText本来是unsigned char 类型的码流,但转换为unsigned int类型的M[1]后,无疑就会在小端平台发生大小端颠倒的问题
因此我们应该作一个小的改动,在源代码的EEA3函数最后的for循环里,在C[i] = M[i] ^ z[i]前面增加一行代码:z[i] = ntohl(z[i]);
或者我们采用以字节为最小单位来进行异或操作,change the EEA3()'s parameter "u32 *M" into "u8 *M" type. 如下改进后的for循环(另增加一个switch语句):
u32 tempLen = LENGTH&0xFFFFFFFC;
u32 zIndex = 0;
for(i = 0; i<tempLen; i+=4)
{
zIndex = i/4;
M[i] ^= z[zIndex]>>24;
M[i+1] ^= z[zIndex]>>16;
M[i+2] ^= z[zIndex]>>8;
M[i+3] ^= z[zIndex];
}
switch(LENGHTH)&0x03
{
case 3:
M[i+2] ^= z[zIndex+1]>>8;
case 2:
M[i+1] ^= z[zIndex+1]>>16;
case 1:
M[i] ^= z[zIndex+1]>>24;
default:
break;
}
2. 官方源代码的EIA3也是有问题的,这里并没有说明,我在广州,要么可以请我吃个饭,要么可以让公司花点钱,我去技术顾问下,解决下你们问题。哈哈哈~
如有商务合作需要,欢迎联系我QQ:287042313