AES方法Word文档下载推荐.docx
- 文档编号:22418081
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:12
- 大小:16.13KB
AES方法Word文档下载推荐.docx
《AES方法Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《AES方法Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
byte*keySize密钥长
*/
voidCipher(
unsignedchar*input,
intinSize,
unsignedchar*out,
unsignedchar*key,
intkeySize);
解密数据
byte*input密文
int*inSize密文长
byte*out明文存放的地方
int*keySize密钥长
voidInvCipher(
生成加密用的参数AES结构
intinSize块大小
byte*密钥
int密钥长
unsignedlong属性(标实类型)
返回AES结构指针
AES*InitAES(AES*aes,
intkeySize,TYPEtype);
AES*InitAES(
intkeySize,BOOL);
加密时进行Nr轮运算
AES*aes运行时参数
voidCipherLoop(
AES*aes);
解密时进行Nr轮逆运算
voidInvCipherLoop(
释放AES结构和State和密钥库word
voidfreeAES(
//AES.cpp
#include"
stdafx.h"
#include
AES.h"
unsignedchar*SubWord(unsignedchar*word);
unsignedlong*keyExpansion(unsignedchar*key,intNk,intNr,int);
voidCipher(unsignedchar*input,intinSize,unsignedchar*out,unsignedchar*key,intkeySize)
{
AESaes;
InitAES(&
aes,inSize,key,keySize,encrypt);
memcpy(aes.State,input,inSize);
CipherLoop(&
aes);
memcpy(out,aes.State,inSize);
}
voidInvCipher(unsignedchar*input,intinSize,unsignedchar*out,unsignedchar*key,intkeySize)
AESaes;
aes,inSize,key,keySize,decrypt);
InvCipherLoop(&
memcpy(aes.State,out,inSize);
AES*InitAES(AES*aes,intinSize,unsignedchar*key,intkeySize,TYPEtype)
intNb=inSize>
>
2,
Nk=keySize>
Nr=Nb<
Nk?
Nk:
Nb+6;
aes->
Nb=Nb;
Nk=Nk;
Nr=Nr;
Word=keyExpansion(key,Nb,Nr,Nk);
State=newunsignedlong[Nb+3];
if(type)
State+=3;
returnaes;
AES*InitAES(intinSize,unsignedchar*key,intkeySize,unsignedlongtype)
returnInitAES(newAES(),inSize,key,keySize,type);
voidCipherLoop(AES*aes)
unsignedchartemp[4];
unsignedlong*word8=aes->
Word,
*State=aes->
State;
intNb=aes->
Nb,
Nr=aes->
Nr;
intr;
for(r=0;
r<
Nb;
++r)
State[r]^=word8[r];
for(intround=1;
round
word8+=Nb;
假设Nb=4;
---------------------
|s0|s1|s2|s3|
|s4|s5|s6|s7|
|s8|s9|sa|sb|
|sc|sd|se|sf|
|||||
memcpy(State+Nb,State,12);
Nb=4;
|s0||||
|s4|s5|||
|s8|s9|sa||
||s1|s2|s3|
|||s6|s7|
||||sb|
for(r=0;
r
temp={Sbox[s0],Sbox[s5],Sbox[sa],Sbox[sf]};
temp[0]=Sbox[*((unsignedchar*)State)];
temp[1]=Sbox[*((unsignedchar*)(State+1)+1)];
temp[2]=Sbox[*((unsignedchar*)(State+2)+2)];
temp[3]=Sbox[*((unsignedchar*)(State+3)+3)];
*((unsignedchar*)State)=Log_02[temp[0]]^Log_03[temp[1]]^temp[2]^temp[3];
*((unsignedchar*)State+1)=Log_02[temp[1]]^Log_03[temp[2]]^temp[3]^temp[0];
*((unsignedchar*)State+2)=Log_02[temp[2]]^Log_03[temp[3]]^temp[0]^temp[1];
*((unsignedchar*)State+3)=Log_02[temp[3]]^Log_03[temp[0]]^temp[1]^temp[2];
*State^=word8[r];
State++;
State-=Nb;
*((unsignedchar*)State)=Sbox[*(unsignedchar*)State];
*((unsignedchar*)State+1)=Sbox[*((unsignedchar*)(State+1)+1)];
*((unsignedchar*)State+2)=Sbox[*((unsignedchar*)(State+2)+2)];
*((unsignedchar*)State+3)=Sbox[*((unsignedchar*)(State+3)+3)];
voidInvCipherLoop(AES*aes)
unsignedlong*Word=aes->
intr=0;
Word+=Nb*Nr;
State[r]^=Word[r];
State-=3;
for(intround=Nr-1;
round>
0;
--round)
memcpy(State,State+Nb,12);
||||s7|
|||sa|sb|
||sd|se|sf|
|s4|s5|s6||
|s8|s9|||
|sc||||
Word-=Nb;
State+=Nb+2;
for(r=Nb-1;
r>
=0;
r--)
temp={iSbox[s0],iSbox[sd],iSbox[sa],iSbox[s7]};
temp[0]=iSbox[*(byte*)State];
temp[1]=iSbox[*((byte*)(State-1)+1)];
temp[2]=iSbox[*((byte*)(State-2)+2)];
temp[3]=iSbox[*((byte*)(State-3)+3)];
*(unsignedlong*)temp^=Word[r];
*(unsignedchar*)State=Log_0e[temp[0]]^Log_0b[temp[1]]^Log_0d[temp[2]]^Log_09[temp[3]];
*((unsignedchar*)State+1)=Log_0e[temp[1]]^Log_0b[temp[2]]^Log_0d[temp[3]]^Log_09[temp[0]];
*((unsignedchar*)State+2)=Log_0e[temp[2]]^Log_0b[temp[3]]^Log_0d[temp[0]]^Log_09[temp[1]];
*((unsignedchar*)State+3)=Log_0e[temp[3]]^Log_0b[temp[0]]^Log_0d[temp[1]]^Log_09[temp[2]];
State--;
State-=2;
*(unsignedchar*)State=iSbox[*(unsignedchar*)State];
*((unsignedchar*)State+1)=iSbox[*((unsignedchar*)(State-1)+1)];
*((unsignedchar*)State+2)=iSbox[*((unsignedchar*)(State-2)+2)];
*((unsignedchar*)State+3)=iSbox[*((unsignedchar*)(State-3)+3)];
*State^=Word[r];
*--------------------------------------------
*|k0|k1|k2|k3|k4|k5|k6|k7|k8|k9|.......|Nk*4|
*Nr轮密钥库
*每个密钥列长度为Nb
*---------------------
*|k0|k1|k2|k3|
*|k4|k5|k6|k7|
*|k8|k9|ka|kb|
*|kc|kd|ke|kf|
unsignedlong*keyExpansion(byte*key,intNb,intNr,intNk)
unsignedlong*w=newunsignedlong[Nb*(Nr+1)];
//4columnsofbytescorrespondstoaword
memcpy(w,key,Nk<
<
2);
unsignedlongtemp;
for(intc=Nk;
c<
Nb*(Nr+1);
++c)
//把上一轮的最后一行放入temp
temp=w[c-1];
//判断是不是每一轮密钥的第一行
if(c%Nk==0)
//左旋8位
temp=(temp<
8)|(temp>
24);
//查Sbox表
SubWord((byte*)&
temp);
temp^=Rcon[c/Nk];
elseif(Nk>
6&
&
(c%Nk==4))
//w[c-Nk]为上一轮密钥的第一行
w[c]=w[c-Nk]^temp;
returnw;
unsignedchar*SubWord(unsignedchar*word)
word[0]=Sbox[word[0]];
word[1]=Sbox[word[1]];
word[2]=Sbox[word[2]];
word[3]=Sbox[word[3]];
returnword;
voidfreeAES(AES*aes)
//for(inti=0;
iNb;
i++)
//{
//printf("
%d"
i);
//free(aes->
State[i]);
Word[i]);
//}
sdffd"
);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AES 方法