分组密码有五种工作体制: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++源代码:
*@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 ;