AES五種加密模式(CBC、ECB、CTR、OCF、CFB)
阿新 • • 發佈:2018-09-13
運算 並行 介紹 span 工作 src ecb book 設置 分組密碼有五種工作體制:1.電碼本模式(Electronic Codebook Book (ECB));2.密碼分組鏈接模式(Cipher Block Chaining (CBC));3.計算器模式(Counter (CTR));4.密碼反饋模式(Cipher FeedBack (CFB));5.輸出反饋模式(Output FeedBack (OFB))。
以下逐一介紹一下:
1.電碼本模式(Electronic Codebook Book (ECB)
這種模式是將整個明文分成若幹段相同的小段,然後對每一小段進行加密。
2.密碼分組鏈接模式(Cipher Block Chaining (CBC))
這種模式是先將明文切分成若幹小段,然後每一小段與初始塊或者上一段的密文段進行異或運算後,再與密鑰進行加密。
3.計算器模式(Counter (CTR)) 計算器模式不常見,在CTR模式中, 有一個自增的算子,這個算子用密鑰加密之後的輸出和明文異或的結果得到密文,相當於一次一密。這種加密方式簡單快速,安全可靠,而且可以並行加密,但是在計算器不能維持很長的情況下,密鑰只能使用一次。CTR的示意圖如下所示: 4.密碼反饋模式(Cipher FeedBack (CFB)) 這種模式較復雜。
5.輸出反饋模式(Output FeedBack (OFB))
這種模式較復雜。
以下附上C++源代碼:
3.計算器模式(Counter (CTR)) 計算器模式不常見,在CTR模式中, 有一個自增的算子,這個算子用密鑰加密之後的輸出和明文異或的結果得到密文,相當於一次一密。這種加密方式簡單快速,安全可靠,而且可以並行加密,但是在計算器不能維持很長的情況下,密鑰只能使用一次。CTR的示意圖如下所示: 4.密碼反饋模式(Cipher FeedBack (CFB)) 這種模式較復雜。
5.輸出反饋模式(Output FeedBack (OFB))
/**
*@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;
}
AES五種加密模式(CBC、ECB、CTR、OCF、CFB)