分组密码的模式AES-CBC模式流程解析附:应用代码实现

news2024/12/24 0:35:46

CBC模式:Cipher Block Chaining mode(密码分组链接模式)

CBC模式的加解密

CBC模式中,首先将明文分组与前一个密文分组进行XOR运算,然后再进行加密。密文分组像链条一样相互连接在一起。

CBC模式的加密流程图

在这里插入图片描述

CBC模式的解密流程图

在这里插入图片描述

将一个分组的加密过程分离出来,对ECB模式和CBC模式进行比较,ECB模式只进行了加密,而CBC模式则在加密之前进行了一次XOR。

ECB模式与CBC模式的比较

在这里插入图片描述

初始化向量

当加密第一个明文分组时,由于不存在”前一个密文分组“,因此需要事先准备一个长度为一个分组的比特序列来替代”前一个密文分组“,这个比特序列称为初始化向量,通常缩写为IV。通常,每次加密时都会随机产生一个不同的比特序列来作为初始化向量。

注:在UDS 27hex服务中不同的初始化向量可以代表着不同的解锁等级。

应用代码:演示加密和解密过程。

/**
 * @file mainCBC.c
 * @author jimu (minijimu@foxmail.com)
 * @brief 
 * @version 0.1
 * @date 2024-09-02
 * 
 * @addtogroup 《图解密技术-第3版》
 * @copyright Copyright (c) 2024
 * 
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "aes.h"

// 假设我们有一个密钥和一个初始化向量(IV)
uint8_t key[AES_KEYLEN] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10};
uint8_t iv[AES_BLOCKLEN] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10};

// 加密函数
void encrypt(uint8_t *plaintext, uint8_t *ciphertext, size_t length)
{
    uint8_t *padded_text = (uint8_t *)malloc(length);
    memset(padded_text, 0, length);
    memcpy(padded_text, plaintext, length);
    AES_ctx ctx;
    AES_init_ctx_iv(&ctx, key, iv);
    if (length % AES_BLOCKLEN != 0)
    {
        printf("Error: Plaintext length must be a multiple of AES block size.\n");
        exit(1);
    }
    AES_CBC_encrypt_buffer(&ctx, padded_text, length);
    memcpy(ciphertext, padded_text, length);
    free(padded_text);
}

// 解密函数
void decrypt(uint8_t *ciphertext, uint8_t *decryptedtext, size_t length)
{
    AES_ctx ctx;
    AES_init_ctx_iv(&ctx, key, iv);
    if (length % AES_BLOCKLEN != 0)
    {
        printf("Error: Ciphertext length must be a multiple of AES block size.\n");
        exit(1);
    }
    AES_CBC_decrypt_buffer(&ctx, ciphertext, length);
    memcpy(decryptedtext, ciphertext, length);
}

int main()
{
    // 假设我们有一个明文消息
    const uint8_t plaintext[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, 0x00};
    size_t plaintext_len = sizeof(plaintext);

    // 虽然plaintext_len 是 AES_BLOCKLEN 的倍数,但是在加密和解密之前,我们需要确保 plaintext_len 是 AES_BLOCKLEN 的倍数。
    // 当前可认为是无填充模式。
    if (plaintext_len % AES_BLOCKLEN != 0)
    {
        plaintext_len = (plaintext_len / AES_BLOCKLEN + 1) * AES_BLOCKLEN;
    }

    // 为密文和明文缓冲区分配内存
    uint8_t *ciphertext = (uint8_t *)malloc(plaintext_len);
    uint8_t *decryptedtext = (uint8_t *)malloc(plaintext_len);

    printf("IV: ");
    for (size_t i = 0; i < AES_BLOCKLEN; i++)
    {
        printf("%02x", iv[i]);
    }
    printf("\n");
    printf("plaintext: ");
    for (size_t i = 0; i < sizeof(plaintext); i++)
    {
        printf("%02x", plaintext[i]);
    }
    printf("\n");
    // 加密
    encrypt((uint8_t *)plaintext, ciphertext, plaintext_len);

    // 打印密文
    printf("Ciphertext text:");
    for (size_t i = 0; i < plaintext_len; i++)
    {
        printf("%02x", ciphertext[i]);
    }
    printf("\n");

    // 解密
    decrypt(ciphertext, decryptedtext, plaintext_len);

    // 打印解密后的明文
    // printf("Decrypted text: %s\n", decryptedtext);
    printf("Decrypted text: ");
    for (size_t i = 0; i < plaintext_len; i++)
    {
        printf("%02x", decryptedtext[i]);
    }
    printf("\n");

    // 使用 memcmp 比较原始明文和解密后的文本
    if (memcmp(plaintext, decryptedtext, plaintext_len) == 0)
    {
        printf("Decryption successful!\n");
    }
    else
    {
        printf("Decryption failed!\n");
    }

    // 释放内存
    free(ciphertext);
    free(decryptedtext);
    getchar();
    return 0;
}

  • 对比代码加密和工具加密的结果

对比代码加密和工具加密的结果

代码简述

  1. 定义明文 plaintext 和其长度 plaintext_len
  2. 确保 plaintext_len 是 AES 块大小的倍数。
  3. 分配内存用于存储密文和解密后的明文。
  4. 打印初始化向量(IV)和明文。
  5. 调用 encrypt 函数加密明文。
  6. 打印密文。
  7. 调用 decrypt 函数解密密文。
  8. 打印解密后的明文。
  9. 比较原始明文和解密后的明文,确认解密成功。
  10. 释放内存。

CBC模式应用场景

  • 文件加密 :CBC 模式适合于加密静态文件,如备份文件或存储在硬盘上的数据。
  • 通信加密 :在网络通信中,CBC 模式可用于加密数据包,尤其是在需要确保数据块间相关性的场景下。
  • 数据库加密 :在数据库中存储敏感信息时,可以使用 CBC 模式来加密记录或字段。

实际应用注意事项

  • IV 的管理 :IV 应该是随机的,并且对于每个加密操作都是唯一的。IV 需要与密文一起存储或传输,以便解密时使用。
  • 填充机制 :选择合适的填充机制,并确保解密时正确去除填充。
  • 完整性检查 :单独使用 CBC 模式无法提供数据完整性验证。通常需要结合 MAC(Message Authentication Code)或数字签名来确保数据的完整性和真实性。
    并且对于每个加密操作都是唯一的。IV 需要与密文一起存储或传输,以便解密时使用。
  • 填充机制 :选择合适的填充机制,并确保解密时正确去除填充。
  • 完整性检查 :单独使用 CBC 模式无法提供数据完整性验证。通常需要结合 MAC(Message Authentication Code)或数字签名来确保数据的完整性和真实性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2099413.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 `wget` 和 `curl` 命令行工具的全面指南

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

3.3 语法规则

&#x1f393; 微机原理考点专栏&#xff08;通篇免费&#xff09; 欢迎来到我的微机原理专栏&#xff01;我将帮助你在最短时间内掌握微机原理的核心内容&#xff0c;为你的考研或期末考试保驾护航。 为什么选择我的视频&#xff1f; 全程考点讲解&#xff1a;每一节视频都…

Oracle RAC关于多节点访问同一个数据的过程

一、说明 Oracle RAC 存在多个计算节点&#xff0c;但是使用的共享存储。那么多个节点共同访问同一个资源&#xff0c;怎么保证一致性。 白文的逻辑理解简述&#xff1a; 用户1访问rac1 &#xff0c;通过rac1获取AA数据块后&#xff0c;会加上latch锁。用户2通过rac2访问AA数据…

union不能被初始化由于有 non-trivial构造函数

背景 最近遇到一个问题&#xff0c;当定义一个union的时候&#xff0c;发现初始化失败&#xff0c;具体如下&#xff1a; class NonTrivial { public:NonTrivial(const std::string& s) : data(s) {std::cout << "NonTrivial constructed with " <<…

嵌入式OTG硬件电路分析

大家好,今天主要给大家分享一下,如何使用OTG硬件检测电路,和之前的接口有什么区别。 1. OTG接口与转换器 OTG是"On The Go"的英文缩写,字面上可以理解为“安上即可用”。USB传输是主从结构,一切USB传输都有Host发起。比如在开发板上可以插入U盘,这时开发板作为…

计算机毕业设计选题推荐-店铺租赁平台-商铺租赁系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

【简历】25届武汉某二本JAVA简历:项目描述真是难为学生想这么偏

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这是一份 25 届武汉某二本学校的JAVA简历。校招第一要点是上来必须先确定自己的求职层次&#xff0c;大中小厂要求不一样。二本同学主体…

Day 10-11:函数、函数传参

基本用法以及传参 基本用法 调用 1.无返回值函数调用 #include<stdio.h> #pragma warning(disable:4996); void my_helloworld() {printf("hello world!"); } int main() {my_helloworld();return 0; } //输出结果&#xff1a;hello world&#xff01;2.实际…

Leetcode每日刷题之438.找到字符串中所有字符异位词

1.题目解析 本题的题目要求是给定一个长字符串s与一个较短字符串p&#xff0c;判断s中是否有一段与p长度相同的字符串是由p打乱而得来&#xff0c;即为异位词&#xff0c;然后返回其开始位置下标&#xff0c;遍历s字符串中所有满足条件字符串的起始位置下标 2.算法原理 我们将p…

android AccessibilityService合法合规采集大众点评app商店商品详情(2024-09-02)

免责任声明: 任何可操作性的内容与本人无关,文章内容仅供参考学习&#xff0c;如有侵权损害贵公司利益&#xff0c;请联系作者&#xff0c;会立刻马上进行删除。 一、原理介绍 1、打开大众点评app商店 public void open_shop(Context context,String shop_id){String url"…

ARM基础知识---CPU---处理器

目录 一、ARM架构 1.1.RAM---随机存储器 1.2.ROM---只读存储器 1.3.flash---闪存存储器 1.4.时钟&#xff08;振晶&#xff09; 1.5.复位 二、CPU---ARM920T 2.1.R0~R12---通用寄存器 2.2.PC程序计数器 2.3.LR连接寄存器 2.4.SP栈指针寄存器 2.5.CPSR当前程序状态寄存…

【MySQL进阶】索引性能分析

1. 索引语法 创建索引&#xff1a; ​ 语法格式&#xff1a;create [unique|fulltext] index index_name on table_name(index_col_name...); 查看索引&#xff1a; ​ 语法格式&#xff1a;show index from table_name; 删除索引&#xff1a; ​ 语法格式&#xff1a;dr…

Spring Boot实现License生成和校验

1.License应用场景 在我们向客户销售商业软件的时候&#xff0c;常常需要对所发布的软件实行一系列管控措施&#xff0c;诸如验证使用者身份、软件是否到期&#xff0c;以及保存版权信息和开发商详情等。考虑到诸多应用场景可能处于离线环境&#xff0c;无法依赖网络进行实时认…

5.数据结构-c/c++二叉树详解(上篇)(遍历方法,完全二叉树)

目录 一. 二叉树的基本介绍 1.2 满二叉树 1.3 完全二叉树 1.4 搜索二叉树 1.5 平衡二叉搜索树 二. 二叉树的常用操作 2.1 二叉树的定义 2.2 创建一个新的节点 2.3 构建一颗树 2.5 销毁一棵树 三.二叉树的前序&#xff0c;中序&#xff0c;后序&#xff0c;层序遍历方…

day-47 子集

思路 利用深度优先遍历算法&#xff0c;对于每个数有选或不选两种抉择&#xff0c;每次遍历到idslen时将p加入答案中 解题过程 选中当前数字&#xff0c;调用dfs函数之后记得还原 Code class Solution {public int len;public List<List<Integer>> listnew Arra…

51单片机的智能台灯设计【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块DS1302时间模块光敏传感器模块人体红外模块按键等模块构成。适用于智能台灯、自动调节灯光亮度等相似项目。 可实现基本功能: 1、LCD1602实时显示北京时间、环境光照强度、手动/自动模式、台灯亮度等信息&#xff1…

笔记整理—uboot番外(1)命令体系

在uboot启动进行命令行的环境下&#xff0c;当输入命令时&#xff0c;将会对命令进行先解析后执行的操作。 uboot/common/cmd_xxx.c 其中就有多个命令体系&#xff08;mian.c和commann.c&#xff09; uboot每个命令都对应了一个相关的函数&#xff0c;由此实现的命令体系与…

字符统计及重排

题目描述 给出一个仅包含字母的字符串&#xff0c;不包含空格&#xff0c;统计字符串中各个字母(区分大小写)出现的次数 并按照字母出现次数从大到小的顺序。输出各个字母及其出现次数。 如果次数相同&#xff0c;按照自然顺序进行排序&#xff0c;且小写字母在大写字母之前&a…

2024年【氧化工艺】考试及氧化工艺最新解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 氧化工艺考试考前必练&#xff01;安全生产模拟考试一点通每个月更新氧化工艺最新解析题目及答案&#xff01;多做几遍&#xff0c;其实通过氧化工艺操作证考试很简单。 1、【单选题】 废水经生物脱氮工艺、吹脱工艺等…

如何自学通过软考中级系统集成项目管理工程师?

虽然中级项目管理工程师&#xff08;以下简称中项&#xff09;考试相对较容易&#xff0c;但如果你是零基础&#xff0c;不建议完全依靠自学。 中项属于软考的"信息系统"专业&#xff0c;是中级资格。熟悉软考的人都知道&#xff0c;软考包括初级、中级、高级3个级别…