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

相关文章

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Spring Security中用户名和密码的验证完整流程

《SpringSecurity中用户名和密码的验证完整流程》本文给大家介绍SpringSecurity中用户名和密码的验证完整流程,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 首先创建了一个UsernamePasswordAuthenticationTChina编程oken对象,这是S

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

PostgreSQL数据库密码被遗忘时的操作步骤

《PostgreSQL数据库密码被遗忘时的操作步骤》密码遗忘是常见的用户问题,因此提供一种安全的遗忘密码找回机制是十分必要的,:本文主要介绍PostgreSQL数据库密码被遗忘时的操作步骤的相关资... 目录前言一、背景知识二、Windows环境下的解决步骤1. 找到PostgreSQL安装目录2. 修改p

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

在Spring Boot中实现HTTPS加密通信及常见问题排查

《在SpringBoot中实现HTTPS加密通信及常见问题排查》HTTPS是HTTP的安全版本,通过SSL/TLS协议为通讯提供加密、身份验证和数据完整性保护,下面通过本文给大家介绍在SpringB... 目录一、HTTPS核心原理1.加密流程概述2.加密技术组合二、证书体系详解1、证书类型对比2. 证书获