AES加密

最近在写一道BUUCTF的题目[SCTF2019]creakme这道题,查看了wp后,发现是aes加密,便上网查了部分资料

如下:

AES加密的五种模式

ECB模式:https://blog.csdn.net/ncncff51131420/article/details/84875851

CBC模式:https://blog.csdn.net/ncncff51131420/article/details/84875851

CTR模式:https://blog.csdn.net/ncncff51131420/article/details/84875851

CFB模式:https://blog.csdn.net/chengqiuming/article/details/82355772

OFB模式:https://blog.csdn.net/chengqiuming/article/details/82390910

这里我直接引用网上所有人都在用的图

分组密码有五种工作体制: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))
    这种模式较复杂。
 

具体的代码实现,网上一搜有一大片(本来自己写了一份代码的,不过写到ofb和cfb的时候,感觉有点麻烦就全部都cv了)

 

  1 /**
  2 *@autho stardust
  3 *@time 2013-10-10
  4 *@param 实现AES五种加密模式的测试
  5 */
  6 #include <iostream>
  7 using namespace std;
  8 
  9 //加密编码过程函数,16位1和0
 10 int dataLen = 16;   //需要加密数据的长度
 11 int encLen = 4;     //加密分段的长度
 12 int encTable[4] = { 1,0,1,0 };  //置换表
 13 int data[16] = { 1,0,0,1,0,0,0,1,1,1,1,1,0,0,0,0 }; //明文
 14 int ciphertext[16]; //密文
 15 
 16 //切片加密函数
 17 void encode(int arr[])
 18 {
 19     for (int i = 0; i < encLen; i++)
 20     {
 21         arr[i] = arr[i] ^ encTable[i];
 22     }
 23 }
 24 
 25 //电码本模式加密,4位分段
 26 void ECB(int arr[])
 27 {
 28     //数据明文切片
 29     int a[4][4];
 30     int dataCount = 0;  //位置变量
 31     for (int k = 0; k < 4; k++)
 32     {
 33         for (int t = 0; t < 4; t++)
 34         {
 35             a[k][t] = ::data[dataCount];
 36             dataCount++;
 37         }
 38     }
 39     dataCount = 0;//重置位置变量
 40     for (int i = 0; i < dataLen; i = i + encLen)
 41     {
 42         int r = i / encLen;//
 43         int l = 0;//
 44         int encQue[4]; //编码片段
 45         for (int j = 0; j < encLen; j++)
 46         {
 47             encQue[j] = a[r][l];
 48             l++;
 49         }
 50         encode(encQue); //切片加密
 51         //添加到密文表中
 52         for (int p = 0; p < encLen; p++)
 53         {
 54             ciphertext[dataCount] = encQue[p];
 55             dataCount++;
 56         }
 57     }
 58     cout << "ECB加密的密文为:" << endl;
 59     for (int t1 = 0; t1 < dataLen; t1++) //输出密文
 60     {
 61         if (t1 != 0 && t1 % 4 == 0)
 62             cout << endl;
 63         cout << ciphertext[t1] << " ";
 64     }
 65     cout << endl;
 66     cout << "---------------------------------------------" << endl;
 67 }
 68 
 69 //CBC
 70 //密码分组链接模式,4位分段
 71 void CCB(int arr[])
 72 {
 73     //数据明文切片
 74     int a[4][4];
 75     int dataCount = 0;  //位置变量
 76     for (int k = 0; k < 4; k++)
 77     {
 78         for (int t = 0; t < 4; t++)
 79         {
 80             a[k][t] = ::data[dataCount];
 81             dataCount++;
 82         }
 83     }
 84     dataCount = 0;//重置位置变量
 85 
 86     int init[4] = { 1,1,0,0 };  //初始异或运算输入
 87     //初始异或运算
 88     for (int i = 0; i < dataLen; i = i + encLen)
 89     {
 90         int r = i / encLen;//
 91         int l = 0;//
 92         int encQue[4]; //编码片段
 93         //初始化异或运算
 94         for (int k = 0; k < encLen; k++)
 95         {
 96             a[r][k] = a[r][k] ^ init[k];
 97         }
 98         //与Key加密的单切片
 99         for (int j = 0; j < encLen; j++)
100         {
101             encQue[j] = a[r][j];
102         }
103         encode(encQue); //切片加密
104         //添加到密文表中
105         for (int p = 0; p < encLen; p++)
106         {
107             ciphertext[dataCount] = encQue[p];
108             dataCount++;
109         }
110         //变换初始输入
111         for (int t = 0; t < encLen; t++)
112         {
113             init[t] = encQue[t];
114         }
115     }
116 
117 
118     cout << "CCB加密的密文为:" << endl;
119     for (int t1 = 0; t1 < dataLen; t1++) //输出密文
120     {
121         if (t1 != 0 && t1 % 4 == 0)
122             cout << endl;
123         cout << ciphertext[t1] << " ";
124     }
125     cout << endl;
126     cout << "---------------------------------------------" << endl;
127 }
128 
129 //CTR
130 //计算器模式,4位分段
131 void CTR(int arr[])
132 {
133     //数据明文切片
134     int a[4][4];
135     int dataCount = 0;  //位置变量
136     for (int k = 0; k < 4; k++)
137     {
138         for (int t = 0; t < 4; t++)
139         {
140             a[k][t] = ::data[dataCount];
141             dataCount++;
142         }
143     }
144     dataCount = 0;//重置位置变量
145 
146     int init[4][4] = { {1,0,0,0},{0,0,0,1},{0,0,1,0},{0,1,0,0} };  //算子表
147     int l = 0; //明文切片表列
148     //初始异或运算
149     for (int i = 0; i < dataLen; i = i + encLen)
150     {
151         int r = i / encLen;//
152         int encQue[4]; //编码片段
153         //将算子切片
154         for (int t = 0; t < encLen; t++)
155         {
156             encQue[t] = init[r][t];
157         }
158         encode(encQue); //算子与key加密
159         //最后的异或运算
160         for (int k = 0; k < encLen; k++)
161         {
162             encQue[k] = encQue[k] ^ a[l][k];
163         }
164         l++;
165 
166         //添加到密文表中
167         for (int p = 0; p < encLen; p++)
168         {
169             ciphertext[dataCount] = encQue[p];
170             dataCount++;
171         }
172     }
173 
174 
175     cout << "CTR加密的密文为:" << endl;
176     for (int t1 = 0; t1 < dataLen; t1++) //输出密文
177     {
178         if (t1 != 0 && t1 % 4 == 0)
179             cout << endl;
180         cout << ciphertext[t1] << " ";
181     }
182     cout << endl;
183     cout << "---------------------------------------------" << endl;
184 }
185 
186 //CFB
187 //密码反馈模式,4位分段
188 void CFB(int arr[])
189 {
190     //数据明文切片,切成2 * 8 片
191     int a[8][2];
192     int dataCount = 0;  //位置变量
193     for (int k = 0; k < 8; k++)
194     {
195         for (int t = 0; t < 2; t++)
196         {
197             a[k][t] = ::data[dataCount];
198             dataCount++;
199         }
200     }
201     dataCount = 0;  //恢复初始化设置
202     int lv[4] = { 1,0,1,1 };  //初始设置的位移变量
203     int encQue[2]; //K的高两位
204     int k[4]; //K
205 
206     for (int i = 0; i < 2 * encLen; i++) //外层加密循环
207     {
208         //产生K
209         for (int vk = 0; vk < encLen; vk++)
210         {
211             k[vk] = lv[vk];
212         }
213         encode(k);
214         for (int k2 = 0; k2 < 2; k2++)
215         {
216             encQue[k2] = k[k2];
217         }
218         //K与数据明文异或产生密文
219         for (int j = 0; j < 2; j++)
220         {
221             ciphertext[dataCount] = a[dataCount / 2][j] ^ encQue[j];
222             dataCount++;
223         }
224         //lv左移变换
225         lv[0] = lv[2];
226         lv[1] = lv[3];
227         lv[2] = ciphertext[dataCount - 2];
228         lv[3] = ciphertext[dataCount - 1];
229     }
230 
231     cout << "CFB加密的密文为:" << endl;
232     for (int t1 = 0; t1 < dataLen; t1++) //输出密文
233     {
234         if (t1 != 0 && t1 % 4 == 0)
235             cout << endl;
236         cout << ciphertext[t1] << " ";
237     }
238     cout << endl;
239     cout << "---------------------------------------------" << endl;
240 }
241 
242 //OFB
243 //输出反馈模式,4位分段
244 void OFB(int arr[])
245 {
246     //数据明文切片,切成2 * 8 片
247     int a[8][2];
248     int dataCount = 0;  //位置变量
249     for (int k = 0; k < 8; k++)
250     {
251         for (int t = 0; t < 2; t++)
252         {
253             a[k][t] = ::data[dataCount];
254             dataCount++;
255         }
256     }
257     dataCount = 0;  //恢复初始化设置
258     int lv[4] = { 1,0,1,1 };  //初始设置的位移变量
259     int encQue[2]; //K的高两位
260     int k[4]; //K
261 
262     for (int i = 0; i < 2 * encLen; i++) //外层加密循环
263     {
264         //产生K
265         for (int vk = 0; vk < encLen; vk++)
266         {
267             k[vk] = lv[vk];
268         }
269         encode(k);
270         for (int k2 = 0; k2 < 2; k2++)
271         {
272             encQue[k2] = k[k2];
273         }
274         //K与数据明文异或产生密文
275         for (int j = 0; j < 2; j++)
276         {
277             ciphertext[dataCount] = a[dataCount / 2][j] ^ encQue[j];
278             dataCount++;
279         }
280         //lv左移变换
281         lv[0] = lv[2];
282         lv[1] = lv[3];
283         lv[2] = encQue[0];
284         lv[3] = encQue[1];
285     }
286 
287     cout << "CFB加密的密文为:" << endl;
288     for (int t1 = 0; t1 < dataLen; t1++) //输出密文
289     {
290         if (t1 != 0 && t1 % 4 == 0)
291             cout << endl;
292         cout << ciphertext[t1] << " ";
293     }
294     cout << endl;
295     cout << "---------------------------------------------" << endl;
296 }
297 
298 
299 void printData()
300 {
301     cout << "以下示范AES五种加密模式的测试结果:" << endl;
302     cout << "---------------------------------------------" << endl;
303     cout << "明文为:" << endl;
304     for (int t1 = 0; t1 < dataLen; t1++) //输出密文
305     {
306         if (t1 != 0 && t1 % 4 == 0)
307             cout << endl;
308         cout << ::data[t1] << " ";
309     }
310     cout << endl;
311     cout << "---------------------------------------------" << endl;
312 }
313 int main()
314 {
315     printData();
316     ECB(::data);
317     CCB(::data);
318     CTR(::data);
319     CFB(::data);
320     OFB(::data);
321     return 0;
322 }
View Code

 

解密的代码我很快就会放出来

 

原文地址:https://www.cnblogs.com/pppyyyzzz/p/13726707.html