亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? aes.cpp

?? 實現對字符串和整篇文章的AES加密和解密操作
?? CPP
字號:
#include "StdAfx.h"    //注意在此 #include "Aes.h"不可以放在前面,否則出錯,
#include "Aes.h"
Aes::~Aes()
{
	
}
Aes::Aes()
{
	
}
////////////////////////////////////////////////////////////////////////////////////////////////
//構造函數
Aes::Aes(int keysize,unsigned char* keyBytes)
{
	SetNbNkNr(keysize);                         //設置密鑰塊數,輪數 
	memcpy(key,keyBytes,keysize);				//字符串拷貝函數,把keyBytes的keysize個字符復制到key中
	KeyExpansion();								//密鑰擴展,必須提前做的初始化
}
////////////////////////////////////////////////////////////////////////////////////////////////
int Aes::SetNbNkNr(int keySize)
{
	Nb=4;
	if(keySize == Bits128)
	{
		Nk=4;    //4*4字節,128位密鑰,10輪加密
		Nr=10;
	}
	else if(keySize == Bits192)
	{
		Nk=6;    //6*4字節,192位密鑰,12輪加密
		Nr=12;
	}
	else if(keySize == Bits256)
	{
		Nk=8;    //8*4字節,256位密鑰,14輪加密
		Nr=14;
	}
	return 1;
}
////////////////////////////////////////////////////////////////////////////////////////////////
int Aes::KeyExpansion()
{
    int row=0;
	memset(w,0,16*15);
	for(row;row<Nk;row++)       //拷貝seed 密鑰
	{
		w[4*row+0] =  key[4*row];
		w[4*row+1] =  key[4*row+1];
		w[4*row+2] =  key[4*row+2];
		w[4*row+3] =  key[4*row+3];
	}
	byte* temp = new byte[4];
	for(row=Nk;row<4*(Nr+1);row++)
	{
		temp[0]=w[4*row-4];     //當前列的前一列  
		temp[1]=w[4*row-3];
		temp[2]=w[4*row-2];
		temp[3]=w[4*row-1];
		if(row%Nk==0)           //逢nk時,對當前列的前一列作特殊處理
		{
			temp=SubWord(RotWord(temp));   //先移位,再代換,最后和輪常量異或
			temp[0] = (byte)( (int)temp[0] ^ (int) AesRcon[4*(row/Nk)+0] );   
			temp[1] = (byte)( (int)temp[1] ^ (int) AesRcon[4*(row/Nk)+1] );
			temp[2] = (byte)( (int)temp[2] ^ (int) AesRcon[4*(row/Nk)+2] );
			temp[3] = (byte)( (int)temp[3] ^ (int) AesRcon[4*(row/Nk)+3] );
        }
		else if ( Nk > 6 && (row % Nk == 4) )  //這個還沒有搞清楚
        {
			temp = SubWord(temp);

        }
        
        // w[row] = w[row-Nk] xor temp
        w[4*row+0] = (byte) ( (int) w[4*(row-Nk)+0] ^ (int)temp[0] );
		w[4*row+1] = (byte) ( (int) w[4*(row-Nk)+1] ^ (int)temp[1] );
		w[4*row+2] = (byte) ( (int) w[4*(row-Nk)+2] ^ (int)temp[2] );
		w[4*row+3] = (byte) ( (int) w[4*(row-Nk)+3] ^ (int)temp[3] );
	}  // for loop
	return 1;
}
////////////////////////////////////////////////////////////////////////////////////////////////
//密鑰移位函數
unsigned char* Aes::RotWord(unsigned char* word)
{
	byte* temp = new byte[4];
	temp[0] = word[1];
	temp[1] = word[2];
	temp[2] = word[3];
	temp[3] = word[0];
	return temp;
}
////////////////////////////////////////////////////////////////////////////////////////////////
//密鑰字代換函數
unsigned char* Aes::SubWord(unsigned char* word)
{
	byte* temp = new byte[4];
	for(int j=0;j<4;j++)
	{
		temp[j] = AesSbox[16*(word[j] >> 4)+(word[j] & 0x0f)];  //實際上也可以寫成AesSbox[[j]];因為兩者相等
	}
	return temp;

}
////////////////////////////////////////////////////////////////////////////////////////////////
//Aes加密函數
void Aes::Cipher(unsigned char* input, unsigned char* output)
{
	memset(&State[0][0],0,16);
	for(int i=0;i<4*Nb;i++)                        //這里是先寫列后寫行的,即輸入是一列一列的進來的
	{
		State[i%4][i/4]=input[i];					//換成先寫行后寫列也是可以的,只要在輸出時也是這樣就可以了
	}
	AddRoundKey(0);									//輪密鑰加
	
	for (int round = 1; round <= (Nr - 1); round++)  // main round loop
	{
        SubBytes();									//字節代換
        ShiftRows();								//行移位
        MixColumns();								//列混淆
        AddRoundKey(round);							//輪密鑰加
	}  // main round loop
	
	SubBytes();										//字節代換
	ShiftRows();									//行移位
	AddRoundKey(Nr);								//輪密鑰加
	
	// output = state
	for (i = 0; i < (4 * Nb); i++)
	{
        output[i] =  State[i % 4][ i / 4];
	}
}
////////////////////////////////////////////////////////////////////////////////////////////////
//Aes解密函數
int Aes::InvCipher(unsigned char* input,unsigned char* output)
{
	memset(&State[0][0],0,16);
	for (int i = 0; i < (4 * Nb); i++)
	{
		State[i % 4][ i / 4] = input[i];
	}
	
	AddRoundKey(Nr);
	
	for (int round = Nr-1; round >= 1; round--)  // main round loop
	{
        InvShiftRows();
        InvSubBytes();
        AddRoundKey(round);
        InvMixColumns();
	}  // end main round loop for InvCipher
	
	InvShiftRows();
	InvSubBytes();
	AddRoundKey(0);
	
	// output = state
	for (i = 0; i < (4 * Nb); i++)
	{
        output[i] =  State[i % 4][ i / 4];
	}
	return 1;
}
////////////////////////////////////////////////////////////////////////////////////////////////
//輪密鑰加
int Aes::AddRoundKey(int round)
{
	int i,j;  //i行 j列           //因為密鑰w是一列一列排列的,即 k0 k4 k8 k12
	for(i=0;i<4;i++)			  //							  k1 k5 k9 k13
	{							  //							  k2 k6 k10k14
		for(j=0;j<4;j++)		  //							  k3 k7 k11k15
		{						  // 所以i行j列的下標是4*((round*4)+j)+i即16*round+4*j+i
			State[i][j]=(unsigned char)((int)State[i][j]^(int)w[4*((round*4)+j)+i]);  
		}
	}
	return 1;
}
////////////////////////////////////////////////////////////////////////////////////////////////
//字節代換函數
int Aes::SubBytes()                              //Page 103
{
	int i,j;
	for(i=0;i<4;i++)
	{
		for(j=0;j<4;j++)
		{
			State[i][j]=AesSbox[State[i][j]];   
		}
	}
	return 1;
}
int Aes::InvSubBytes()
{
	int i,j;
	for(i=0;i<4;i++)
	{
		for(j=0;j<4;j++)
		{
			State[i][j]=AesiSbox[State[i][j]]; //因為 16*(State[i][j]>>4)+State[i][j]&0x0f=State[i][j]
		}
	}
  return 1;
}
////////////////////////////////////////////////////////////////////////////////////////////////
int Aes::ShiftRows()
{
	unsigned char temp[4*4];                                        //Page105
	int i,j;
	for(i=0;i<4;i++)
	{
		for(j=0;j<4;j++)
		{
			temp[4*i+j]=State[i][j];
		}
	}
	for(i=1;i<4;i++)
	{
		for(j=0;j<4;j++)
		{
			if(i==1)State[i][j]=temp[4*i+(j+1)%4];					//第一行左移1位
			else if(i==2)State[i][j]=temp[4*i+(j+2)%4];				//第二行左移2位
			else if(i==3)State[i][j]=temp[4*i+(j+3)%4];				//第三行左移3位
		}
	}
return 1;
}
int Aes::InvShiftRows()
{
	unsigned char temp[4*4];
	int i,j;
	for(i=0;i<4;i++)
	{
		for(j=0;j<4;j++)
		{
			temp[4*i+j]=State[i][j];
		}
	}
	for(i=1;i<4;i++)
	{
		for(j=0;j<4;j++)
		{
			if(i==1)State[i][j]=temp[4*i+(j+3)%4];			//第一行右移1位 j-1+4=j+3
			else if(i==2)State[i][j]=temp[4*i+(j+2)%4];		//第二行右移2位 j-2+4=j+2
			else if(i==3)State[i][j]=temp[4*i+(j+1)%4];  	//第三行右移3位 j-3+4=j+2
		}
	}
	return 1;
}
////////////////////////////////////////////////////////////////////////////////////////////////
int Aes::MixColumns()
{
	unsigned char temp[4*4];
	int i,j;
	for(i=0;i<4;i++)                                    //2 3 1 1  列混淆矩陣  Page107
	{													//1 2 3 1
		for(j=0;j<4;j++)								//1 1 2 3
		{												//3 1 1 2
			temp[4*i+j]=State[i][j];
		}
	}
	for(j=0;j<4;j++)
	{
		State[0][j] = (unsigned char) ( (int)gfmultby02(temp[0+j]) ^ (int)gfmultby03(temp[4*1+j]) ^
			(int)gfmultby01(temp[4*2+j]) ^ (int)gfmultby01(temp[4*3+j]) );
		State[1][j] = (unsigned char) ( (int)gfmultby01(temp[0+j]) ^ (int)gfmultby02(temp[4*1+j]) ^
			(int)gfmultby03(temp[4*2+j]) ^ (int)gfmultby01(temp[4*3+j]) );
		State[2][j] = (unsigned char) ( (int)gfmultby01(temp[0+j]) ^ (int)gfmultby01(temp[4*1+j]) ^
			(int)gfmultby02(temp[4*2+j]) ^ (int)gfmultby03(temp[4*3+j]) );
		State[3][j] = (unsigned char) ( (int)gfmultby03(temp[0+j]) ^ (int)gfmultby01(temp[4*1+j]) ^
			(int)gfmultby01(temp[4*2+j]) ^ (int)gfmultby02(temp[4*3+j]) );
	}
	return 1;
}
int Aes::InvMixColumns()
{
	unsigned char temp[4*4];
	int i,j;
	for (i = 0; i < 4; i++)  // copy State into temp[]
	{
        for (j = 0; j < 4; j++)                         //0e 0b 0d 09   逆變換矩陣 Page108
        {												//09 0e 0b 0d
			temp[4*i+j] =  State[i][j];					//0d 09 0e 0b
        }												//0b 0d 09 0e
	}
	
	for (j = 0; j < 4; j++)
	{
		State[0][j] = (unsigned char) ( (int)gfmultby0e(temp[j]) ^ (int)gfmultby0b(temp[4+j]) ^
			(int)gfmultby0d(temp[4*2+j]) ^ (int)gfmultby09(temp[4*3+j]) );
		State[1][j] = (unsigned char) ( (int)gfmultby09(temp[j]) ^ (int)gfmultby0e(temp[4+j]) ^
			(int)gfmultby0b(temp[4*2+j]) ^ (int)gfmultby0d(temp[4*3+j]) );
		State[2][j] = (unsigned char) ( (int)gfmultby0d(temp[j]) ^ (int)gfmultby09(temp[4+j]) ^
			(int)gfmultby0e(temp[4*2+j]) ^ (int)gfmultby0b(temp[4*3+j]) );
		State[3][j] = (unsigned char) ( (int)gfmultby0b(temp[j]) ^ (int)gfmultby0d(temp[4+j]) ^
			(int)gfmultby09(temp[4*2+j]) ^ (int)gfmultby0e(temp[4*3+j]) );
	}
	return 1;
}
////////////////////////////////////////////////////////////////////////////////////////////////
unsigned char Aes::gfmultby01(unsigned char b)
{
	return b;
}
unsigned char Aes::gfmultby02(unsigned char b)
{
	if (b < 0x80)
        return (unsigned char)(int)(b <<1);
	else
        return (unsigned char)( (int)(b << 1) ^ (int)(0x1b) );
}

unsigned char Aes::gfmultby03(unsigned char b)
{
	return (unsigned char) ( (int)gfmultby02(b) ^ (int)b );
}

unsigned char Aes::gfmultby09(unsigned char b)
{
	return (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^ (int)b );
}

unsigned char Aes::gfmultby0b(unsigned char b)
{
	return (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^
		(int)gfmultby02(b) ^ (int)b );
}

unsigned char Aes::gfmultby0d(unsigned char b)
{
	return (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^
		(int)gfmultby02(gfmultby02(b)) ^ (int)(b) );
}

unsigned char Aes::gfmultby0e(unsigned char b)
{
	return (unsigned char)( (int)gfmultby02(gfmultby02(gfmultby02(b))) ^
		(int)gfmultby02(gfmultby02(b)) ^(int)gfmultby02(b) );
}
////////////////////////////////////////////////////////////////////////////////////////////////

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
曰韩精品一区二区| 久久99精品国产| 精品福利二区三区| 91老师国产黑色丝袜在线| 日韩专区在线视频| 国产精品国产三级国产三级人妇 | 久久婷婷久久一区二区三区| 99久久精品国产毛片| 天堂av在线一区| 亚洲女人****多毛耸耸8| 欧美成人一区二区三区| 欧美日韩中文字幕一区二区| 成人va在线观看| 亚洲人吸女人奶水| 91在线观看成人| 91福利国产精品| 亚洲精品乱码久久久久| 免费观看一级特黄欧美大片| 精品日韩在线观看| 欧美一区二区三区系列电影| 91麻豆福利精品推荐| 国产一区二区女| 正在播放亚洲一区| 成人精品视频一区二区三区| a4yy欧美一区二区三区| 在线观看日产精品| 欧美一区三区四区| 最新久久zyz资源站| 亚洲欧洲制服丝袜| 午夜天堂影视香蕉久久| 裸体一区二区三区| 国产精品亚洲а∨天堂免在线| 成人免费va视频| 91国内精品野花午夜精品 | 91精品国产综合久久久久久久久久 | 91在线免费播放| 欧美日韩国产另类一区| 精品欧美黑人一区二区三区| 国产夜色精品一区二区av| 国产精品乱码久久久久久| 亚洲午夜视频在线| 久久精品国产精品亚洲综合| 99视频在线观看一区三区| 欧美亚洲一区二区在线观看| 91精品国产高清一区二区三区 | 亚洲丝袜制服诱惑| 三级欧美韩日大片在线看| 激情六月婷婷综合| 97精品久久久午夜一区二区三区| 欧美精品tushy高清| 亚洲国产精品激情在线观看| 亚洲电影第三页| 国产精品66部| 欧美军同video69gay| 久久久精品影视| 亚洲123区在线观看| 国产成人夜色高潮福利影视| 欧美在线制服丝袜| 久久精品一区八戒影视| 天堂一区二区在线免费观看| 丁香一区二区三区| 91精品国产色综合久久ai换脸| 国产精品久久一卡二卡| 奇米色一区二区三区四区| 色噜噜狠狠一区二区三区果冻| 欧美精品一区二区在线播放| 亚洲宅男天堂在线观看无病毒| 国产精品99久久久久久久vr | 亚洲在线视频一区| 国产精品99久久久| 91麻豆精品国产91久久久| 亚洲欧洲另类国产综合| 国内外成人在线视频| 欧美日韩国产首页在线观看| 国产精品久久久久久久久免费樱桃| 免费精品视频在线| 欧美午夜一区二区三区 | 日产欧产美韩系列久久99| 91在线播放网址| 中文字幕va一区二区三区| 国模冰冰炮一区二区| 欧美一区二区三区在线电影| 国产一区久久久| 69成人精品免费视频| 亚洲免费视频中文字幕| 懂色av噜噜一区二区三区av| 欧美成人免费网站| 日产精品久久久久久久性色| 欧美日韩二区三区| 夜夜精品浪潮av一区二区三区| 成a人片亚洲日本久久| 国产欧美日韩久久| 国产精品12区| 国产人妖乱国产精品人妖| 国内外成人在线视频| 久久综合九色综合97婷婷| 久久精品国产一区二区| 日韩视频一区二区三区| 丝瓜av网站精品一区二区| 欧美狂野另类xxxxoooo| 日韩精品色哟哟| 91精品欧美一区二区三区综合在| 亚洲午夜电影在线观看| 在线看国产一区| 亚洲国产综合色| 色成人在线视频| 18涩涩午夜精品.www| 欧美色图片你懂的| 最新不卡av在线| 国产一二三精品| 91麻豆视频网站| 精品国产乱码久久久久久久久| 免费成人深夜小野草| 欧美岛国在线观看| 久久不见久久见中文字幕免费| 欧美大片在线观看| 韩国成人精品a∨在线观看| 久久久www成人免费毛片麻豆| 国产成人无遮挡在线视频| 久久久精品黄色| 99精品久久只有精品| 一区二区三区不卡在线观看 | av中文字幕一区| 1000部国产精品成人观看| 91色在线porny| 亚洲国产视频在线| 欧美mv日韩mv国产网站app| 国产乱码精品一区二区三| 国产精品乱人伦一区二区| 色欧美片视频在线观看| 亚洲不卡一区二区三区| 日韩丝袜美女视频| 成人久久视频在线观看| 一区二区三区日韩精品视频| 91精品欧美综合在线观看最新| 国产尤物一区二区| 1024精品合集| 欧美一区二区三区四区五区| 国产成人午夜高潮毛片| 一区二区国产视频| 日韩精品中文字幕一区二区三区| 高清视频一区二区| 亚洲一区二区三区国产| 欧美精品一区二区不卡| 一本一道波多野结衣一区二区| 亚洲成av人影院| 久久精品一区蜜桃臀影院| 欧美亚洲一区二区在线| 精品一区二区久久| 亚洲色图一区二区| 欧美zozo另类异族| 色综合久久中文字幕| 免费欧美日韩国产三级电影| 国产精品高潮呻吟久久| 欧美高清hd18日本| 在线观看日韩高清av| 蓝色福利精品导航| 一区二区三区在线不卡| 精品日韩在线观看| 欧美在线影院一区二区| 国产一区二区精品在线观看| 亚洲一区二区三区爽爽爽爽爽| 久久婷婷成人综合色| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 蜜臂av日日欢夜夜爽一区| 亚洲免费av网站| 久久亚洲一级片| 欧美精选一区二区| av激情综合网| 久久狠狠亚洲综合| 亚洲自拍偷拍九九九| 欧美激情一区二区三区全黄| 日韩一级在线观看| 91蜜桃传媒精品久久久一区二区| 看国产成人h片视频| 亚洲一线二线三线久久久| 国产午夜精品一区二区三区嫩草 | 日韩精品福利网| 自拍偷拍国产精品| 久久尤物电影视频在线观看| 欧美日本一道本在线视频| 91丨porny丨最新| 国产91露脸合集magnet| 日韩av电影免费观看高清完整版| 亚洲最新在线观看| 国产精品久久久一区麻豆最新章节| 日韩午夜电影av| 欧美日韩亚洲国产综合| 色综合久久99| www.在线欧美| 不卡的看片网站| 国产成人综合网| 精品系列免费在线观看| 奇米影视7777精品一区二区| 亚洲一区av在线| 尤物在线观看一区| **性色生活片久久毛片| 中文字幕一区在线| 亚洲国产成人午夜在线一区| 久久蜜桃av一区二区天堂|