AES CCM详解

AES CCM是一种对数据进行加密及完整性检查的算法,主要用到AES中的CBC(完整性检查)和CTR(对明文进行加密),除此之外,还涉及到对数据的格式化(本文着重阐述)

文章目录

    • 加密过程
      • STEPS
    • 解密及校验过程
      • STEPS
    • 格式化
      • B0的构成
      • B0解析举例
      • AAD的格式化
      • Payload的格式化
      • CTRn的组成
    • 例子
      • Python验证

加密过程

在这里插入图片描述

STEPS

在这里插入图片描述
从图中可以观察到,在加密开始时需要传入的有Nonce, AAD(associated data),P(Payload或者叫明文),而从CCM加密流程出来后得到结果C,由加密后的密文和加密后的TAG(或者叫MAC)组成,具体的CBC和CTR是怎么回事在此文不做具体介绍,需要了解的可以看这里

解密及校验过程

在这里插入图片描述

STEPS

在这里插入图片描述
理解了加密过程后,看这个解密过程和校验MAC的过程就会简单不少,对于知道CBC和CTR的同学来说,上方的图不难理解,唯一的盲点在于如何将[N, A, P]这三者格式化成B0, B1, B2,…, Br,下面就详细谈谈这点

格式化

B0的构成

在这里插入图片描述
Flags的组成:
在这里插入图片描述
Flags由以下四部分组成:

  • bit7 Reserved预留为以后扩展,设定为0
  • Adata标记是否有无associated data,1代表有,0代表无
  • bit3-bit5用于编码TAG(或者叫MAC)的长度,比如最终需要8字节的TAG,那么t=8,bit3-bit5被编码为011
  • bit0-bit2用于编码明文长度所占据的字节数,比如q=2,即bit0-bit2编码为001,此时Q占据2字节,Q就是明文的长度,可表示范围0-65535

图中的N代表Nonce,可以发现Nonce的长度和Q的长度相加等于15,这就代表Nonce的数据如果越少,那么可表示明文长度的范围越大,值得注意的是,000编码在Flags的bit3-bit5和bit0-bit2均是不被允许的,即需要满足t >= 4, q >= 2, Len(Nonce) <= 13,CCM中各个长度需要满足的条件如下:

在这里插入图片描述

B0解析举例

在这里插入图片描述

AAD的格式化

在B0之后紧跟着的就是格式化后的AAD(如果B0 Flags中Adata存在) , 由AAD的长度AAD数据补0构成
假设AAD的长度为a字节,对a的格式化如下:
在这里插入图片描述
如果a=2^16,那么编码为11111111 11111110 00000000 00000001 00000000 000000000,在此之后再连接AAD,连接完成后需要补0,补到啥效果呢?即补最少的0,达到格式化后的AAD长度是Block长度(16B)的倍数。也就是说,格式化后的AAD可能会占据多个Block。

Payload的格式化

这个相对而言就比较简单了,就是在Payload后面补最少的0,使得格式化后的Payload长度是Block长度(16字节)的倍数

最终格式化后的数据为B0 || format(AAD) || format(Payload), 明显这最终的数据长度肯定是按Block长度对齐的,满足了CBC加密的要求,那CTR加密过程中的Ctr0, Ctr1,…是怎么构成的呢?

CTRn的组成

在这里插入图片描述
在这里插入图片描述
q是前面B0中的那个q,代表Payload(明文)的长度所占据的空间,i就是Ctrn中的n,从0不断加1,即0,1,2,3…, N就是Nonce


例子

好了,到目前为止应该已经将AES CCM中的细节讲得差不多了,下面举个例子,可以对照着看是否理解上方的流程,如果需要更详细的资料,可以参考这里

在这里插入图片描述

Python验证

from Crypto.Cipher import AESdef aes_ccm_encrypt(key, plaintext, nonce, associated_data):cipher = AES.new(key, AES.MODE_CCM, nonce=nonce, mac_len=4)cipher.update(associated_data)ciphertext, tag = cipher.encrypt_and_digest(plaintext)return ciphertext, tagdef aes_ccm_decrypt(key, ciphertext, tag, nonce, associated_data):cipher = AES.new(key, AES.MODE_CCM, nonce=nonce, mac_len=4)cipher.update(associated_data)plaintext = cipher.decrypt_and_verify(ciphertext, tag)return plaintextkey = bytes([0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f])
nonce = bytes([0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16])
associated_data = bytes([0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07])
plaintext = bytes([0x20, 0x21, 0x22, 0x23])if __name__ == '__main__':# 加密ciphertext, tag = aes_ccm_encrypt(key, plaintext, nonce, associated_data)print("Ciphertext:", ' '.join('{:02x}'.format(i) for i in ciphertext))print("Tag:", ' '.join('{:02x}'.format(i) for i in tag))# 解密及验证try:decrypted_plaintext = aes_ccm_decrypt(key, ciphertext, tag, nonce, associated_data)print("Decrypted_plaintext:", ' '.join('{:02x}'.format(i) for i in decrypted_plaintext))except (ValueError, KeyError) as e:print("Decryption failed:", e)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

David律所代理Beau Parsons的小狗插画图案版权维权,速排查下架

案件基本情况&#xff1a;起诉时间&#xff1a;2024-9-16案件号&#xff1a;2024-cv-08505原告&#xff1a;Beau Parsons原告律所&#xff1a;David起诉地&#xff1a;伊利诺伊州北部法院涉案商标/版权&#xff1a;原告品牌简介&#xff1a;Beau Parsons是一位来自澳大利亚的专…

C++模拟实现list:list、list类的初始化和尾插、list的迭代器的基本实现、list的完整实现、测试、整个list类等的介绍

文章目录 前言一、list二、list类的初始化和尾插三、list的迭代器的基本实现四、list的完整实现五、测试六、整个list类总结 前言 C模拟实现list&#xff1a;list、list类的初始化和尾插、list的迭代器的基本实现、list的完整实现、测试、整个list类等的介绍 一、list list本…

[Linux]从零开始的Minecraft服务器搭建教程

一、前言 学习Linux有一段时间了&#xff0c;当然&#xff0c;我们要把学习的知识运用到实际生活中去。最近朋友们都在玩我的世界&#xff0c;网易版的我的世界联机非常不稳定&#xff0c;用起来也算是非常难受了。所以还是准备转战JAVA版。为了联机&#xff0c;可以考虑一个人…

计算机网络 --- Socket 编程

序言 在上一篇文章中&#xff0c;我们介绍了 协议&#xff0c;协议就是一种约定&#xff0c;规范了双方通信需要遵循的规则、格式和流程&#xff0c;以确保信息能够被准确地传递、接收和理解。  在这篇文章中我们将介绍怎么进行跨网络数据传输&#xff0c;在这一过程中相信大家…

CSS调整背景

一、设置背景颜色 通过 background-color 属性指定&#xff0c;值可以是十六进制 #ffffff&#xff0c;也可以是rgb(0, 255, 255)&#xff0c;或是颜色名称 "red" div {background-color: red; /* 通过颜色名称设置 */background-color: #ff0000; /* 通过十六进制设…

图像分割(九)—— Mask Transfiner for High-Quality Instance Segmentation

Mask Transfiner for High-Quality Instance Segmentation Abstract1. Intrudouction3. Mask Transfiner3.1. Incoherent Regions3.2. Quadtree for Mask RefinementDetection of Incoherent Regions四叉树的定义与构建四叉树的细化四叉树的传播 3.3. Mask Transfiner Architec…

GreenPlum与PostgreSQL数据库

*** Greenplum*** 是一款开源数据仓库。基于开源的PostgreSQL改造&#xff0c;主要用来处理大规模数据分析任务&#xff0c;相比Hadoop&#xff0c;Greenplum更适合做大数据的存储、计算和分析引擎 它本质上是多个PostgreSQL面向磁盘的数据库实例一起工作形成的一个紧密结合的数…

【数据结构中的哈希】

泛黄的春联还残留在墙上.......................................................................................................... 文章目录 前言 一、【哈希结构的介绍】 1.1【哈希结构的概念】 1.2【哈希冲突】 1.3【哈希函数的设计】 1.4【应对哈希冲突的办法】 一、…

神经网络(一):神经网络入门

文章目录 一、神经网络1.1神经元结构1.2单层神经网络&#xff1a;单层感知机1.3两层神经网络&#xff1a;多层感知机1.4多层神经网络 二、全连接神经网络2.1基本结构2.2激活函数、前向传播、反向传播、损失函数2.2.1激活函数的意义2.2.2前向传播2.2.3损失函数、反向传播2.2.4梯…

数据工程师岗位常见面试问题-1(附回答)

数据工程师已成为科技行业最重要的角色之一&#xff0c;是组织构建数据基础设施的骨干。随着企业越来越依赖数据驱动的决策&#xff0c;对成熟数据工程师的需求会不断上升。如果您正在准备数据工程师面试&#xff0c;那么应该掌握常见的数据工程师面试问题&#xff1a;包括工作…

Spring Cloud Gateway接入WebSocket:实现实时通信

在现代的微服务架构中&#xff0c;实时通信变得越来越重要。Spring Cloud Gateway作为Spring Cloud生态中的API网关&#xff0c;提供了动态路由、监控、弹性、安全等功能。本文将介绍如何通过Spring Cloud Gateway接入WebSocket&#xff0c;实现服务之间的实时通信。 为什么需…

Spring异常处理-@ExceptionHandler-@ControllerAdvice-全局异常处理

文章目录 ResponseBodyControllerAdvice最终的异常处理方式 异常的处理分两类 编程式处理&#xff1a;也就是我们的try-catch 声明式处理&#xff1a;使用注解处理 ResponseBody /*** 测试声明式异常处理*/ RestController public class HelloController {//编程式的异常处理&a…

Mitsuba 渲染基础

Mitsuba 渲染基础 0. Abstract1. 安装 Mitsuba21.1 下载 Mitsuba2 源码1.2 选择后端 (variants)1.3 编译 2. [Mitsuba2PointCloudRenderer](https://github.com/tolgabirdal/Mitsuba2PointCloudRenderer)2.1 Mitsuba2 渲染 XML2.2 Scene 场景的 XML 文件格式2.2.1 chair.npy to…

设计模式之装饰模式(Decorator)

前言 这个模式带给我们有关组合跟继承非常多的思考 定义 “单一职责” 模式。动态&#xff08;组合&#xff09;的给一个对象增加一些额外的职责。就增加功能而言&#xff0c;Decorator模式比生成子类&#xff08;继承&#xff09;更为灵活&#xff08;消除重复代码 & 减少…

JavaWeb招聘信息管理系统

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 spring-mybatis.xml3.5 spring-mvc.xml3.5 login.jsp 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优…

利用Langchain开发框架研发智能体Agent的过程,以及相关应用场景

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下本文主要介绍了利用langchain开发智能体agent的过程。文章首先阐述了项目背景&#xff0c;随后通过给出样例代码&#xff0c;详细展示了执行过程。此外&#xff0c;本文还探讨了该智能体agent在实际应用场景中的运用…

Excel根据一个值匹配一行数据

根据一个值从一个表中匹配一行数据&#xff0c;例如从左边的表中找到指定姓名的所有行数据 使用VLOOKUP函数&#xff0c;参数&#xff1a; Lookup_value&#xff1a;需要搜索的值&#xff0c;单个值 Table_array&#xff1a;被搜索的区域&#xff0c;是个表 Col_index_num&…

【Python基础(一)】

学习分享 一、基本语法1、输出print语句2、常量的写法3、运算符 (/) 与(//)4、字符串5、列表5.1、列表查询元素是否存在5.2、列表查询元素是否存在5.3、身份运算符5.4、列表的增删改查 6、元组6.1、tuple() 7、字典8、函数8.1、值传递8.2、引用传递8.3、函数的传参 二、文件的操…

AWS Network Firewall -NAT网关配置只应许白名单域名出入站

1. 创建防火墙 选择防火墙的归属子网(选择公有子网) 2. 创建规则白名单域名放行 3. 绑定相关规则

Spring JDBC及声明式事务

目录 Spring JDBC基础概念 Spring声明式事务 事务传播方式 Spring JDBC基础概念 Spring JDBC 封装了原生的JDBC API&#xff0c;使得处理关系型数据库更加简单。Spring JDBC的核心是JdbcTemplate&#xff0c;里面封装了大量数据库CRUD的操作。使用Spring JDBC…