/** *@autho stardust *@time 2013-10-10 *@param 實現AES五種加密模式的測試 */ #include <iostream> using namespace std; //加密編碼過程函數,16位1和0 int dataLen = 16; //須要加密數據的長度 int encLen = 4; //加密分段的長度 int encTable[4] = {1,0,1,0}; //置換表 int data[16] = {1,0,0,1,0,0,0,1,1,1,1,1,0,0,0,0}; //明文 int ciphertext[16]; //密文 //切片加密函數 void encode(int arr[]) { for(int i=0;i<encLen;i++) { arr[i] = arr[i] ^ encTable[i]; } } //電碼本模式加密,4位分段 void ECB(int arr[]) { //數據明文切片 int a[4][4]; int dataCount = 0; //位置變量 for(int k=0;k<4;k++) { for(int t=0;t<4;t++) { a[k][t] = data[dataCount]; dataCount++; } } dataCount = 0;//重置位置變量 for(int i=0;i<dataLen;i=i+encLen) { int r = i/encLen;//行 int l = 0;//列 int encQue[4]; //編碼片斷 for(int j=0;j<encLen;j++) { encQue[j] = a[r][l]; l++; } encode(encQue); //切片加密 //添加到密文表中 for(int p=0;p<encLen;p++) { ciphertext[dataCount] = encQue[p]; dataCount++; } } cout<<"ECB加密的密文爲:"<<endl; for(int t1=0;t1<dataLen;t1++) //輸出密文 { if(t1!=0 && t1%4==0) cout<<endl; cout<<ciphertext[t1]<<" "; } cout<<endl; cout<<"---------------------------------------------"<<endl; } //CBC //密碼分組連接模式,4位分段 void CCB(int arr[]) { //數據明文切片 int a[4][4]; int dataCount = 0; //位置變量 for(int k=0;k<4;k++) { for(int t=0;t<4;t++) { a[k][t] = data[dataCount]; dataCount++; } } dataCount = 0;//重置位置變量 int init[4] = {1,1,0,0}; //初始異或運算輸入 //初始異或運算 for(int i=0;i<dataLen;i=i+encLen) { int r = i/encLen;//行 int l = 0;//列 int encQue[4]; //編碼片斷 //初始化異或運算 for(int k=0;k<encLen;k++) { a[r][k] = a[r][k] ^ init[k]; } //與Key加密的單切片 for(int j=0;j<encLen;j++) { encQue[j] = a[r][j]; } encode(encQue); //切片加密 //添加到密文表中 for(int p=0;p<encLen;p++) { ciphertext[dataCount] = encQue[p]; dataCount++; } //變換初始輸入 for(int t=0;t<encLen;t++) { init[t] = encQue[t]; } } cout<<"CCB加密的密文爲:"<<endl; for(int t1=0;t1<dataLen;t1++) //輸出密文 { if(t1!=0 && t1%4==0) cout<<endl; cout<<ciphertext[t1]<<" "; } cout<<endl; cout<<"---------------------------------------------"<<endl; } //CTR //計算器模式,4位分段 void CTR(int arr[]) { //數據明文切片 int a[4][4]; int dataCount = 0; //位置變量 for(int k=0;k<4;k++) { for(int t=0;t<4;t++) { a[k][t] = data[dataCount]; dataCount++; } } dataCount = 0;//重置位置變量 int init[4][4] = {{1,0,0,0},{0,0,0,1},{0,0,1,0},{0,1,0,0}}; //算子表 int l = 0; //明文切片表列 //初始異或運算 for(int i=0;i<dataLen;i=i+encLen) { int r = i/encLen;//行 int encQue[4]; //編碼片斷 //將算子切片 for(int t=0;t<encLen;t++) { encQue[t] = init[r][t]; } encode(encQue); //算子與key加密 //最後的異或運算 for(int k=0;k<encLen;k++) { encQue[k] = encQue[k] ^ a[l][k]; } l++; //添加到密文表中 for(int p=0;p<encLen;p++) { ciphertext[dataCount] = encQue[p]; dataCount++; } } cout<<"CTR加密的密文爲:"<<endl; for(int t1=0;t1<dataLen;t1++) //輸出密文 { if(t1!=0 && t1%4==0) cout<<endl; cout<<ciphertext[t1]<<" "; } cout<<endl; cout<<"---------------------------------------------"<<endl; } //CFB //密碼反饋模式,4位分段 void CFB(int arr[]) { //數據明文切片,切成2 * 8 片 int a[8][2]; int dataCount = 0; //位置變量 for(int k=0;k<8;k++) { for(int t=0;t<2;t++) { a[k][t] = data[dataCount]; dataCount++; } } dataCount = 0; //恢復初始化設置 int lv[4] = {1,0,1,1}; //初始設置的位移變量 int encQue[2]; //K的高兩位 int k[4]; //K for(int i=0;i<2 * encLen;i++) //外層加密循環 { //產生K for(int vk=0;vk<encLen;vk++) { k[vk] = lv[vk]; } encode(k); for(int k2=0;k2<2;k2++) { encQue[k2] = k[k2]; } //K與數據明文異或產生密文 for(int j=0;j<2;j++) { ciphertext[dataCount] = a[dataCount/2][j] ^ encQue[j]; dataCount++; } //lv左移變換 lv[0] = lv[2]; lv[1] = lv[3]; lv[2] = ciphertext[dataCount-2]; lv[3] = ciphertext[dataCount-1]; } cout<<"CFB加密的密文爲:"<<endl; for(int t1=0;t1<dataLen;t1++) //輸出密文 { if(t1!=0 && t1%4==0) cout<<endl; cout<<ciphertext[t1]<<" "; } cout<<endl; cout<<"---------------------------------------------"<<endl; } //OFB //輸出反饋模式,4位分段 void OFB(int arr[]) { //數據明文切片,切成2 * 8 片 int a[8][2]; int dataCount = 0; //位置變量 for(int k=0;k<8;k++) { for(int t=0;t<2;t++) { a[k][t] = data[dataCount]; dataCount++; } } dataCount = 0; //恢復初始化設置 int lv[4] = {1,0,1,1}; //初始設置的位移變量 int encQue[2]; //K的高兩位 int k[4]; //K for(int i=0;i<2 * encLen;i++) //外層加密循環 { //產生K for(int vk=0;vk<encLen;vk++) { k[vk] = lv[vk]; } encode(k); for(int k2=0;k2<2;k2++) { encQue[k2] = k[k2]; } //K與數據明文異或產生密文 for(int j=0;j<2;j++) { ciphertext[dataCount] = a[dataCount/2][j] ^ encQue[j]; dataCount++; } //lv左移變換 lv[0] = lv[2]; lv[1] = lv[3]; lv[2] = encQue[0]; lv[3] = encQue[1]; } cout<<"CFB加密的密文爲:"<<endl; for(int t1=0;t1<dataLen;t1++) //輸出密文 { if(t1!=0 && t1%4==0) cout<<endl; cout<<ciphertext[t1]<<" "; } cout<<endl; cout<<"---------------------------------------------"<<endl; } void printData() { cout<<"如下示範AES五種加密模式的測試結果:"<<endl; cout<<"---------------------------------------------"<<endl; cout<<"明文爲:"<<endl; for(int t1=0;t1<dataLen;t1++) //輸出密文 { if(t1!=0 && t1%4==0) cout<<endl; cout<<data[t1]<<" "; } cout<<endl; cout<<"---------------------------------------------"<<endl; } int main() { printData(); ECB(data); CCB(data); CTR(data); CFB(data); OFB(data); return 0; }