天天看點

AES加密之五種模式簡介分析

AES加密AES加密之五種模式

  • 簡介
  • 分析
    • 1.電碼本模式(Electronic Codebook Book (ECB)
    • 2.密碼分組連結模式(Cipher Block Chaining (CBC))##
    • 3.電腦模式(Counter (CTR))
    • 4.密碼回報模式(Cipher FeedBack (CFB))
    • 5.輸出回報模式(Output FeedBack (OFB))##
    • 6.代碼 (C++)
      • 定義并初始化相關資料
      • 切片加密函數
      • ECB 電碼本模式加密,4位分段
      • CBC 密碼分組連結模式,4位分段
      • CTR 電腦模式,4位分段
      • CFB 密碼回報模式,4位分段
      • OFB 輸出回報模式,4位分段
      • 列印輸出
      • 調用

copyFrom月之星狼 https://www.cnblogs.com/starwolf/p/3365834.html#undefined

簡介

AES加密是建立在DES加密不能滿足破解難度而産生的。由比利時兩位非常著名的密碼學家Joan Daemen和Vincent Rijmen設計,選取了分組長度為128比特,密鑰長度為128比特、192比特和256比特的三個版本。

分組密碼有五種工作體制:

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

這種模式是将整個明文分成若幹段相同的小段,然後對每一小段進行加密。

AES加密之五種模式簡介分析

2.密碼分組連結模式(Cipher Block Chaining (CBC))##

這種模式是先将明文切分成若幹小段,然後每一小段與初始塊或者上一段的密文段進行異或運算後,再與密鑰進行加密。

AES加密之五種模式簡介分析

3.電腦模式(Counter (CTR))

電腦模式不常見,在CTR模式中,

有一個自增的算子,這個算子用密鑰加密之後的輸出和明文異或的結果得到密文,相當于一次一密。這種加密方式簡單快速,安全可靠,而且可以并行加密,但是在電腦不能維持很長的情況下,密鑰隻能使用一次。CTR的示意圖如下所示:

AES加密之五種模式簡介分析

4.密碼回報模式(Cipher FeedBack (CFB))

這種模式較複雜。

AES加密之五種模式簡介分析

5.輸出回報模式(Output FeedBack (OFB))##

這種模式較複雜。
![輸出回報模式](https://img-blog.csdnimg.cn/20181207154245975.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25jbmNmZjUxMTMxNDIw,size_16,color_FFFFFF,t_70)
           

6.代碼 (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];
    }
}
           

ECB 電碼本模式加密,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;
}