第四章研发设计实例高加密标准.docx
- 文档编号:18662920
- 上传时间:2023-08-24
- 格式:DOCX
- 页数:29
- 大小:302.73KB
第四章研发设计实例高加密标准.docx
《第四章研发设计实例高加密标准.docx》由会员分享,可在线阅读,更多相关《第四章研发设计实例高加密标准.docx(29页珍藏版)》请在冰点文库上搜索。
第四章研发设计实例高加密标准
第四章设计实例:
高级加密标准
高级加密标准(AdvancedEncryptionStandard,AES,也是指它的原始名称:
Rijndael)特指电子信息加密保护的最新标准。
这个标准已经被美国国家标准和技术学会通过,并发表在联邦信息处理标准学报上(IPSPUB197)。
推动新标准实现的原因是由于原来的数据加密标准(DES)已经不能满足要求。
除了提供更好的安全性,AES还可以利用硬件很容易的实现。
在这里,“容易”的是指是更少的设计错误(更可靠)和更快的速度(简单的组合逻辑)。
本章的主要目标是介绍一些AES结构,并且分析有关性能和面积的各种平衡关系。
4.1AES架构
AES是对称的密钥密码,它映射128位明码文本的数据块到128位密码文本的块。
密钥的长度在128位,192位和256位之间是可变的,它决定了安全的等级(更长的密钥=更大的密钥空间=更大的安全性)。
AES算法的变换是由四个部分组成:
字节替代(位映射),行间移位(交换),多列变换(变换到GF(28))和加轮密钥(在GF
(2)域中,用bit方式操作的轮形密钥的相加)。
这些变换构成了一个“轮”,这些轮的数量是由密钥的大小决定的(128位,10个轮;192位,12个轮;256位,14个轮)。
要注意到每个轮的轮密钥是唯一的。
这些密钥是由原始的密钥通过密钥扩展推导而来的。
密钥扩展是本章的结构焦点之一,下文将会做更详细的讨论。
对于完整的AES密码更加详细的说明,可以参考NIST提供的联邦信息处理标准197(FIPS197)。
密钥扩展并行的运行于数据路径,获取密码密钥,并且为每一个变换的轮产生一个唯一的密钥。
令一个字=32bit,Nk=密钥尺寸/字尺寸(128,192或者256/32)。
扩展密钥的第一个Nk使用密码密钥填充,下面每个32位宽的字都是前一个32位字与前一个32位Nk字的异或。
对于出现在Nk倍数上的字,当前的字在异或操作之前要经过一次变换,接着是与一个轮常量进行异或。
这个变换由一组轮排列组成,接着是对32位内的全部4个字节的8-byte映射。
轮常量在FIPS定义是由[{x(i-1),{00},{00},{00}}]给出的数值,x(i-1)是x的幂,其中x在域GF(28)中用{02}表示。
矚慫润厲钐瘗睞枥庑赖。
一个单独的密钥扩展是与高层次的结构相独立的,下面的实现说明了这一点。
moduleKeyExp1Enc(
//updatedvaluestobepassedtonextiteration
output[3:
0]oKeyIter,oKeyIterModNk,oKeyIterDivNk,聞創沟燴鐺險爱氇谴净。
output[32*‘Nk-1:
0]oNkKeys,
inputiClk,iReset,
//representstotal#ofiterationsandvaluemodNk残骛楼諍锩瀨濟溆塹籟。
input[3:
0]iKeyIter,iKeyIterModNk,iKeyIterDivNk,
//ThelastNkkeysgeneratedinkeyexpansion
input[32*‘Nk-1:
0]iNkKeys);
//updatedvaluestobepassedtonextiteration
reg[3:
0]oKeyIter,oKeyIterModNk,oKeyIterDivNk;
reg[32*‘Nk-1:
0]OldKeys;
reg[31:
0]InterKey;//intermediatekeyvalue
wire[32*‘Nk-1:
0]oNkKeys;
wire[31:
0]PrevKey,RotWord,SubWord,NewKeyWord;
wire[31:
0]KeyWordNk;
wire[31:
0]Rcon;
assignPrevKey=iNkKeys[31:
0];//lastwordinkeyarray酽锕极額閉镇桧猪訣锥。
assignKeyWordNk=OldKeys[32*‘Nk-1:
32*‘Nk-32];
//1bytecyclicpermutation
assignRotWord={PrevKey[23:
0],PrevKey[31:
24]};
//newkeycalculatedinthisround
assignNewKeyWord=KeyWordNk^InterKey;
//calculatenewkeyset
assignoNkKeys={OldKeys[32*‘Nk-33:
0],NewKeyWord};彈贸摄尔霁毙攬砖卤庑。
//calculateRconoverGF(2^8)
assignRcon=iKeyIterDivNk==8’h1?
32’h01000000:
謀荞抟箧飆鐸怼类蒋薔。
iKeyIterDivNk==8’h2?
32’h02000000:
iKeyIterDivNk==8’h3?
32’h04000000:
iKeyIterDivNk==8’h4?
32’h08000000:
iKeyIterDivNk==8’h5?
32’h10000000:
iKeyIterDivNk==8’h6?
32’h20000000:
iKeyIterDivNk==8’h7?
32’h40000000:
iKeyIterDivNk==8’h8?
32’h80000000:
iKeyIterDivNk==8’h9?
32’h1b000000:
32’h36000000;
SboxEncSboxEnc0(.iPreMap(RotWord[31:
24]),.oPostMap(SubWord[31:
24]));厦礴恳蹒骈時盡继價骚。
SboxEncSboxEnc1(.iPreMap(RotWord[23:
16]),.oPostMap(SubWord[23:
16]));茕桢广鳓鯡选块网羈泪。
SboxEncSboxEnc2(.iPreMap(RotWord[15:
8]),.oPostMap(SubWord[15:
8]));鹅娅尽損鹌惨歷茏鴛賴。
SboxEncSboxEnc3(.iPreMap(RotWord[7:
0]),.oPostMap(SubWord[7:
0]));籟丛妈羥为贍偾蛏练淨。
‘ifdefNk8
wire[31:
0]SubWordNk8;
//SubstitutiononlywhenNk=8
SboxEncSboxEncNk8_0(.iPreMap(PrevKey[31:
24]),.oPostMap(SubWordNk8[31:
24]));預頌圣鉉儐歲龈讶骅籴。
SboxEncSboxEncNk8_1(.iPreMap(PrevKey[23:
16]),.oPostMap(SubWordNk8[23:
16]));渗釤呛俨匀谔鱉调硯錦。
SboxEncSboxEncNk8_2(.iPreMap(PrevKey[15:
8]),.oPostMap(SubWordNk8[15:
8]));铙誅卧泻噦圣骋贶頂廡。
SboxEncSboxEncNk8_3(.iPreMap(PrevKey[7:
0]),.oPostMap(SubWordNk8[7:
0]));擁締凤袜备訊顎轮烂蔷。
‘endif
always@(posedgeiClk)
if(!
iReset)begin
oKeyIter<=0;
oKeyIterModNk<=0;
InterKey<=0;
oKeyIterDivNk<=0;
OldKeys<=0;
end
elsebegin
oKeyIter<=iKeyIter+1;
OldKeys<=iNkKeys;
//update"KeyiterationmodNk"fornextiteration贓熱俣阃歲匱阊邺镓騷。
if(iKeyIterModNk+1==‘Nk)begin
oKeyIterModNk<=0;
oKeyIterDivNk<=iKeyIterDivNk+1;
end
elsebegin
oKeyIterModNk<=iKeyIterModNk+1;
oKeyIterDivNk<=iKeyIterDivNk;
end
if(iKeyIterModNk==0)
InterKey<=SubWord^Rcon;
‘ifdefNk8
//anoptiononlyforNk=8
elseif(iKeyIterModNk==4)
InterKey<=SubWordNk8;
‘endif
else
InterKey<=PrevKey;
end
endmodule
同样地,数据通道的独立操作是轮加密要求的所有函数的组合,如下面实现中所说明的。
moduleRoundEnc(
output[32*‘Nb-1:
0]oBlockOut,
outputoValid,
inputiClk,iReset,
input[32*‘Nb-1:
0]iBlockIn,iRoundKey,
inputiReady,
input[3:
0]iRound);
wire[32*‘Nb-1:
0]wSubOut,wShiftOut,wMixOut;
wirewValidSub,wValidShift,wValidMix;
SubBytesEncsub
(.iClk(iClk),
.iReset(iReset),
.iBlockIn(iBlockIn),
.oBlockOut(wSubOut),
.iReady(iReady),
.oValid(wValidSub));
ShiftRowsEncshift
(.iBlockIn(wSubOut),
.oBlockOut(wShiftOut),
.iReady(wValidSub),
.oValid(wValidShift));
MixColumnsEncmixcolumn
(.iClk(iClk),
.iReset(iReset),
.iBlockIn(wShiftOut),
.iReady(wValidShift),
.oValid(wValidMix),
.iRound(iRound));
AddRoundKeyEncaddroundkey
(.iClk(iClk),
.iReset(iReset),
.iBlockIn(wMixOut),
.iRoundKey(iRoundKey),
.oBlockOut(oBlockOut),
.iReady(wValidMix),
.oValid(oValid));
endmodule
一级字节替代
由于算法迭代的重复利用性和相对小的映射空间,字节替代使用查找表实现。
那么,使用一个同步的单级流水线的8x256(28)ROM能够有效地实现8bit到8bit的映射。
如果4.1所示。
坛摶乡囂忏蒌鍥铃氈淚。
图4.1字节替代模块中一个8位映射
零级行间移位
这一级简单的混合数据块中的行,这里没有用到逻辑。
因此,这一点的另一个流水级将使这个流水级周期产生逻辑的不平衡,减少了最大频率和总的吞吐量。
行间移位的实现如图4.2所示。
蜡變黲癟報伥铉锚鈰赘。
图4.2行间移位的实现
两个流水线级列混合
这一级有全部四个轮级之外最多的逻辑,对于添加流水线这一级是最好的位置。
列混合的层次入图4-3所示。
图4.3列混合的层次
如图4-3所看到的,列混合使用一个成为列映射(Map_Column)的模块作为积木块,在途4-4中可以看到。
買鲷鴯譖昙膚遙闫撷凄。
图4.4列映射的层次
如图4-4所看到的,列映射使用一个称为多项式乘2乘法器(polynomialX2multiplier)的模块作为积木块,如图4-5所示。
綾镝鯛駕櫬鹕踪韦辚糴。
图4.5多项式乘2
一级加轮密钥
这一级简单地将密钥扩展流水线的轮密钥与数据块异或。
如图4-6所示。
图4.6加轮密钥模块
紧缩结构
考虑中的第一个实现是设计成可多次重用的逻辑资源的紧缩实现。
最初,输入的数据和密钥在初始轮模型中相加,在进入加密循环之前将结果寄存。
然后按照规定的顺序,将数据应用于字节代换,行间移位,多列变换和加轮密钥。
在每个轮的结尾,新的数据被寄存。
按照轮的数量重复这些操作。
图4-7是一个迭代结构的框图。
驅踬髏彦浃绥譎饴憂锦。
图4.7紧缩结构实现
inputiClk,iReset,
input[32*‘Nb-1:
0]iPlaintext,//inputdatatobeencrypted猫虿驢绘燈鮒诛髅貺庑。
input[32*‘Nk-1:
0]iKey,//inputciptherkey
inputiReady,//validdatatoencrypt
inputiNewKey);//signalsnewkeyisinput
//registeredinputs
wire[32*‘Nk-1:
0]wKeyReg;
wirewNewKeyReg,wReadyReg;
wire[127:
0]wPlaintextReg,wBlockOutInit;
wire[127:
0]wRoundKeyInit,wRoundKey;
//registerinputs
InputRegsEncInputRegs(.iClk(iClk),
.iReset(iReset),
.iKey(iKey),
.iNewKey(iNewKey),
.iPlaintext(iPlaintext),
.oKeysValid(oKeysValid),
.iReady(iReady),
.oKey(wKeyReg),
.oPlaintext(wPlaintextReg),
.oReady(wReadyReg));
//initialadditionofroundkey
AddRoundKeyEncInitialKey(.iClk(iClk),
.iReset(iReset),
.iBlockIn(wPlaintextReg),
.iRoundKey(wRoundKeyInit),
.oBlockOut(wBlockOutInit),
.iReady(wReadyReg),
.oValid(wValidInit));
//Numberofroundsisafunctionofkeysize(10,12,or14)锹籁饗迳琐筆襖鸥娅薔。
//Keyexpansionblock
KeyExpansionEncKeyExpansion(.iClk(iClk),
.iReset
(iReset),
.iNkKeys(wKeyReg),
.iReady(wReadyReg),
.oRoundKey(wRoundKey));
RoundsIterEncRoundsIter(.iClk(iClk),
.iReset(iReset),
.iBlockIn(wBlockOutInit),
.oBlockOut(oCiphertext),
.iReady(wValidInit),
.oValid(oValid),
.iRoundKey(wRoundKey));
‘ifdefNk4
assignwRoundKeyInit=wKeyReg[128-1:
0];
‘endif
‘ifdefNk6
assignwRoundKeyInit=wKeyReg[192-1:
192-128];
‘endif
‘ifdefNk8
assignwRoundKeyInit=wKeyReg[256-1:
256-128];
‘endif
Endmodule
在以上的代码中,模块KeyExpansionEnc和RoundsIterEnc负责执行紧缩结构所需要的迭代操作。
KeyExpansionEnc模块处理密钥扩展的迭代,RoundsIterEnc处理数据路径。
对于每次轮迭代,都有唯一的轮密钥从密钥扩展模块传递到RoundsIterEnc模块。
在每一个轮次,以下的代码将密钥信息通过相同的扩展模块循环,以重用这些逻辑。
構氽頑黉碩饨荠龈话骛。
moduleKeyExpansionEnc(
output[128-1:
0]oRoundKey,
inputiClk,iReset,
//ThelastNkkeysgeneratedininitialkeyexpansion輒峄陽檉簖疖網儂號泶。
input[32*‘Nk-1:
0]iNkKeys,
inputiReady);//signalsanewkeyisinput
wire[3:
0]KeyIterIn,KeyIterOut;
wire[3:
0]KeyIterDivNkIn,KeyIterDivNkOut;
wire[3:
0]KeyIterModNkIn,KeyIterModNkOut;
wire[32*‘Nk-1:
0]NkKeysOut,NkKeysIn;
wirewReady;
assignwReady=iReady;
assignKeyIterIn=wReady?
‘Nk:
KeyIterOut;
assignoRoundKey=NkKeysOut[32*‘Nk-1:
32*‘Nk-128];
assignKeyIterModNkIn=wReady?
4’h0:
KeyIterModNkOut;尧侧閆繭絳闕绚勵蜆贅。
assignKeyIterDivNkIn=wReady?
4’h1:
KeyIterDivNkOut;识饒鎂錕缢灩筧嚌俨淒。
assignNkKeysIn=wReady?
iNkKeys:
NkKeysOut;
KeyExp1EncKeyExp1(.iClk(iClk),
.iReset(iReset),
.iKeyIter(KeyIterIn),
.iKeyIterModNk(KeyIterModNkIn),
.iNkKeys(NkKeysIn),
.iKeyIterDivNk(KeyIterDivNkIn),
.oKeyIter(KeyIterOut),
.oKeyIterModNk(KeyIterModNkOut),
.oNkKeys(NkKeysOut),
.oKeyIterDivNk(KeyIterDivNkOut));
endmodule
在上面的模块中,单个密钥扩展模块KeyExp1Enc的输出连接到下面的轮的进一步扩展的输出,如图4.8所示。
凍鈹鋨劳臘锴痫婦胫籴。
这样KeyExp1Enc的逻辑在每一个轮重用。
图4.8迭代密钥扩展
部分流水线结构
考虑中的第二个实现是部分流水线结构。
取决于密钥的尺寸,一个AES轮的实现需要11到14个时钟周期。
如图4.9所看到的,一个流水线设计可以通过数据通道核的多个例化来实现,其中密钥扩展是用静态的方式执行的。
对于NK=4,下面这段代码给出了实现方式。
恥諤銪灭萦欢煬鞏鹜錦。
图4.9部分流水线实现
moduleAES_core(
output[32*‘Nb-1:
0]oCiphertext,//outputcipthertext鯊腎鑰诎褳鉀沩懼統庫。
outputoValid,//dataatoutputisvalid
//signalsthatnewkeyhasbeencompletelyprocessed硕癘鄴颃诌攆檸攜驤蔹。
outputoKeysValid,
inputiClk,iReset,
input[32*‘Nb-1:
0]iPlaintext,//inputdatatobeencrypted阌擻輳嬪諫迁择楨秘騖。
input[32*‘Nk-1:
0]iKey,//inputciptherkey
inputiReady,//validdatatoencrypt
inputiNewKey);//signalsnewkeyisinput
wire[32*‘Nb-1:
0]wRoundKey1,wRoundKey2,
wRoundKey3,wRoundKey4,
wRoundKey5,wRoundKey6,
wRoundKey7,wRoundKey8,
wRoundKey9,wRoundKeyFinal,
wRoundKeyInit;
wire[32*‘Nb-1:
0]wBlockOut1,wBlockOut2,
wBlockOut3,wBlockOut4,
wBlockOut5,wBlockOut6,
wBlockOut7,wBlockOut8,
wBlockOut9,wBlockOutInit;
wire[32*‘Nk-1:
0]wNkKeysInit;
wire[3:
0]wKeyIterInit;
wire[3:
0]wKeyIterModNkInit;
wire[3:
0]wKeyIterDivNkInit;
wirewValid1,wValid2,wValid3,
wValid4,
wValid5,wValid6,wValid7,
wValid8,
wValid9,wValidFinal,
wValidInit;
wirewNewKeyInit;
wire[128*(‘Nr+1)-1:
0]wKeys;//completeset
ofroundkeys
//registeredinputs
wire[32*‘Nk-1:
0]wKeyReg;
wirewNewKeyReg,wReadyReg;
wire[127:
0]wPlaintextReg;
//registerinputs
InputRegsInputRegs(.iClk(iClk),.iRes
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第四 研发 设计 实例 加密 标准