AES加密解密算法_第1页
AES加密解密算法_第2页
AES加密解密算法_第3页
AES加密解密算法_第4页
AES加密解密算法_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第1页共1页集美大学计算机工程学院实验报告课程名称:班级:实验成绩:指导教师:姓名:实验项目名称:AES加密解密算法学号:上机实践日期:实验项目编号:组号:上机实践时间:2学时实验目的学习AES加密的方法。二、实验内容与设计思想编写AES加密解密算法,并测试。三、实验使用环境操作系统:MicrosoftWindows7编程环境:VisualC++6.0四、实验步骤和调试过程//AES.h#ifndefAES_H_#defineAES_H_#include<bitset>#include<utility>usingnamespacestd;classAES{public:typedefunsignedcharbyte;staticconstintKEY_SIZE=16;//密钥长度为位staticconstintN_ROUND=11;byteplainText[16];//明文bytestate[16];//当前分组。bytecipherKey[16];//密钥byteroundKey[N_ROUND][16];//轮密钥bytecipherText[16];//密文byteSBox[16][16];//S盒byteInvSBox[16][16];//逆S盒voidEncryptionProcess();voidDecryptionProcess();voidRound(constint&round);voidInvRound(constint&round);voidFinalRound();voidInvFinalRound();voidKeyExpansion();voidAddRoundKey(constint&round);voidSubBytes();voidInvSubBytes();voidShiftRows();voidInvShiftRows();voidMixColumns();voidInvMixColumns();voidBuildSBox();voidBuildInvSBox();voidInitialState(constbyte*text);voidInitialCipherText();voidInitialplainText();byteGFMultplyByte(constbyte&left,constbyte&right);constbyte*GFMultplyBytesMatrix(constbyte*left,constbyte*right);public:AES();constbyte*Cipher(constbyte*text,constbyte*key,constint&keySize);constbyte*InvCipher(constbyte*text,constbyte*key,constint&keySize);};voidAES::EncryptionProcess(){//加密过程InitialState(plainText);KeyExpansion();//密钥扩展AddRoundKey(0);//轮密钥加for(inti=1;i<N_ROUND-1;++i){Round(i);}FinalRound();InitialCipherText();}voidAES::DecryptionProcess(){//解密过程InitialState(cipherText);KeyExpansion();InvFinalRound();for(inti=N_ROUND-2;i>0;--i){InvRound(i);}AddRoundKey(0);InitialplainText();}voidAES::Round(constint&round){//正常轮SubBytes();ShiftRows();MixColumns();AddRoundKey(round);}voidAES::InvRound(constint&round){//正常轮的逆AddRoundKey(round);InvMixColumns();InvShiftRows();InvSubBytes();}voidAES::FinalRound(){//最后轮SubBytes();ShiftRows();AddRoundKey(N_ROUND-1);}voidAES::InvFinalRound(){//最后轮的逆AddRoundKey(N_ROUND-1);InvShiftRows();InvSubBytes();}voidAES::KeyExpansion(){//密钥扩展constbytercon[N_ROUND][4]={{0x00,0x00,0x00,0x00},{0x01,0x00,0x00,0x00},{0x02,0x00,0x00,0x00},{0x04,0x00,0x00,0x00},{0x08,0x00,0x00,0x00},{0x10,0x00,0x00,0x00},{0x20,0x00,0x00,0x00},{0x40,0x00,0x00,0x00},{0x80,0x00,0x00,0x00},{0x1b,0x00,0x00,0x00},{0x36,0x00,0x00,0x00}};for(inti=0;i<16;++i){roundKey[0][i]=cipherKey[i];}for(inti=0;i<4;++i){//roundKey[0][16]为cipherKey的转置矩阵for(intj=0;j<4;++j){roundKey[0][4*i+j]=cipherKey[4*j+i];}}for(introundIndex=1;roundIndex<N_ROUND;++roundIndex){byterotWord[4]={0x00};rotWord[0]=roundKey[roundIndex-1][3];rotWord[1]=roundKey[roundIndex-1][7];rotWord[2]=roundKey[roundIndex-1][11];rotWord[3]=roundKey[roundIndex-1][15];std::swap<byte>(rotWord[0],rotWord[1]);std::swap<byte>(rotWord[1],rotWord[2]);std::swap<byte>(rotWord[2],rotWord[3]);for(inti=0;i<4;++i){rotWord[i]=SBox[rotWord[i]>>4][rotWord[i]&0x0f];roundKey[roundIndex][4*i]=roundKey[roundIndex-1][4*i]^rotWord[i]^rcon[roundIndex][i];}for(intj=1;j<4;++j){for(inti=0;i<4;++i){roundKey[roundIndex][4*i+j]=roundKey[roundIndex-1][4*i+j]^roundKey[roundIndex][4*i+j-1];}}}}voidAES::AddRoundKey(constint&round){//轮密钥加for(inti=0;i<16;++i){//利用当前分组state和第round组扩展密钥进行按位异或state[i]^=roundKey[round][i];}}voidAES::SubBytes(){//字节代换for(inti=0;i<16;++i){state[i]=SBox[state[i]>>4][state[i]&0x0f];}}voidAES::InvSubBytes(){//逆字节代换for(inti=0;i<16;++i){state[i]=InvSBox[state[i]>>4][state[i]&0x0f];}}voidAES::ShiftRows(){//行变换//state第一行保持不变//Donothing.//state第二行循环左移一个字节std::swap<byte>(state[4],state[5]);std::swap<byte>(state[5],state[6]);std::swap<byte>(state[6],state[7]);//state第三行循环左移两个字节std::swap<byte>(state[8],state[10]);std::swap<byte>(state[9],state[11]);//state第三行循环左移三个字节std::swap<byte>(state[14],state[15]);std::swap<byte>(state[13],state[14]);std::swap<byte>(state[12],state[13]);}voidAES::InvShiftRows(){//行变换反演//state第一行保持不变//Donothing.//state第二行循环右移一个字节std::swap<byte>(state[6],state[7]);std::swap<byte>(state[5],state[6]);std::swap<byte>(state[4],state[5]);//state第三行循环右移两个字节std::swap<byte>(state[9],state[11]);std::swap<byte>(state[8],state[10]);//state第三行循环右移三个字节std::swap<byte>(state[12],state[13]);std::swap<byte>(state[13],state[14]);std::swap<byte>(state[14],state[15]);}voidAES::MixColumns(){//列混淆bytematrix[4][4]={{0x02,0x03,0x01,0x01},{0x01,0x02,0x03,0x01},{0x01,0x01,0x02,0x03},{0x03,0x01,0x01,0x02}};constbyte*temp=GFMultplyBytesMatrix((byte*)matrix,state);for(inti=0;i<16;++i){state[i]=temp[i];}delete[]temp;}voidAES::InvMixColumns(){//列混淆反演bytematrix[4][4]={{0x0e,0x0b,0x0d,0x09},{0x09,0x0e,0x0b,0x0d},{0x0d,0x09,0x0e,0x0b},{0x0b,0x0d,0x09,0x0e}};constbyte*temp=GFMultplyBytesMatrix((byte*)matrix,state);for(inti=0;i<16;++i){state[i]=temp[i];}delete[]temp;}voidAES::BuildSBox(){//构建S盒bytebox[16][16]={/*0123456789abcdef*//*0*/{0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76},/*1*/{0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0},/*2*/{0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15},/*3*/{0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75},/*4*/{0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84},/*5*/{0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf},/*6*/{0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8},/*7*/{0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2},/*8*/{0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73},/*9*/{0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb},/*a*/{0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79},/*b*/{0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08},/*c*/{0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a},/*d*/{0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e},/*e*/{0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf},/*f*/{0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16}};for(inti=0;i<16;++i){for(intj=0;j<16;++j){SBox[i][j]=box[i][j];}}}voidAES::BuildInvSBox(){//构建逆S盒bytebox[16][16]={/*0123456789abcdef*//*0*/{0x52,0x09,0x6a,0xd5,0x30,0x36,0xa5,0x38,0xbf,0x40,0xa3,0x9e,0x81,0xf3,0xd7,0xfb},/*1*/{0x7c,0xe3,0x39,0x82,0x9b,0x2f,0xff,0x87,0x34,0x8e,0x43,0x44,0xc4,0xde,0xe9,0xcb},/*2*/{0x54,0x7b,0x94,0x32,0xa6,0xc2,0x23,0x3d,0xee,0x4c,0x95,0x0b,0x42,0xfa,0xc3,0x4e},/*3*/{0x08,0x2e,0xa1,0x66,0x28,0xd9,0x24,0xb2,0x76,0x5b,0xa2,0x49,0x6d,0x8b,0xd1,0x25},/*4*/{0x72,0xf8,0xf6,0x64,0x86,0x68,0x98,0x16,0xd4,0xa4,0x5c,0xcc,0x5d,0x65,0xb6,0x92},/*5*/{0x6c,0x70,0x48,0x50,0xfd,0xed,0xb9,0xda,0x5e,0x15,0x46,0x57,0xa7,0x8d,0x9d,0x84},/*6*/{0x90,0xd8,0xab,0x00,0x8c,0xbc,0xd3,0x0a,0xf7,0xe4,0x58,0x05,0xb8,0xb3,0x45,0x06},/*7*/{0xd0,0x2c,0x1e,0x8f,0xca,0x3f,0x0f,0x02,0xc1,0xaf,0xbd,0x03,0x01,0x13,0x8a,0x6b},/*8*/{0x3a,0x91,0x11,0x41,0x4f,0x67,0xdc,0xea,0x97,0xf2,0xcf,0xce,0xf0,0xb4,0xe6,0x73},/*9*/{0x96,0xac,0x74,0x22,0xe7,0xad,0x35,0x85,0xe2,0xf9,0x37,0xe8,0x1c,0x75,0xdf,0x6e},/*a*/{0x47,0xf1,0x1a,0x71,0x1d,0x29,0xc5,0x89,0x6f,0xb7,0x62,0x0e,0xaa,0x18,0xbe,0x1b},/*b*/{0xfc,0x56,0x3e,0x4b,0xc6,0xd2,0x79,0x20,0x9a,0xdb,0xc0,0xfe,0x78,0xcd,0x5a,0xf4},/*c*/{0x1f,0xdd,0xa8,0x33,0x88,0x07,0xc7,0x31,0xb1,0x12,0x10,0x59,0x27,0x80,0xec,0x5f},/*d*/{0x60,0x51,0x7f,0xa9,0x19,0xb5,0x4a,0x0d,0x2d,0xe5,0x7a,0x9f,0x93,0xc9,0x9c,0xef},/*e*/{0xa0,0xe0,0x3b,0x4d,0xae,0x2a,0xf5,0xb0,0xc8,0xeb,0xbb,0x3c,0x83,0x53,0x99,0x61},/*f*/{0x17,0x2b,0x04,0x7e,0xba,0x77,0xd6,0x26,0xe1,0x69,0x14,0x63,0x55,0x21,0x0c,0x7d}};for(inti=0;i<16;++i){for(intj=0;j<16;++j){InvSBox[i][j]=box[i][j];}}}voidAES::InitialState(constbyte*text){//state初始时候为明(密)文矩阵的转置矩阵for(inti=0;i<4;++i){//转置text存放在state中for(intj=0;j<4;++j){state[4*i+j]=text[4*j+i];}}}voidAES::InitialCipherText(){//state被复制到输出矩阵中for(inti=0;i<4;++i){//转置state存放在cipherText中for(intj=0;j<4;++j){cipherText[4*i+j]=state[4*j+i];}}}voidAES::InitialplainText(){//state被复制到输入矩阵中for(inti=0;i<4;++i){//转置state存放在plainText中for(intj=0;j<4;++j){plainText[4*i+j]=state[4*j+i];}}}AES::byteAES::GFMultplyByte(constbyte&left,constbyte&right){//有限域GF(2^8)上的乘法bytetemp[8];bitset<8>bits((unsignedlong)right);//把right化为个二进制位存放在bits中temp[0]=left;for(inti=1;i<8;++i){if(temp[i-1]>=0x80)//若(temp[i-1]首位为"1"{temp[i]=temp[i-1]<<1;temp[i]=temp[i]^0x1b;//与(00011011)异或}else{temp[i]=temp[i-1]<<1;}}byteresult=0x00;for(inti=0;i<8;++i){if(bits[i]==1){result^=temp[i];}}returnresult;}constAES::byte*AES::GFMultplyBytesMatrix(constbyte*left,constbyte*right){//有限域GF(2^8)上的矩阵(4*4)乘法AES::byte*result=newAES::byte[16];for(inti=0;i<4;++i){for(intj=0;j<4;++j){result[4*i+j]=GFMultplyByte(left[4*i],right[j]);for(intk=1;k<4;++k){result[4*i+j]^=GFMultplyByte(left[4*i+k],right[4*k+j]);}}}returnresult;}AES::AES(){BuildSBox();BuildInvSBox();}constAES::byte*AES::Cipher(constbyte*text,constbyte*key,constint&keySize){//用key给text加密for(inti=0;i<16;++i){plainText[i]=text[i];}for(inti=0;i<keySize;++i){cipherKey[i]=key[i];}EncryptionProcess();returncipherText;}constAES::byte*AES::InvCipher(constbyte*text,constbyte*key,constint&keySize){//用key给text解密for(inti=0;i<16;++i){cipherText[i]=text[i];}for(inti=0;i<keySize;++i){cipherKey[i]=key[i];}DecryptionProcess();returnplainText;}#endif/*AES_H_*///AES.CPP//main.cpp#include"stdafx.h"#include<string>#include<fstream>#include<iostream>#incl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论