上一篇中,主要介绍了 Message Integrity消息完整性,以及一些校验消息完整性的算法,比如MAC、HMAC、NMAC、CMAC、Wegman-Carter MAC。
现在Wegman-Carter MAC 在量子通信领域有较多的应用。
相比于传统通信,量子通信最大的优势在于量子密钥分发替换了传统密钥协商或预共享的密钥确立机制。Wegman-Carter认证甚至是NIST推荐的信息块CWC认证加密模式,可以发挥量子通信的这一巨大优势。
Wegman-Carter认证可运用于量子密钥分发设备间的设备认证 ,该认证的核心思想是基于一次一密的无条件安全的思想。在Wegman-Carter认证中,通过使用强泛hash函数族(Strongly Universal2 Hash Families)以及不停更新密钥来保证其无条件安全性。认证过程首先从泛hash函数族选取hash函数h去处理信息M并压缩至一个长度更短的比特串,然后对该比特串进行加密处理并最终生成认证tag。通过量子密钥的安全分发结合一次一密的不可破译思想,,提供无条件安全的保密通信。
现主要将 Wegman-Carter MAC 算法用C语言实现。
主要包含两个接口;
/********************************************************************************/
/* 函数功能:获取Wegman_Carter认证所需要的密钥长度 */
/* 函数输入:Tag_len,message_len */
/* 函数输出:函数返回Wegman_Carter认证所需要的密钥长度 */
/********************************************************************************/
unsigned int Get_Wegman_Carter_Key_Length(unsigned int Tag_len, unsigned int message_len);
/********************************************************************************/
/* 函数功能:计算Wegman_Carter认证Tag值 */
/* 函数输入:Tag_len,message,message_len,key,key_len */
/* 函数输出:Tag,函数返回值为0表示成功,1则表示提供的密钥长度不够 */
/********************************************************************************/
int Wegman_Carter_Authentication(unsigned char* Tag, unsigned int Tag_len, unsigned char* message, unsigned int message_len, unsigned char* key, unsigned int key_len);
主要函数:
void Bignum_Mul_Add(unsigned int *Z, unsigned int *A, unsigned int *B, unsigned int *C)
{
unsigned i,j,limit = TWO_S_len; // size of result in words
for(i=0;i<limit;i++)
{
Z[i] = C[i];
Z[limit+i] = 0;
}
for(i=0;i<limit;i++)
{
unsigned m = A[i];
unsigned c = 0; // carry
unsigned min = i+limit;
for ( j=i; j<min; j++ )
{
// This is the critical loop
// Machine dependent code could help here
unsigned w, w0, w1, v = Z[j], p = B[j-i];
v += c; c = ( v < c );
w = lo(p)*lo(m); v += w; c += ( v < w );
w0 = lo(p)*hi(m); w1 = w0 + hi(p)*lo(m); w = lh(w1); v += w;
c += hi(p) * hi(m) + hi(w1) + lh( w1 < w0 ) + ( v < w );
Z[j] = v;
}
Z[j] += c;
}
unsigned c = 0; // carry
unsigned int* Z1 = Z + limit;
for(i=0;i<limit;i++)
{
unsigned w, v = Z[i], p = Z1[i];
v += c; c = ( v < c );
w = lo(p)*Prime_complement; v += w; c += ( v < w );
w = hi(p)*Prime_complement; c += hi(w); w = lh(w); v += w; c += ( v < w );
Z[i] = v;
}
j = 0;
c *= Prime_complement;
while ( c )
{
Z[j] += c;
c = Z[j] < c;
j++;
}
}