AES五种加密模式

来源:互联网 发布:windows下重启jenkins 编辑:程序博客网 时间:2024/05/15 00:34

分组密码有五种工作体制: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和0int 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++) //输出密文    {        if(t1!=0 && t1%4==0)            cout<<endl;        cout<<ciphertext[t1]<<" ";    }    cout<<endl;    cout<<"---------------------------------------------"<<endl;}void printData(){    cout<<"以下示范AES五种加密模式的测试结果:"<<endl;    cout<<"---------------------------------------------"<<endl;    cout<<"明文为:"<<endl;    for(int t1=0;t1<dataLen;t1++) //输出密文    {        if(t1!=0 && t1%4==0)            cout<<endl;        cout<<data[t1]<<" ";    }    cout<<endl;    cout<<"---------------------------------------------"<<endl;}int main(){    printData();    ECB(data);    CCB(data);    CTR(data);    CFB(data);    OFB(data);    return 0;}
0 0
原创粉丝点击