最近在写一道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 }
解密的代码我很快就会放出来