密码之AES五种加密模式(CBC、ECB、CTR、OCF、CFB)

转:https://www.cnblogs.com/starwolf/p/3365834.html

分组密码有五种工作体制:

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 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

     { 

         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

    {

          int r = i/encLen;//行 

          int l = 0;//列 

         int encQue[4]; //编码片段 

         for(int j=0;j

         { encQue[j] = a[r][l]; l++; } 

         encode(encQue); //切片加密 

       //添加到密文表中 

       for(int p=0;p

       { ciphertext[dataCount] = encQue[p]; dataCount++; }

   } 

    cout<<"ECB加密的密文为:"<

     for(int t1=0;t1

     { if(t1!=0 && t1%4==0) cout<

      cout<

      cout<<"---------------------------------------------"<

}

      //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

         { 

                int r = i/encLen;//行

                 int l = 0;//列 

                int encQue[4]; //编码片段 

                //初始化异或运算

                 for(int k=0;k

                 { a[r][k] = a[r][k] ^ init[k]; } 

                //与Key加密的单切片 

                for(int j=0;j

                { encQue[j] = a[r][j]; }

                 encode(encQue);

                 //切片加密 

                //添加到密文表中 

                for(int p=0;p

                { ciphertext[dataCount] = encQue[p]; dataCount++; } 

                //变换初始输入 

                for(int t=0;t

                 { init[t] = encQue[t]; } 

            }

             cout<<"CCB加密的密文为:"<

            for(int t1=0;t1

            { 

                if(t1!=0 && t1%4==0) 

                cout<

                cout<

             } 

            cout<

            cout<<"---------------------------------------------"<

 }

 //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

     { 

         int r = i/encLen;//行

         int encQue[4]; //编码片段

         //将算子切片 

        for(int t=0;t

         { encQue[t] = init[r][t]; }

         encode(encQue); //算子与key加密 

        //最后的异或运算 

        for(int k=0;k

         { encQue[k] = encQue[k] ^ a[l][k]; }

         l++; 

        //添加到密文表中

         for(int p=0;p

        { ciphertext[dataCount] = encQue[p]; dataCount++; } 

    } 

    cout<<"CTR加密的密文为:"<

     for(int t1=0;t1

     { 

        if(t1!=0 && t1%4==0) cout<

     }

     cout<

 } 

//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

         { 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加密的密文为:"<

    for(int t1=0;t1

    { if(t1!=0 && t1%4==0) cout<

    cout<

 } 

//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

        {

             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加密的密文为:"<

     for(int t1=0;t1

    { if(t1!=0 && t1%4==0) cout<

    cout<

    cout<<"---------------------------------------------"<


void printData()

 { 

    cout<<"以下示范AES五种加密模式的测试结果:"<

    cout<<"---------------------------------------------"<

    cout<<"明文为:"<

    for(int t1=0;t1

    { if(t1!=0 && t1%4==0) cout<

     cout<

    cout<<"---------------------------------------------"<

 }

 int main() 

{

     printData();

     ECB(data); 

    CCB(data); 

    CTR(data);

     CFB(data); 

    OFB(data);

     return 0; 

}

你可能感兴趣的:(密码之AES五种加密模式(CBC、ECB、CTR、OCF、CFB))