• 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

     

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

     

  • 相关阅读:
    Unity3D中使用委托和事件
    进程与线程浅析(三)之线程三国战斗模拟
    NGUI学习笔记(一)UILabel介绍
    Mongodb学习笔记(2)--修改器
    Mongodb学习笔记(1)--入门
    Java8学习笔记(七)--Collectors
    Java8学习笔记(六)--Optional
    Java8学习笔记(五)--Stream API详解[转]
    Java8学习笔记(四)--接口增强
    Java8学习笔记(三)--方法引入
  • 原文地址:https://www.cnblogs.com/pppyyyzzz/p/13726707.html
Copyright © 2020-2023  润新知