AES五种加密模式(CBCECBCTROCFCFB)

Posted unique叶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AES五种加密模式(CBCECBCTROCFCFB)相关的知识,希望对你有一定的参考价值。

分组密码有五种工作体制: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++) //AES的五种加密模式(CBCECBCTROCFCFB)

AES五种加密模式(CBCECBCTROCFCFB)

AES五种加密模式(CBCECBCTROCFCFB)

AES五种加密模式

AES共有ECB,CBC,CFB,OFB,CTR五种模式分别有啥区别

AES共有ECB,CBC,CFB,OFB,CTR五种模式分别有啥区别