专利名称:列混合函数的小型硬件实现的制作方法
技术领域:
本发明涉及执行加密地方法和装置。本发明尤其涉及,当列混合函数在不同的加密方法中起作用时,在列混合函数方面的改进,所述不同的加密方法是诸如高级加密标准(AES)之类的加密方法。
背景技术:
随着诸如智能卡和因特网上交易的贸易之类的项目使用的不断增加,当前对加密和解密数据的需要变得比任何时候都要迫切。实际上,特别是通过美国国家标准技术研究所(NIST),美国政府已经选择加密标准许多年了,比如在1976年选作美国标准的DES(数据加密标准),以及后来成为标准的三重DES。近年来,为了在作为官方加密标准的AES下选择新的标准,NIST已经评估了多种AES算法。Joan Daemen和Vincent Rijmen提出了一种加密算法,这种加密算法已经被NIST批准,并且在2001年11月26日公布。这种算法被称为Rijndael算法。AES使用128、192和256位的三种系统,以便改进现有技术的56位加密的性能、灵活性、效率,并提供一种更易于实现的方式。
在AES算法中处理的基本单位是字节。在内部,AES算法的运算是在称为STATE的两维字节阵列上执行。STATE通常有四行字节,每行包含Nb字节,其中Nb是除以32的块长度。
加密是将数据转换成难以理解的形式,该形式叫作密文。而解密密文是将数据转换成该数据的原始形式,该数据被称为明文。本领域的通用术语将明文转换成密文的一系列变换称为“加密(cipher)”,反之将密文转换成明文的一系列变换称为“逆加密(inversecipher)”。在加密和逆加密中,加密密钥(cipher key)生成一系列值(叫作轮密钥(round keys)),在加密和逆加密例行程序中将这些值应用于STATE,所述加密密钥是为扩展密钥例行程序所使用的秘密的密钥。
AES算法的输入和输出均由128位(具有值为0或1的数字)的序列构成。有时将这些序列称为块,而将这些序列所包含的位数称为它们的长度。
AES将列混合(Mixcloumn)变换连同一些其它的变换一起用来解密(译码)和加密(编码)信息。密码中的列混合(Mixcloumn)采用STATE的所有列,并将它们的数据混合(彼此独立)来产生新的列。逆列混合(InvMixColumn)是为列混合(MixColumn)的逆的逆加密变换。
图1举例说明了STATE阵列输入和输出的例子。在加密和逆加密开始时,将输入阵列字节(in0至in15)复制到STATE中,如图1所示。接着在该STATE阵列上执行加密或逆加密,之后将其最后值复制到输出字节out0至out15的阵列。
在现有技术中,硬件实现是这样的,即逆加密只能部分地重复使用执行加密的电路。因此需要一种方法和装置,其中单个电路执行常规和逆列混合(MixColumn)算法,减少所需要的总的门数量,进而减小了总的电路的尺寸。
发明内容
本发明提供共享用于列混合(MixColumn)函数和逆列混合(InverseMixColumn)函数的大多数电路,结果减少了门数量。针对高速连网处理器和智能卡应用,提供了更小的门尺寸和高的数据速率。本发明所提供的门尺寸小得足以在不用明显增加小片(die)尺寸的情况下利用并行处理,因为增加小片(die)尺寸将更多地增加设备的成本和功耗。在本发明中,最大的路径延迟并不明显地比现有技术的设备长,从而允许显著更小型的电路设计。本发明实现了迄今为止本领域未知的函数(被发明人称为“MixColumnAll”),并且以非常小的加倍逻辑执行列混合(MixColumn)和逆列混合(InvMixColumn)变换。
本发明还包括用于执行MixColumnAll函数的方法,以及执行作为加密/解密过程的部分的MixColumnAll函数的计算机程序。
结合附图,从下列详细描述中,本发明的上述和其它特征和优点将变得更加明显,其中
图1举例说明了STATE阵列及其输入和输出字节。
图2举例说明了能够设置根据本发明的装置的一种方式。
图3是概观根据本发明的方法的流程图。
具体实施例方式
在下列描述中,为了说明而不是限制,为了提供对本发明的全面了解,阐述了诸如特别结构、接口、技术等等之类的特别细节。然而,显而易见的是,本领域普通技术人员可以在偏离这些特定细节的其它实施例中实践。此外,为了清楚起见,省略了对公知设备、电路和方法的详细描述,以免这些不必要的细节模糊了对本发明的说明。
关于图1,正如NIST在“FIPS 197”中公开的一样,在开始加密和逆加密时,如所示的将所述输入(in0至in15字节阵列)复制到STATE阵列中。接着在该STATE阵列上执行加密和逆加密运算,之后将其最后值复制到输出,该输出被示为从out0变化到out15的字节阵列。在有限的字段中添加两个元素是通过在多项式中为两个元素“加入”相应幂(power)的系数实现的。使用布尔异或(XOR)运算执行相加(“FIPS197”,NIST,第10页)。下列所示是将两个字节相加的二进制符号的例子
{01010111}{1000011}={11010100} 公式(1.0)
在多项式表达式中,在GF(28)中的乘法相当于对不可约的8次多项式取模的多项式的乘法。如果它唯一的因子是一或者是它本身,则该多项式不可约。对于AES算法,该不可约多项式是
M<x>=x8+x4+x3+x+1 公式(1.1)
每个对角线元素都等于1的对角线矩阵称作单位矩阵。单位矩阵被表示成
公式(1.2)
如果A和B是n×n矩阵,如果
AB=BA=In (1.3)
则认为每个都是另一个的逆。
MIXCOLUMN()变换在State上逐列地运算,将每列视为四项多项式。将这些列认作是GF(28)上的多项式,并将对x4+1的模与固定多项式a(x)相乘,正如由FIPS、NIST在17页所公开的一样
A(x)={03}x3+{01}x2+{01}x+{02};
这可以写成如下所示的矩阵乘法
该乘法运算的结果,一列中的四个字节由下列代替
s(0,c)=({02}·s(0,c))({03}· s(1,c))s(2,c)s(3,c)
s(1,c)=s(0,c)({02}·s(1,c))({03}·s(2,c)s(3,c)
s(2,c)=s(0,c)s(1,c)({02}·s(2,c)({03}·s(3,c))
s(3,c)=({03}·s(0,c))s(1,c)s(2,c)({02}·s(3,c))
等式(1.5)
列混合(Mixcolumn)的逆与常规的列混合(Mixcolumn)相似。将每一列乘以特定的相乘多项式d(x)来对它进行变换,除以下式
D(x)={0B}x3+{0D}x2+{09}x+{09} 等式(1.6)
等式(1.6)是出自“The Rijndael Cipher Block”(Daemen和Rijmen,第13页)。
本发明使用一种电路,这种电路实现了常规和逆变换,结果缩小了列混合(Mixcolumn)变换的组合逻辑实现。与现有技术的分离的列混合(Mixcolumn)和逆列混合(InvMixColumn)变换相比,这种实现的总的门数量较小,带有稍微长一点的最大延迟路径。
实现现有技术的列混合(InvMixColumn)的C编码由Daemen和Rijmen如下给出
Void MixColumn(word8 a[4][MAXBC],word8 BC){ /*以线性方式混合每一列的四个字节*/ word8 b[4][MAXABC]; int I,j; for(j=0;j<BC’j++) for(i=0;i<4;i++) b[i][j]=mul(2,a[i][j]) ^mul(3,a[(I+1)%4][j]) ^a[(I+2)%4][j]<!-- SIPO <DP n="4"> --><dp n="d4"/> ^a[(I+3)%4][j]; for(i=0;i<4;i++) for(j=0;j<BC;j++)a[i][j]=b[i][j];
注意,函数mul是GF(28)乘法。
此外,实现现有技术的逆列混合(Inverse MixColumn)的C编码由Daemen和Rijmen如下给出
void InvMixColumn(word8 a[4][MAXABC],word8 BC){ /*以线性方式混合每一列的四个字节 /*这是MixColumn的逆运算*/ word8 b[4][MAXABC]; int I,j; for(j=0;j<BC’j++) for(i=0;I<4;i++) b[i][j]=mul(0xe,a[i][j]) ^mul(0xb,a[(i+1)%4][j]) ^mul(0xd,a[(i+2)%4][j]) ^mul(0x9,a[(i+3)%4][j]); for(I=0;I<4;i++) for(j=0;j<BC;j++)a[i][j]=b[i][j]’
如果MixColumn变换如Daemen和Rijmen所建议的以AND和XOR门来实现,电路等式看起来如下
MixColumn变换等式
经过布尔减化之后,一个字节的等式是
位7=b2[7]^b3[7]^b1[7]^b1[6]^b0[6]
位6=b3[6]^b2[6]^b1[5]^b1[6]^b0[5]
位5=b3[5]^b2[5]^b1[4]^b1[5]^b0[4]
位4=b3[4]^b2[4]^b1[3]^b1[4]^b0[3]^b1[7]^b0[7]
位3=b3[3]^b2[3]^b1[2]^b1[3]^b0[2]^b0[7]^b1[7]
位2=b3[2]^b2[2]^b1[1]^b1[2]^b0[1]^b0[7]
位1=b3[1]^b2[1]^b1
^b1[1]^b0
^b1[7]
位0=b3
^b2
^b1
^b0[7]^b1[7]
InvMixColumn变换等式
经过布尔减化之后,一个字节的等式是
位
7=b2[7]^b3[7]^b1[7]^b1[6]^b0[6]^b0[4]^b0[5]^b1[4]^b2[4]^b2[5]^b3[4]
位6=b3[6]^b2[6]^b1[5]^b1[6]^b0[5]^b0[7]^b0[3]^b0[4]^b1[7]^b1[3]^b2[7]^b2[3]^b2[4]^b3[3]^b3[7]
位5=b3[5]^b2[5]^b1[4]^b1[5]^b0[4]^b1[7]^b1[2]^b2[3]^b3[2]^b0[3]^b0[2]^b0[6]^b1[6]^b2[6]^b2[2]^b3[7]^b3[6]
位4=b3[4]^b2[4]^b1[3]^b1[4]^b0[3]^b1[7]^b0[5]^b0[1]^b1[5]^b2[5]^b2[1]^b2[7]^b3[5]^b0[2]^b1[6]^b1[1]^b2[2]^b3[6]^b3[1]
位3=b3[3]^b2[3]^b1[2]^b1[3]^b0[2]^b0[5]^b1[5]^b2[5]^b2[1]^b2[7]^b3[5]^b0
^b0[6]^b3
^b3[7]^b2[6]^b2
^b1
位
2=b3[2]^b2[2]^b1[1]^b1[2]^b0[1]^b1[7]^b0
^b0[6]^b3[6]^b3[7]^b2
^b2[6]^b1[6]
位
1=b3[1]^b2[1]^b1
^b1[1]^b0
^b1[7]^b1[5]^b3[6]^b3[5]^b0[5]^b2[5]^b2[7]^b1[6]
位0=b3
^b2
^b1
^b0[7]^b1[7]^b1[6]^b2[5]^b3[5]^b0[5]^b0[6]^b2[6]
通过检查两个变换等式(MixColumn和InvMixColumn),可以看出对于每位有公共的逻辑
位7=b2[7]^b3[7]^b1[7]^b1[6]^b0[6]
位6=b3[6]^b2[6]^b1[5]^b1[6]^b0[5]
位5=b3[5]^b2[5]^b1[4]^b1[5]^b0[4]
位4=b3[4]^b2[4]^b1[3]^b1[4]^b0[3]^b1[7]
位3=b3[3]^b2[3]^b1[2]^b1[3]^b0[2]
位2=b3[2]^b2[2]^b1[1]^b1[2]^b0[1]
位1=b3[1]^b2[1]^b1
^b1[1]^b0
^b1[7]
位0=b3
^b2
^b1
^b0[7]^b1[7]
因此,根据本发明,上述公共的逻辑是共享的,通过将逆向和常规变换组合到一个电路中,基本上将所述示例的数量减小了一半。
对于门尺寸和最大路径延迟,我们将使用来自Synopsys和Philips的CMOS18技术库的合成工具来比较。
比较两种电路根据以下来设计
(1)对相应的常规和逆逻辑MixColumn算法使用独立的电路的现有技术AES建议(NIST);和
(2)根据本发明的单个电路,其以被发明人称为MixColAll算法的共享逻辑来实现二者。
尺寸和最大延迟的比较在分离的MixColumn设计和MixColAll电路上执行。每种设计使用最大路径分析来合成和定时。为了比较两种实现方案,给出了门尺寸和微米尺寸。
下面的表1示出了独立的MixColumn和InvMixColumn电路与本发明的缩小的结构的比较。
表1
独立电路解决方案的组合门尺寸是1120+3216=4336。组合的门尺寸是3053,节约了1283个门。通过独立电路的最大延迟是为2.25ns的最长路径。组合电路的最大延迟是2.84,只增加了590ps。虽然也可使用其它类型的电路来替代,但是所使用的电路是CMOS电路。
图2是举例说明能够看见根据本发明的装置的一种方式的框图。本领域的普通技术人员能够理解MixColAll子模块230能够与能处理Rijndael算法或者其它类型算法的任何硬件装置一起使用,在所述其它类型算法中在流水线操作和非流水线操作装置中都能够利用MixColumn和InvMixColumn特征。该装置能够借助转换模块212来加密/解密。转换模块212将数据块转换成字节单元,并且该模块212包括密钥添加(keyadd)215,替换220,换行(shiftrow)225和MixColumnAll230子模块。密钥次序表(key schedule)模块201从密钥中提供子密钥的密钥次序表来为每一循环(rounds)进行加密/解密。当发生加密过程时,将子密钥值轮密钥(round key)输出到模块235,而在发生解密过程时,把子密钥值从逆函数提供到块循环(round)模块235。
输入/输出模块210向要加密的明文提供入口,或者接收已经被解密210的编码文本。输出/输入模块211与模块210相似,除了它接收加密文本,或者加密的文本可以被输入来解密并且作为明文输出。
图3举例说明了根据本发明的计算机程序的方法和步骤。后附的附录提供了样本源代码,其表示能够根据本发明执行程序的一种方式。
在步骤305,接收至少一个数据块来加密解密。接下来,在步骤310由共享逻辑MixColAll模块来将该块转换成字节单元。如上所讨论,MixColAll模块执行MixColumn函数和InvMixColumn函数,这两个函数针对0-7位的每位使用共同的逻辑来共享同一电路
(位7=b2[7]^b3[7]^b1[7]^b1[6]^b0[6]
位6=b3[6]^b2[6]^b1[5]^b1[6]^b0[5],
位5=b3[5]^b2[5]^b1[4]^b1[5]^b0[4],
位4=b3[4]^b2[4]^b1[3]^b1[4]^b0[3]^b1[7],
位3=b3[3]^b2[3]^b1[2]^b1[3]^b0[2],
位2=b3[2]^b2[2]^b1[1]^b1[2]^b0[1],
位1=b3[1]^b2[1]^b1
^b1[1]^b0
^b1[7]
位0=b3
^b2
^b1
^b0[7]^b1[7])。
在步骤315,对发生的每一个加密/解密循环提供子密钥值。最后,在步骤320,将加密/解密的文本输出至诸如存储器、显示器或者打印输出之类的输出设备。
本领域普通技术人员应当理解可以做出各种变型而不偏离本发明的精神或者所附权利要求的范围。例如,所使用的公共逻辑的位数、设备的模块和子模块的布置、所转变的数据块的数目、输入和输出模块这些都可以根据需要做出修改。由于本发明能够与安全的连网处理器、安全的键盘设备、磁卡读取器设备、智能卡读取器设备以及诸如802.11设备之类的无线通信应用一起来使用,因此数据接收或输出能够被包含在公共电路中,或者通过RF、光纤、微波等等发射。在此情况下,包括发射和接收能力,连同各种类型的传输协议转换。此外,虽然实列示出8个字节(128位),这个数量可以根据需要增加或减少,和/或在AES协议中改变。还应当指出,诸如“明文”和“密文”之类的术语是本领域的术语,并且加密/解密能够包括图、照片、插图、示意图,包括声音、图像和/或多媒体数据。
附录
// 飞利浦半导体
//------------------------------------------------------
////该设计专属于飞利浦半导体拥有,使用该设计(或者任何派生物)需要飞利浦半导体的书面许可
//------------------------------------------------------
//aes_mixcoltran.vAES列混合变换块
//模块aes_mixcoltran
//所有者 Bonnie C.sexton
//部门Cary TC
//
*********************************************************
//
// 通用文档
//功能这个模块实现包括在AES中的列混合变换中的矩阵乘法。
//算法列混合变换独立于state中的每一列进行,并将每列视为四项多项式。所述变换表示成下列矩阵形式
//以矩阵形式,转换被表示为如下
//
//输入bI0(8) [字节0输入]
// bI1(8) [字节1输入]
// bI2(8) [字节2输入]
// bI3(8) [字节3输入]
//输出b0 (8) [所转换的输出]
//
********************************************************
//
********************************************************
// 通用文档
//功能这个模块实现包括在AES中的逆列混合变换中的矩阵乘法。
//算法列混合变换独立于state的每一列进行,并将每列视为四项多项式。所述逆变换表示如下
//输入bI0(8) [字节0输入]
bI1(8) [字节1输入]
bI2(8) [字节2输入]
bI3(8) [字节3输入]
//输出b0 (8) [所转换的输出]
//******************************************************
时标1ns/10ps
module aes_mixcol_all
(
enCrypt // 1=加密 0=解密
bI0,// 字节0输入
bI1,// 字节1输入
bI2,// 字节2输入
bI3,// 字节3输入
b0, // 经转换的输出
b1, // 经转换的输出
b2, // 经转换的输出
b3 // 经转换的输出
);
//-------------------------------------------------------
//端口
//-------------------------------------------------------
input enCrypt;
input [7:0]bI0;
input [7:0]bI1;
input [7:0]bI2;
input [7:0]bI3;
output [7:0]b0,b1,b2,b3;
wire [7:0]b0_n,b1_n,b2_n,b3_n;
wir[7:0]b0_i,b1_i,b2_i,b3_i;
//-------------
// 变换0
//-------------
assign b0_n[7]=bI2[7]^bI3[7]^bI1[7]^bI1[6]^bI0[6];
assign b0_i[7]=bI0[4]^bI0[5]^bI1[4]^bI2[4]^bI2[5]^bI3[4];
assign b0[7]=(enCrypt)?b0_n[7]b0_n[7]^b0_i[7];
//----------
assign b0_n[6]=bI3[6]^bI2[6]^bI1[5]^bI1[6]^bI0[5];
assign b0_i[6]=(bI0[7]^bI0[3]^bI0[4]^bI1[7]^bI1[3]^bI2[7]^bI2[3]^bI2[4]^bI3[3])^[bI3[7]);
assign b0[6]=(enCrypt)?b0_n[6]b0_n[6]^b0_i[6];
//----------
assign b0_n[5]=bI3[5]^bI2[5]^bI1[4]^bI1[5]^bI0[4];
assign b0_i[5]=(bI1[7]^bI1[2]^bI2[3]^bI3[2]^bI0[3])^(bI0[2]^bI0[6]^bI1[6]^bI2[6]^bI2[2]^bI3[7]^bI3[6]);
assign b0[5]=(enCrypt)?b0_n[5]b0_n[5]^b0_i[5];
//----------
assign b0_n[4]=bI3[4]^bI2[4]^bI1[3]^bI1[4]^bI0[3]^bI1[7];
assign b0_i[4]=(bI0[5]^bI0[1]^bI1[5]^bI2[5]^bI2[1]^bI2[7]^bI3[5])^(bI0[2]^bI1[6]^bI1[1]^bI2[2]^bI3[6]^bI3[1]);
assign b0[4]=(enCrypt)?b0_n[4]^bI0[7]b0_n[4]^b0_i[4];
//----------
assign b0_n[3]=bI3[3]^bI2[3]^bI1[2]^bI1[3]^bI0[2];
assign b0_i[3]=(bI0[5]^bI0[1]^bI1[5]^bI2[5]^bI2[1]^bI2[7]^bI3[5])^(bI0
^bI0[6]^bI3
^bI3[7]^bI2[6]^bI2
^bI1
);
assign b0[3]=(enCrypt)?b0_n[3]^bI0[7]^bI1[7]b0_n[3]^b0_i[3];
//----------
assign b0_n[2]=bI3[2]^bI2[2]^bI1[1]^bI1[2]^bI0[1];
assign b0_i[2]=(bI1[7])^(bI0
^bI0[6]^bI3[6]^bI3[7]^bI2
^bI2[6]^bI1[6]);
assign b0[2]=(enCrypt)?b0_n[2]b0_n[2]^b0_i[2];
//----------
assign b0_n[1]=bI3[1]^bI2[1]^bI1
^bI1[1]^bI0
^bI1[7];
assign b0_i[1]=(bI1[5]^bI3[6]^bI3[5]^bI0[5]^bI2[5]^bI2[7])^(bI1[6]);
assign b0[1]=(enCrypt)?b0_n[1]^bI0[7]b0_n[1]^b0_i[1];
//----------
assign b0_n
=bI3
^bI2
^bI1
^bI0[7]^bI1[7];
assign b0_i
=(bI1[5]^bI2[5]^bI3[5]^bI0[5])^(bI0[6]^bI2[6]);
assign b0
=(enCrypt)?b0_nb0_n
^b0_i
;
//--------------------------------------
//变换1(0->1,1->2,2->3,3->0)
//--------------------------------------
assign b1_n[7]=bI3[7]^bI0[7]^bI2[7]^bI2[6]^bI1[6];
assign b1_i[7]=bI1[4]^bI1[5]^bI2[4]^bI3[4]^bI3[5]^bI0[4];
assign b1[7]=(enCrypt)?b1_n[7]b1_n[7]^b1_i[7];
//----------
assign b1_n[6]=bI0[6]^bI3[6]^bI2[5]^bI2[6]^bI1[5];
assign b1_i[6]=bI1[7]^bI1[3]^bI1[4]^bI2[7]^bI2[3]^bI3[7]^bI3[3]^bI3[4]^bI0[7]^bI0[3];
assign b1[6]=(enCrypt)?b1_n[6]b1_n[6]^b1_i[6];
//----------
assign b1_n[5]=bI0[5]^bI3[5]^bI2[4]^bI2[5]^bI1[4];
assign b1_i[5]=bI1[2]^bI1[3]^bI1[6]^bI2[7]^bI2[6]^bI2[2]^bI3[6]^bI3[2]^bI3[3]^bI0[7]^bI0[6]^bI0[2];
assign b1[5]=(enCrypt)?b1_n[5]b1_n[5]^b1_i[5];
//----------
assign b1_n[4]=bI0[4]^bI3[4]^bI2[3]^bI2[4]^bI1[3]^bI2[7];
assign b1_i[4]=bI1[5]^bI1[1]^bI1[2]^bI2[6]^bI2[5]^bI2[1]^bI3[5]^bI3[1]^bI3[7]^bI3[2]^bI0[6]^bI0[5]^bI0[1];
assign b1[4]=(enCrypt)?b1_n[4]^bI1[7]b1_n[4]^b1_i[4];
//----------
assign b1_n[3]=bI0[3]^bI3[3]^bI2[2]^bI2[3]^bI1[2];
assign b1_i[3]=bI1
^bI1[6]^bI1[1]^bI1[5]^bI2[5]^bI2
^bI3[7]^bI3[5]^bI3
^bI3[6]^bI3[1]^bI0[7]^bI0[5]^bI0
;
assign b1[3]=(enCrypt)?b1_n[3]^bI1[7]^bI2[7]b1_n[3]^b1_i[3];
//----------
assign b1_n[2]=bI0[2]^bI3[2]^bI2[1]^bI2[2]^bI1[1];
assign b1_i[2]=bI1
^bI2[7]^bI2[6]^bI3[6]^bI3
^bI0[7]^bI0[6]^bI1[6];
assign b1[2]=(enCrypt)?b1_n[2]b1_n[2]^b1_i[2];
//----------
assign b1_n[1]=bI0[1]^bI3[1]^bI2
^bI2[1]^bI1
^bI2[7];
assign b1_i[1]=bI2[5]^bI2[6]^bI3[5]^bI3[7]^bI0[6]^bI0[5]^bI1[5];
assign b1[1]=(enCrypt)?b1_n[1]^bI1[7]b1_n[1]^b1_i[1];
//----------
assign b1_n
=bI0
^bI3
^bI2
^bI1[7]^bI2[7];
assign b1_i
=bI1[6]^bI2[5]^bI3[5]^bI3[6]^bI0[5]^bI1[5];
assign b1
=(enCrypt)?b1_nb1_n
^b1_i
;
//------------------------------------
//变换2(0->2,1->3,2->0,3->1)
//------------------------------------
assign b2_n[7]=bI0[7]^bI1[7]^bI3[7]^bI3[6]^bI2[6];
assign b2_i[7]=bI2[4]^bI2[5]^bI3[4]^bI0[4]^bI0[5]^bI1[4];
assign b2[7]=(enCrypt)?b2_n[7]b2_n[7]^b2_i[7];
//----------
assign b2_n[6]=bI1[6]^bI0[6]^bI3[5]^bI3[6]^bI2[5];
assign b2_i[6]=bI2[7]^bI2[3]^bI2[4]^bI3[7]^bI3[3]^bI0[7]^bI0[3]^bI0[4]^bI1[7]^bI1[3];
assign b2[6]=(enCrypt)?b2_n[6]b2_n[6]^b2_i[6];
//----------
assign b2_n[5]=bI1[5]^bI0[5]^bI3[4]^bI3[5]^bI2[4];
assign b2_i[5]=bI2[2]^bI2[3]^bI2[6]^bI3[7]^bI3[6]^bI3[2]^bI0[6]^bI0[2]^bI0[3]^bI1[7]^bI1[6]^bI1[2];
assign b2[5]=(enCrypt)?b2_n[5]b2_n[5]^b2_i[5];
//----------
assign b2_n[4]=bI1[4]^bI0[4]^bI3[3]^bI3[4]^bI2[3]^bI3[7];
assign b2_i[4]=bI2[5]^bI2[1]^bI2[2]^bI3[6]^bI3[5]^bI3[1]^bI0[5]^bI0[1]^bI0[7]^bI0[2]^bI1[6]^bI1[5]^bI1[1];
assign b2[4]=(enCrypt)?b2_n[4]^bI2[7]b2_n[4]^b2_i[4];
//----------
assign b2_n[3]=bI1[3]^bI0[3]^bI3[2]^bI3[3]^bI2[2];
assign b2_i[3]=bI2
^bI2[6]^bI2[1]^bI2[5]^bI3[5]^bI3
^bI0[7]^bI0[5]^bI0
^bI0[6]^bI0[1]^bI1[7]^bI1[5]^bI1
;
assign b2[3]=(enCrypt)?b2_n[3]^bI2[7]^bI3[7];b2_n[3]^b2_i[3];
//----------
assign b2_n[2]=bI1[2]^bI0[2]^bI3[1]^bI3[2]^bI2[1];
assign b2_i[2]=bI2
^bI3[7]^bI3[6]^bI0[6]^bI0
^bI1[7]^bI1[6]^bI2[6];
assign b2[2]=(enCrypt)?b2_n[2]b2_n[2]^b2_i[2];
//----------
assign b2_n[1]=bI1[1]^bI0[1]^bI3
^bI3[1]^bI2
^bI3[7];
assign b2_i[1]=bI3[5]^bI3[6]^bI0[5]^bI0[7]^bI1[6]^bI1[5]^bI2[5];
assign b2[1]=(enCrypt)?b2_n[1]^bI2[7]b2_n[1]^b2_i[1];
//----------
assign b2_n
=bI1
^bI0
^bI3
^bI2[7]^bI3[7];
assign b2_i
=bI2[6]^bI3[5]^bI0[5]^bI0[6]^bI1[5]^bI2[5];
assign b2
=(enCrypt)?b2_nb2_n
^b2_i
;
//----------------------------------
//变换3(0->3,1->0,2->1,3->2)
//----------------------------------
assign b3_n[7]=bI2[7]^bI1[7]^bI0[7]^bI0[6]^bI3[6];
assign b3_i[7]=bI3[4]^bI3[5]^bI0[4]^bI1[4]^bI1[5]^bI2[4];
assign b3[7]=(enCrypt)?b3_n[7]b3_n[7]^b3_i[7];
//----------
assign b3_n[6]=bI2[6]^bI1[6]^bI0[6]^bI0[5]^bI3[5];
assign b3_i[6]=bI3[7]^bI3[3]^bI3[4]^bI0[7]^bI0[3]^bI1[7]^bI1[3]^bI1[4]^bI2[7]^bI2[3];
assign b3[6]=(enCrypt)?b3_n[6]b3_n[6]^b3_i[6];
//----------
assign b3_n[5]=bI2[5]^bI1[5]^bI0[5]^bI0[4]^bI3[4];
assign b3_i[5]=bI3[2]^bI3[3]^bI3[6]^bI0[7]^bI0[6]^bI0[2]^bI1[6]^bI1[2]^bI1[3]^bI2[7]^bI2[6]^bI2[2];
assign b3[5]=(enCrypt)?b3_n[5]b3_n[5]^b3_i[5];
//----------
assign b3_n[4]=bI2[4]^bI1[4]^bI0[4]^bI0[3]^bI3[3]^bI0[7];
assign b3_i[4]=bI3[5]^bI3[1]^bI3[2]^bI0[6]^bI0[5]^bI0[1]^bI1[5]^bI1[1]^bI1[7]^bI1[2]^bI2[6]^bI2[5]^bI2[1];
assign b3[4]=(enCrypt)?b3_n[4]^bI3[7]b3_n[4]^b3_i[4];
//----------
assign b3_n[3]=bI2[3]^bI1[3]^bI0[3]^bI0[2]^bI3[2];
assign b3_i[3]=bI3
^bI3[6]^bI3[1]^bI3[5]^bI0[5]^bI0
^bI1[7]^bI1[5]^bI1
^bI1[6]^bI1[1]^bI2[7]^bI2[5]^bI2
;
assign b3[3]=(enCrypt)?b3_n[3]^bI3[7]^bI0[7]b3_n[3]^b3_i[3];
//----------
assign b3_n[2]=bI2[2]^bI1[2]^bI0[2]^bI0[1]^bI3[1];
assign b3_i[2]=br3
^bI0[7]^bI0[6]^bI1[6]^bI1
^bI2[7]^bI2[6]^bI3[6];
assign b3[2]=(enCrypt)?b3_n[2]b3_n[2]^b3_i[2];
//----------
assign b3_n[1]=bI2[1]^bI1[1]^bI0[1]^bI0
^bI3
^bI0[7];
assign b3_i[1]=bI0[5]^bI0[6]^bI1[5]^bI1[7]^bI2[6]^bI2[5]^bI3[5];
assign b3[1]=(enCrypt)?b3_n[1]^bI3[7]b3_n[1]^b3_i[1];
//----------
assign b3_n
=bI2
^bI1
^bI0
^bI0[7]^bI3[7];
assign b3_i
=bI3[6]^bI0[5]^bI1[5]^bI1[6]^bI2[5]^bI3[5];
assign b3
=(enCrypt)?b3_nb3_n
^b3_i
;endmodule
权利要求
1、一种加密/解密单元(200),其包括
密钥次序表单元(201),用来提供至少一个密钥值;
与密钥次序表单元(201)通信的转换模块(212),所述转换模块将明文/密文块转换成第一多个列中的预定数目的字节单元;
块循环单元(235),用来将预定数目的字节单元加密/解密成密文/明文;
其中所述转换模块(212)包括MixColumnAll子模块(230),该MixColumnAll子模块(230)利用共享的电路用于加密函数(function)变换以从第一多个列中产生第二多个列,还用于逆加密函数以从第二多个列中产生第一多个列。
2、根据权利要求1所述的装置,其中所述加密函数包括根据高级加密标准(AES)的列混合(MixColumn)函数。
3、根据权利要求1所述的装置,其中所述逆加密函数包括根据高级加密标准(AES)的逆列混合(InvMixColumn)函数。
4、根据权利要求1所述的装置,其中预定数目的字节单元等于8个字节(128位)。
5、根据权利要求1所述的装置,还包括输入模块(210)和输出模块(211),输入模块(210)用来输入明文/密文数据块,而输出模块(211)用来存储/显示密文/明文的输出。
6、根据权利要求1所述的装置,其中MixColumnAll子模块(230)包括共享电路,用于每个位的下列共有逻辑
位7=b2[7]^b3[7]^b1[7]^b1[6]^b0[6]
位6=b3[6]^b2[6]^b1[5]^b1[6]^b0[5]
位5=b3[5]^b2[5]^b1[4]^b1[5]^b0[4]
位4=b3[4]^b2[4]^b1[3]^b1[4]^b0[3]^b1[7]
位3=b3[3]^b2[3]^b1[2]^b1[3]^b0[2]
位2=b3[2]^b2[2]^b1[1]^b1[2]^b0[1]
位1=b3[1]^b2[1]^b1
^b1[1]^b0
^b1[7]
位0=b3
^b2
^b1
^b0[7]^b1[7]。
7、根据权利要求1所述的装置,其中MixColumnAll子模块的共享电路包括CMOS门。
8、根据权利要求7所述的装置,其中MixColumnAll子模块用来执行MixColumnAll函数的门的总数小于利用独立电路的MixColumn函数和InvMixColumn函数所使用的门组合起来的总数。
9、一种用来执行多个数据列加密和逆加密来加密/解密的转换模块,所述模块包括
MixColumnAll子模块(230),其利用共享的电路用于加密函数(function)的变换以从多个数据列中产生新数据列,还用于逆加密函数来从新数据列产生多个列。
10、根据权利要求9所述的转换模块,其中共享电路被提供给8个或更多位。
11、根据权利要求9所述的转换模块,其中共享电路被提供给每位具有下列公共布尔逻辑的至少8位
位7=b2[7]^b3[7]^b1[7]^b1[6]^b0[6]
位6=b3[6]^b2[6]^b1[5]^b1[6]^b0[5]
位5=b3[5]^b2[5]^b1[4]^b1[5]^b0[4]
位4=b3[4]^b2[4]^b1[3]^b1[4]^b0[3]^b1[7]
位3=b3[3]^b2[3]^b1[2]^b1[3]^b0[2]
位2=b3[2]^b2[2]^b1[1]^b1[2]^b0[1]
位1=b3[1]^b2[1]^b1
^b1[1]^b0
^b1[7]
位0=b3
^b2
^b1
^b0[7]^b1[7]。
12、根据权利要求11所述的转换模块,其中所述模块包括用来转换由无线通信(213)接收到的明文/密文的装置。
13、根据权利要求12所述的转换模块,其中所述无线通信包括802.11格式。
14、根据权利要求9所述的转换模块,其中所述多个数据列总共有至少128位。
15、一种数据加密/解密方法,其包括步骤
(a)接收至少一个数据块来加密/解密(参见305);
(b)将来自步骤(a)的至少一块转换成字节单元(参见310);
(c)向块循环单元提供密钥值用于每个循环的加密/解密(参见315);
(d)将加密/解密块输出至输出装置(参见320);
其中通过与加密变换和逆加密变换共有的共享逻辑来执行至少一块的转换。
16、根据权利要求15所述的方法,其中逆加密函数包括根据高级加密标准(AES)的逆列混合(InvMixColumn)函数。
17、根据权利要求15所述的方法,其中加密函数包括根据高级加密标准(AES)的列混合(MixColumn)函数。
18、根据权利要求15所述的方法,其中每个块的字节单元总数等于8个字节。
19、用于加密/解密的计算机程序产品,其包括在加密/解密时用于共享公共逻辑的可执行指令的计算机可读介质,所述程序产品包括
(a)用于接收用来加密/解密的至少一个数据块的可执行指令;
(b)用于将来自步骤(a)的至少一个数据块转换成预定数目的字节单元的可执行指令,其中通过与加密变换和逆加密变换共有的共享逻辑来执行至少一块的转换;
(c)向块循环单元提供密钥值用于每个循环的加密/解密的可执行指令;以及
(d)将加密/解密数据块输出至输出装置的可执行指令。
20、根据权利要求19所述的计算机程序产品,还包括步骤(b)中的可执行指令包括用于共享电路的指令,用于每位的下列共有逻辑
位7=b2[7]^b3[7]^b1[7]^b1[6]^b0[6]
位6=b3[6]^b2[6]^b1[5]^b1[6]^b0[5]
位5=b3[5]^b2[5]^b1[4]^b1[5]^b0[4]
位4=b3[4]^b2[4]^b1[3]^b1[4]^b0[3]^b1[7]
位3=b3[3]^b2[3]^b1[2]^b1[3]^b0[2]
位2=b3[2]^b2[2]^b1[1]^b1[2]^b0[1]
位1=b3[1]^b2[1]^b1
^b1[1]^b0
^b1[7]
位0=b3
^b2
^b1
^b0[7]^b1[7]。
21、根据权利要求19所述的计算机程序产品,其中输出装置包括显示器。
22、根据权利要求19所述的计算机程序产品,其中输出装置包括存储装置。
23、根据权利要求19所述的计算机程序产品,其中输出装置包括打印机。
24、根据权利要求19所述的计算机程序产品,其中输出装置通过无线通信接收加密/解密数据。
全文摘要
加密/解密单元、转换模块、方法和计算机程序产品共享公共逻辑用于加密变换和逆加密变换,以只少量增加等待时间而减小所需门的数目。密钥次序表单元提供至少一个密钥值。和密钥次序表单元通信的转换模块将明文/密文块转换成第一多个列中的预定数目的字节单元。转换模块包括MixColumnAll子模块,该子模块利用共享的电路用于加密函数变换,以从第一多个列中产生第二多个列,还用于逆加密函数,以从第二多个列中产生第一多个列。MixColumnAll子模块执行组合的在AES中执行的MixColumn和InvMixColumn。块循环单元用于将预定数目的字节单元加密/解密成密文/明文。
文档编号H04L9/06GK1788450SQ20048001281
公开日2006年6月14日 申请日期2004年5月10日 优先权日2003年5月14日
发明者B·C·赛克斯顿 申请人:皇家飞利浦电子股份有限公司