zoukankan      html  css  js  c++  java
  • 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

     

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

     

  • 相关阅读:
    UVa 1354 天平难题 (枚举二叉树)
    广西邀请赛总结
    UVa 12118 检查员的难题 (dfs判连通, 构造欧拉通路)
    UVA
    Uva 127 "Accordian" Patience (模拟)
    UVA 10539 Almost Prime Numbers( 素数因子)
    HDU 1272 小希的迷宫(并查集)
    HDU 1213 How Many Tables (并查集)
    POJ 2236 Wireless Network(并查集)
    HDU 1233 还是畅通工程 ( Kruskal或Prim)
  • 原文地址:https://www.cnblogs.com/pppyyyzzz/p/13726707.html
Copyright © 2011-2022 走看看