背景技术
随着诸如经由互联网交易的智能卡和商务的项目使用的增加,加密和解密数据的需要从未比现在更加重要。事实上,美国政府特别地通过国家标准技术研究所(National Institute of Standards andTechnology,NIST)多年来已选择了加密标准,诸如于1976年选作美国标准的DES(Data Encryption Standards数据加密标准),并且Triple DES(三重DES)随后变成标准。近些年来,NIST一直在评估多种AES算法,以选择将成为美国官方加密标准的新标准(AES)。JoanDaemen和Vincent Rijmen提出了一种已被NIST认可的密码算法,并于2001年11月26日公开,题为Federal Information ProcessingStandards Publication No.197(联邦信息处理标准公布第197号)(以下称之为“FIPS’197”)。FIPS’197中的算法被称为Rijndael算法。
AES使用128、192和256比特的三个系统,以改善现有技术的56比特加密的性能、灵活性和效率,从而提供更容易的方式来实施。
用于AES算法中处理的基本单元是字节。在内部,对称为STATE的二维阵列字节执行AES算法的操作。STATE通常具有4行字节,其每行包含Nb个字节,其中Nb是被32除的块长。
加密把数据转换为称为密文的难以理解的形式。密文的解密把称之为“明文”的数据转换成其原始形式。本领域的通用术语把明文转换为密文的系列变换称为“加密(Cipher)”,而把密文转换到明文的系列变换称为“逆加密(Inverse Cipher)”。在加密和逆加密中,密码本(这是由扩展密钥例程使用的机密密钥)生成在加密和逆加密例程中应用于STATE的一系列值(称为圈密钥)。
AES算法的输入和输出均由128比特(具有0或1值的数字)序列构成。这些序列有时将被称为块,并且将它们含有的比特数量称之为其长度。
图1示出了STATE阵列输入和输出的一个实例。在加密和逆加密开始时,输入阵列的字节(in0-in15)被拷贝到如图1所示的STATE。然后,对这个STATE阵列进行加密或逆加密操作,此后把其最终值拷贝到输出字节out0-out15的阵列。
就图1而言,如NIST的“FIPS 197”所披露的,在加密和逆加解密开始时,输入(这是字节in0-in15的阵列)被拷贝到所示的STATE阵列。然后,对该STATE阵列进行加密或逆加密操作,此后把其最终值复制到输出,这表示为范围从out0-out15的字节阵列。通过在二个元素的多项式中“增加”用于相应幂的系数,实现有限域中二个元素的加法。利用布尔异或(XOR)运算执行加法(“FIPS’197”,NIST,p.10)。
以下示出的是用于相加两个字节的二进制记数法实例:
{01010111}⊕{1000011)={11010100} 式(1.0)
密码本是机密密钥,由密钥扩展算法用于生成一组圈密钥;它可以被描述为具有4行和Nk列的矩形字节阵列(“FIPS’197”,NIST,第6页)。
圈密钥是利用密钥表(key schedule)从密码本中导出的值。密钥表包括两种组分:密钥扩展和圈密钥选择(“Rijndael密码块”,Daemen和Rijmen,第14页)。AES使用利用密码本的算法,并通过执行密钥扩展例程来生成密钥表。
圈密钥在加密和逆加密变换中应用于STATE。圈密钥的长度等于STATE的尺寸,并且利用XOR运算把圈密钥加到STATE上。
这里我们所关心的是:减少支持密钥扩展所需的存储器的尺寸。当前教导提供了硬件实施,其中扩展密码本以支持三种密钥长度:128,192或256比特。计算的数量取决于密钥比特(KeyBit)和块比特。对于128长度密钥,需要10次计算。对于192长度密钥,需要12次计算。对于最大的当前密钥长度(256),需要14次计算。因而,所需要的密钥的最大数量是14。
原始AES软件实施对于最大数量的密钥(14)使用存储器。在硬件中,该存储器需要14×128比特存储单元。在CMOS 18中这个特性的实施使用大约10,000个门。
具体实施方式
在以下说明中,为了解释而不是限制的目的,描述了诸如特定结构、接口、技术等的细节,以提供对本发明的彻底理解。然而,本领域熟练技术人员将会明白,离开这些具体细节,也可以在其它实施例中实现本发明。此外,为了清楚起见,公知装置、电路和方法的详细说明予以省略,以免不必要的细节模糊了本发明的描述。
图2示出了可以安排根据本发明设备的一种方法。本领域熟练技术人员将会明白,所示的物理布局用于解释目的,并且例如,密钥扩展模块和密钥表可以合并,并且存储器可以是任何模块的一部分或是一个分离区域。
密钥表单元201具有由密钥扩展模块215扩展的密钥值。这些值可以存储在存储器202中。转换单元208加密/解密用于某个预定数量圈的明文/密文之一,并且在密钥扩展单元提供密钥扩展的同时,块循环(block round)单元212执行圈密钥处理。最好,对于每个相应的密钥,同步密钥扩展功能和圈密钥处理,以便同时(大致并行)执行这些操作。
根据本发明,通过利用更少数量的存储空间实施密钥扩展算法,使用密钥时的定时变成为重要因素。例如,在加密模式期间,必须在处理开始之前计算一个密钥。在利用圈密钥算法正在处理数据的同时,可以并行计算第二密钥。如果仅需要单一加密模式,则单一存储空间将足够了。
由于首先使用密钥14,所以对于解密,任务多少变得更困难。必须根据其它13个密钥来计算密钥14。仍然能够使用与圈密钥处理并行计算密钥的同一想法。如果仔细计划把密钥写入存储器的顺序,则可以仅利用7个存储空间和非常小的附加控制逻辑来支持加密和解密。
还必须相对于圈密钥处理仔细地规划计算密钥的速率。通过同步并行进行密钥计算和圈密钥处理,实现本发明的优点。
256密钥长度需要最大存储器,所以该长度将用来说明新的机制。以下是根据Rijndael(Rijndael-alg-ref.c版本2.0,Barrato和Rijmen)的C代码记数法中给出的传统算法:
Int rijndaelKeySched(word9k[4][MAXKC],intkeyBits,int blockBits,word8
W[MAXROUNDS+1][4][MAXABC])}
/*计算需要的圈密钥
*计算次数依赖于密钥比特和块比特
*/
int KC,BC,ROUNDS;
int I,j,t,rconpointer=0;
word8tk[4][MAXKC]
switch(keyBits0{
case 128:KC=4;break;
case 192:KC=6;break;
case 256:KC=8;break;
default:return(-1);
}
switch(blockBits){
case 128:BC=4;break;
case 192:BC=6;break;
case 256:BC=8;break;
default:return(-2);
}
switch(keyBits>=blockBits?keyBits:blockbits){
case 128:ROUNDS=10;break;
case 192:ROUNDS=12;break;
case 256:ROUNDS=14;break;
default:return(-3);/*这不可能发生*/
}
for(j=0;j<KC;j++)
for(i=0;i<4;i++)
tk[i][j]=1[i][j];
t=0;
/*把值复制到圈密钥阵列中*/
for(j=0;(j<KC)&&(t<(ROUNDS+1)*BC);j++,t++)
for(I=0;i<4;i++)W[t/BC][i][t%BC]=tk[i][j];
while(t<(ROUNDS+1)*BC){/*没有足够圈密钥材料
被计算*/
/*计算新值*/
for(I=0;I<4;i++)
tk[i][0]^=S[tk[(i+1)%4][KC-1];
tk[0][0]^=rcon[rconpointer++];
if(KC!=8)
for(j=1;j<KC;j++)
for(i=0;i<4;i++)tk[i][j]^=tk[i][j-1];
else{
for(j=1;j<KC/2;j++)
for(i=0;i<4;i++)tk[i][j]^=tk[i][j-1]
for(i=0;i<4;i++)tk[i][KC/2]^=S[tk[i][KC/2-1]];
for(j=KC/2+1;j<KC;j++)
for(i=0;i<4;i++)tk[i][j]^=tk[i][j-1];
}
/*把值复制到圈密钥阵列中*/
for(j=0;(j<KC)&&(t<ROUNDS+1)*BC);j++,t++)
for(i=0;I<4;i++)W[t/BC][i][t%BC]=tk[i][j];
}
return 0;
}
注意,对于硬件实施,必须分配最大存储量用于14个密钥,以实现上述代码(case 256:ROUNDS=14;break;)。
也注意,在圈密钥的处理开始并且不允许并行激活之前,进行这个传统扩展算法。
与上述相反,本发明使用实现与圈密钥处理同步的正常的和逆密钥扩展的电路。
考虑加密(正常)扩展,给出的实例将是密钥长度256,因为它需要最大存储单元。这遵循:其它两种情况(128和192密钥长度)也起作用,因为需要较少的扩展密钥。这在逻辑上还遵循:如果曾使用大于256的密钥长度,则本发明在减少所需存储器方面仍然是有效的。
根据本发明的一个方面,用于并行扩展密钥和使密钥成圈的算法如下:
Expand-Key_Number=14
For k=1 to Expand_Key_Number
{
if(k<8)n=k elsen=k-7
扩展密钥k并存储到位置n
读出位置并进行圈密钥算法,扩展密钥k并存储到位置n+1
}
为了解密(逆)扩展,必须首先计算所有14个密钥。以递减顺序执行用于第一7个密钥的计算,并且然后丢弃。其后的7个密钥以递升位置顺序进行扩展。在以递减顺序读出最后7个密钥时,以递减顺序再扩展第一7个密钥。一旦从位置1读出密钥8,则扩展密钥7并放在位置1中。然后,以递升位置顺序读出密钥7-1。该算法如下:
Expand_Key_Number=14
For k=1 to Expand_Key_Number
{
if(k<8)n=8-k else n=k-7
扩展密钥k并存储到位置n
}
For k=Expand_Key_Number to 1
{
if(k<8)n=8-k else n=k-7
读取位置n并进行圈密钥算法,扩展密钥8-n并存储到位置n
}.
最后,图3示出了解释可以执行本发明的一种方式的方法步骤。在步骤305,提供用于密码本的密钥表单元201,所述密钥表单元201提供预定数量的扩展密钥值,并且所述密钥表单元201具有存储器202。
步骤310包括提供与密钥表单元201通信的转换模块208,该转换模块将明文/密文的块转换成第一多个列中预定数量的字节单元。
步骤315包括提供用于处理圈密钥的块循环单元212,用于把预定数量的字节单元加密/解密成密文/明文;和
步骤320包括提供密钥扩展模块215,用于对正常(加密)和逆(解密)功能执行密钥扩展,以获得扩展的密钥值;
其中,在步骤320上扩展密钥值的速率与在步骤315利用块循环单元235的圈密钥处理同步,以便与正被处理的相应圈密钥并行地扩展每个相应密钥值。
因此,存储扩展密钥值所需的存储器202中的存储空间的数量不大于扩展密钥值的数量的一半。
通过检查以两种方式实施的AES提案(NIST,2001年11月26日)所建议的设计;具有14个存储空间的128、192和256密钥长度和具有存储空间一半的第二设计,并相对于圈密钥处理利用仔细的重新计算,本发明显示出:新算法将所需空间降低一半。
本领域熟练技术人员将会明白,具有可以进行的各种修改而不背离本发明的精神或所附权利要求的范围。例如,使用的公用逻辑的比特数量、设备的模块和子模块的布局、转换的数据块的数量、输入和输出模块全都可以根据需要进行修改。由于本发明能够供安全连网处理器、安全键盘装置、磁卡读取装置、智能卡读取装置和无线通信应用诸如802.11装置使用,因此数据的接收或输出都可以被包含在公共电路内,或者经由RF、光纤、微波等进行发射。在这种情况下,除了各种类型传输的协议转换之外,还包括传送和接收能力。此外,尽管实例显示8字节(128比特),但是可以根据需要增加或减少这个量,和/或在AES协议中进行改变。还应当注意,诸如“明文”和“密文”的术语是本技术领域的术语,并且加密/解密可以包含图画、照片、插图、简图,包括话音、视频和/或多媒体数据。
例如,密钥扩展模块为了说明目的而被显示为与密钥表分离的分离单元,并且密钥表中所示的存储器可以是公共存储器,或者被安排和/或把所有组成部件可以被安排在公共电路卡上。尽管128、192和256长度密钥块被用于示例,但是可以使用任何长度密钥块,较大或者较小的密钥块,而不背离本发明的精神和所附权利要求的范围。