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

提交評論