ImageVerifierCode 换一换
格式:DOCX , 页数:9 ,大小:16.35KB ,
资源ID:3573065      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3573065.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(AES加密算法源代码.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

AES加密算法源代码.docx

1、AES加密算法源代码/AES.h#define decrypt TRUE#define encrypt FALSE#define TYPE BOOLtypedef struct _AESint Nb;int Nr;int Nk;unsigned long *Word;unsigned long *State;AES;/*加密数据,这个函数和下面的InvCipher用于演示用的,只作了一次加密或解密。要进行大数据量加解密只需对这两个函数稍作修改就可以了。byte *input 明文byte *inSize 明文长byte *out 密文存放的地方byte *key 密钥keybyte *keyS

2、ize 密钥长*/void Cipher(unsigned char* input, int inSize, unsigned char* out, unsigned char* key, int keySize);/*解密数据byte *input 密文int *inSize 密文长byte *out 明文存放的地方byte *key 密钥keyint *keySize 密钥长*/void InvCipher(unsigned char* input, int inSize, unsigned char* out, unsigned char* key, int keySize);/*生成加

3、密用的参数AES结构int inSize 块大小byte* 密钥int 密钥长unsigned long 属性(标实类型)返回AES结构指针*/AES *InitAES(AES *aes,int inSize, unsigned char* key, int keySize, TYPE type);/*生成加密用的参数AES结构int inSize 块大小byte* 密钥int 密钥长返回AES结构指针*/AES *InitAES(int inSize, unsigned char* key, int keySize, BOOL );/*加密时进行Nr轮运算AES * aes 运行时参数*/v

4、oid CipherLoop(AES *aes);/*解密时进行Nr轮逆运算AES * aes 运行时参数*/void InvCipherLoop(AES *aes);/*释放AES结构和State和密钥库word*/void freeAES(AES *aes);/AES.cpp#include stdafx.h#include #include #include AES.hunsigned char* SubWord(unsigned char* word);unsigned long* keyExpansion(unsigned char* key, int Nk, int Nr,int)

5、;/*加密数据byte *input 明文byte *inSize 明文长byte *out 密文存放的地方byte *key 密钥keybyte *keySize 密钥长*/void Cipher(unsigned char* input, int inSize, unsigned char* out, unsigned char* key, int keySize)AES aes ;InitAES(&aes,inSize,key,keySize,encrypt);/while(.)memcpy(aes.State,input,inSize);CipherLoop(&aes);memcpy(

6、out,aes.State,inSize);/*解密数据byte *input 密文int *inSize 密文长byte *out 明文存放的地方byte *key 密钥keyint *keySize 密钥长*/void InvCipher(unsigned char* input, int inSize, unsigned char* out, unsigned char* key, int keySize)AES aes;InitAES(&aes,inSize,key,keySize,decrypt);memcpy(aes.State,input,inSize);InvCipherLoo

7、p(&aes);memcpy(aes.State,out,inSize);/*生成加密用的参数AES结构int inSize 块大小byte* 密钥int 密钥长返回AES结构指针*/AES *InitAES(AES *aes,int inSize, unsigned char *key, int keySize, TYPE type)int Nb = inSize 2,Nk = keySize 2,Nr = Nb Nb = Nb;aes-Nk = Nk;aes-Nr = Nr;aes-Word = keyExpansion(key,Nb,Nr,Nk);aes-State = new unsi

8、gned longNb+3;if(type)aes-State += 3;return aes;/*生成加密用的参数AES结构int inSize 块大小byte* 密钥int 密钥长返回AES结构指针*/AES *InitAES(int inSize, unsigned char* key, int keySize,unsigned long type)return InitAES(new AES(),inSize,key,keySize,type);/*/void CipherLoop(AES *aes)unsigned char temp4;unsigned long *word8 =

9、aes-Word,*State = aes-State;int Nb = aes-Nb,Nr = aes-Nr;int r;for (r = 0; r Nb; +r)Stater = word8r;for (int round =1; round Nr; +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,1

10、2);/*Nb=4;-| s0 | | | | -| s4 | s5 | | | - | s8 | s9 | sa | | -| sc | sd | se | sf | -| | s1 | s2 | s3 | - | | | s6 | s7 | -| | | | sb |-*/for(r =0; rNb; r+)/*temp = Sboxs0,Sboxs5,Sboxsa,Sboxsf;*/temp0 = Sbox*(unsigned char*)State);temp1 = Sbox*(unsigned char*)(State+1)+1);temp2 = Sbox*(unsigned cha

11、r*)(State+2)+2);temp3 = Sbox*(unsigned char*)(State+3)+3);*(unsigned char*)State) = Log_02temp0 Log_03temp1 temp2 temp3;*(unsigned char*)State+1) = Log_02temp1 Log_03temp2 temp3 temp0;*(unsigned char*)State+2) = Log_02temp2 Log_03temp3 temp0 temp1;*(unsigned char*)State+3) = Log_02temp3 Log_03temp0

12、temp1 temp2;*State = word8r;State+;State -= Nb;memcpy(State+Nb,State,12);word8 += Nb;for(r =0; rWord,*State = aes-State;int Nb = aes-Nb,Nr = aes-Nr;unsigned char temp4;int r =0;Word += Nb*Nr;for (r = 0; r 0; -round)/*假设Nb=4;- | | | | | - | | | | | - | | | | | - | s0 | s1 | s2 | s3 | - | s4 | s5 | s6

13、 | s7 | - | s8 | s9 | sa | sb | - | sc | sd | se | sf | - */memcpy(State,State+Nb,12);/*Nb=4;-| | | | s7 |-| | | sa | sb |- | | sd | se | sf |-| s0 | s1 | s2 | s3 |-| s4 | s5 | s6 | | - | s8 | s9 | | |-| sc | | | |-*/Word -= Nb;State += Nb+2;for(r = Nb-1; r = 0; r-)/*temp = iSboxs0,iSboxsd,iSboxsa,i

14、Sboxs7;*/temp0 = iSbox*(byte*)State;temp1 = iSbox*(byte*)(State-1)+1);temp2 = iSbox*(byte*)(State-2)+2);temp3 = iSbox*(byte*)(State-3)+3);*(unsigned long*)temp = Wordr;*(unsigned char*)State = Log_0etemp0 Log_0btemp1 Log_0dtemp2 Log_09temp3;*(unsigned char*)State+1) = Log_0etemp1 Log_0btemp2 Log_0dt

15、emp3 Log_09temp0;*(unsigned char*)State+2) = Log_0etemp2 Log_0btemp3 Log_0dtemp0 Log_09temp1;*(unsigned char*)State+3) = Log_0etemp3 Log_0btemp0 Log_0dtemp1 Log_09temp2;State -;State -= 2;Word -= Nb;memcpy(State,State+Nb,12);State += Nb+2;for(r = Nb-1; r = 0; r-)*(unsigned char*)State = iSbox*(unsig

16、ned char*)State;*(unsigned char*)State+1) = iSbox*(unsigned char*)(State-1)+1);*(unsigned char*)State+2) = iSbox*(unsigned char*)(State-2)+2);*(unsigned char*)State+3) = iSbox*(unsigned char*)(State-3)+3);*State = Wordr;State -;/*-*|k0|k1|k2|k3|k4|k5|k6|k7|k8|k9|.|Nk*4|*-*Nr轮密钥库*每个密钥列长度为Nb*-*| k0 |

17、k1 | k2 | k3 |*-*| k4 | k5 | k6 | k7 |*-*| k8 | k9 | ka | kb |*-*| kc | kd | ke | kf |*-*/unsigned long* keyExpansion(byte* key, int Nb, int Nr, int Nk)unsigned long *w =new unsigned longNb * (Nr+1); / 4 columns of bytes corresponds to a wordmemcpy(w,key,Nk2);unsigned long temp;for (int c = Nk; c Nb

18、 * (Nr+1); +c)/把上一轮的最后一行放入temptemp = wc-1;/判断是不是每一轮密钥的第一行if (c % Nk = 0) /左旋8位temp = (temp24);/查Sbox表SubWord(byte*)&temp);temp = Rconc/Nk;else if ( Nk 6 & (c % Nk = 4) ) SubWord(byte*)&temp);/wc-Nk 为上一轮密钥的第一行wc = wc-Nk temp;return w;unsigned char* SubWord(unsigned char* word)word0 = Sbox word0 ;word1 = Sbox word1 ;word2 = Sbox word2 ;word3 = Sbox word3 ;return word;/*释放AES结构和State和密钥库word*/void freeAES(AES *aes)/ for(int i=0;iNb;i+)/ / printf(%d/n,i);/ free(aes-Statei);/ free(aes-Wordi);/ / printf(sdffd);

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1