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

2024-05-04 02:58

本文主要是介绍密码之AES五种加密模式(CBC、ECB、CTR、OCF、CFB),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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++) //输出密文 

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

}


 

这篇关于密码之AES五种加密模式(CBC、ECB、CTR、OCF、CFB)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/958211

相关文章

Oracle登录时忘记用户名或密码该如何解决

《Oracle登录时忘记用户名或密码该如何解决》:本文主要介绍如何在Oracle12c中忘记用户名和密码时找回或重置用户账户信息,文中通过代码介绍的非常详细,对同样遇到这个问题的同学具有一定的参... 目录一、忘记账户:二、忘记密码:三、详细情况情况 1:1.1. 登录到数据库1.2. 查看当前用户信息1.

SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)

《SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)》本文介绍了如何在SpringBoot项目中使用Jasypt对application.yml文件中的敏感信息(如数... 目录SpringBoot使用Jasypt对YML文件配置内容进行加密(例:数据库密码加密)前言一、J

Java中将异步调用转为同步的五种实现方法

《Java中将异步调用转为同步的五种实现方法》本文介绍了将异步调用转为同步阻塞模式的五种方法:wait/notify、ReentrantLock+Condition、Future、CountDownL... 目录异步与同步的核心区别方法一:使用wait/notify + synchronized代码示例关键

MySQL9.0默认路径安装下重置root密码

《MySQL9.0默认路径安装下重置root密码》本文主要介绍了MySQL9.0默认路径安装下重置root密码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录问题描述环境描述解决方法正常模式下修改密码报错原因问题描述mysqlChina编程采用默认安装路径,

Python使用Pandas对比两列数据取最大值的五种方法

《Python使用Pandas对比两列数据取最大值的五种方法》本文主要介绍使用Pandas对比两列数据取最大值的五种方法,包括使用max方法、apply方法结合lambda函数、函数、clip方法、w... 目录引言一、使用max方法二、使用apply方法结合lambda函数三、使用np.maximum函数

MySQL修改密码的四种实现方式

《MySQL修改密码的四种实现方式》文章主要介绍了如何使用命令行工具修改MySQL密码,包括使用`setpassword`命令和`mysqladmin`命令,此外,还详细描述了忘记密码时的处理方法,包... 目录mysql修改密码四种方式一、set password命令二、使用mysqladmin三、修改u

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

电脑密码怎么设置? 一文读懂电脑密码的详细指南

《电脑密码怎么设置?一文读懂电脑密码的详细指南》为了保护个人隐私和数据安全,设置电脑密码显得尤为重要,那么,如何在电脑上设置密码呢?详细请看下文介绍... 设置电脑密码是保护个人隐私、数据安全以及系统安全的重要措施,下面以Windows 11系统为例,跟大家分享一下设置电脑密码的具体办php法。Windo

数据库oracle用户密码过期查询及解决方案

《数据库oracle用户密码过期查询及解决方案》:本文主要介绍如何处理ORACLE数据库用户密码过期和修改密码期限的问题,包括创建用户、赋予权限、修改密码、解锁用户和设置密码期限,文中通过代码介绍... 目录前言一、创建用户、赋予权限、修改密码、解锁用户和设置期限二、查询用户密码期限和过期后的修改1.查询用

Java中的密码加密方式

《Java中的密码加密方式》文章介绍了Java中使用MD5算法对密码进行加密的方法,以及如何通过加盐和多重加密来提高密码的安全性,MD5是一种不可逆的哈希算法,适合用于存储密码,因为其输出的摘要长度固... 目录Java的密码加密方式密码加密一般的应用方式是总结Java的密码加密方式密码加密【这里采用的