密码之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

相关文章

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密

加密效果: 解密后的数据就是正常数据: 后端:使用的是spring-cloud框架,在gateway模块进行操作 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.0-jre</version></dependency> 编写一个AES加密

模版方法模式template method

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

利用命令模式构建高效的手游后端架构

在现代手游开发中,后端架构的设计对于支持高并发、快速迭代和复杂游戏逻辑至关重要。命令模式作为一种行为设计模式,可以有效地解耦请求的发起者与接收者,提升系统的可维护性和扩展性。本文将深入探讨如何利用命令模式构建一个强大且灵活的手游后端架构。 1. 命令模式的概念与优势 命令模式通过将请求封装为对象,使得请求的发起者和接收者之间的耦合度降低。这种模式的主要优势包括: 解耦请求发起者与处理者

springboot实战学习(1)(开发模式与环境)

目录 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 (3)前端 二、开发模式 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 Validation:做参数校验Mybatis:做数据库的操作Redis:做缓存Junit:单元测试项目部署:springboot项目部署相关的知识 (3)前端 Vite:Vue项目的脚手架Router:路由Pina:状态管理Eleme