AES CCM详解

news2024/12/24 14:22:59

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 AES

def 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, tag

def 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 plaintext

key = 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.coloradmin.cn/o/2171501.html

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

相关文章

企业微信扫码登录

请求url 可以看到如下结果&#xff1a; 请求的URL是 reqauth.aspx&#xff0c;这是发起认证的第一步&#xff0c;这个请求的返回结果是一个 XML 数据&#xff0c;包含一个 ReqID&#xff0c;用户授权的地址 AuthUrl 以及查询结果的地址 ResultUrl。 如果直接访问这个地址&…

sysctl 命令:Linux内核参数管理

一、命令简介 ​sysctl​是一个用于查看、设置和管理内核参数的命令行工具。 ‍ 二、命令参数 sysctl [选项] [内核参数]选项: ​-a​, --all​: 显示所有参数及其当前值。​-n​: 仅显示值&#xff0c;不显示参数名。​-w​: 设置参数的值。 ‍ 三、命令示例 查看所有…

理解:基础地理实体相关概述

理解&#xff1a;基础地理实体相关概述 地理实体 geo-entity 现实世界中占据一定且连续空间位置和范围、单独具有同一属 性或完整功能的地理对象。 基础地理实体 fundamental geo-entity 通过基础测绘采集和表达的地理实体&#xff0c;是其他地理实体和相关 信息的定位框架与…

Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架。它是 Spring 项目家族的一员,用于构建安全的 Java 应用程序。

Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架。它是 Spring 项目家族的一员&#xff0c;用于构建安全的 Java 应用程序。Spring Security 提供了全面的安全服务&#xff0c;从基本的登录认证到复杂的访问控制&#xff0c;几乎涵盖了所有与安全相关的需求…

线程与线程安全,生产消费者模型

线程与进程 2390. 从字符串中移除星号 给你一个包含若干星号 * 的字符串 s 。 在一步操作中&#xff0c;你可以&#xff1a; 选中 s 中的一个星号。移除星号 左侧 最近的那个 非星号 字符&#xff0c;并移除该星号自身。 返回移除 所有 星号之后的字符串**。** 注意&#xff1a…

ubuntu 设置静态IP

一、 ip addresssudo nano /etc/netplan/50-cloud-init.yaml 修改前&#xff1a; 修改后&#xff1a; # This file is generated from information provided by the datasource. Changes # to it will not persist across an instance reboot. To disable cloud-inits # ne…

深度解析与解决方案:U盘有盘符但无法打开的困境

引言&#xff1a;U盘困境初现 在日常工作与生活中&#xff0c;U盘作为便携式存储设备&#xff0c;扮演着数据传输与备份的重要角色。然而&#xff0c;不少用户会遇到这样一个棘手问题&#xff1a;U盘在插入电脑后能够正常显示盘符&#xff0c;但尝试打开时却遭遇拒绝访问或提示…

巧用时间换空间:解读 ArcGraph 如何灵活应对有限内存下的图分析

导读&#xff1a;ArcGraph 是一款云原生架构、存查分析一体化的分布式图数据库。本文将详细解读 ArcGraph 如何灵活应对有限内存下的图分析。 01 引言 在图分析技术广泛应用的当下&#xff0c;学术界和各大图数据库厂商热衷于提升图分析技术的高性能指标。然而&#xff0c;追求…

STM32嵌入式编程学习到提高:【5】delay函数

------------------------------------------------------------------------------------------------------------------------- 工程文件&#xff1a;放在百度云盘里&#xff0c;需要的自行下载&#xff01;&#xff01;&#xff01; 链接:http:// https://pan.baidu.com/s…

【3D分割】Segment Anything in 3D with Radiance Fields

论文链接&#xff1a;Segment Anything in 3D with Radiance Fields 代码链接&#xff1a;GitHub - Jumpat/SegmentAnythingin3D: Segment Anything in 3D with NeRFs (NeurIPS 2023) 作者&#xff1a;Jiazhong Cen, Jiemin Fang, Zanwei Zhou, Chen Yang, Lingxi Xie, Xiaop…

DataLight(V1.4.5) 版本更新,新增 Ranger、Solr

DataLight&#xff08;V1.4.5&#xff09; 版本更新&#xff0c;新增 Ranger、Solr DataLight 迎来了重大的版本更新&#xff0c;现已发布 V1.4.5 版本。本次更新对平台进行了较多的功能拓展和优化&#xff0c;新增了对 Ranger 和 Solr 服务组件的支持&#xff0c;同时对多项已…

微服务的优点及在云原生时代的合理落地方式

云计算de小白 那么&#xff0c;微服务到底能给业务带来什么好处&#xff1f;在云原生时代&#xff0c;如何更合理地实现微服务&#xff1f; 架构没有好坏之分&#xff0c;只有适合与不适合。然而&#xff0c;当我们对比微服务架构与单体架构时&#xff0c;可以发现微服务有以…

【【通信协议之UDP协议】】

通信协议之UDP协议 UDP &#xff08;user Datagram Protocol )用户数据报协议 整个的UDP数据格式 如下所示 TCP协议与UDP协议的区别 TCP协议面向连接&#xff0c;是流传输协议&#xff0c;通过连接发送数据&#xff0c;而 UDP 协议传输不需要连接&#xff0c;是数据包协议 …

[3]Opengl ES着色器

术语&#xff1a; VertexShader&#xff1a;顶点着色器&#xff0c;用来描述图形图像位置的顶点坐标&#xff1b; FragmentShader&#xff1a;片元着色器&#xff0c;用来给顶点指定的区域进行着色&#xff1b; Vertex&#xff1a;顶点 Texture&#xff1a;纹理…

【中级通信工程师】终端与业务(十一):市场营销计划、实施与控制

【零基础3天通关中级通信工程师】 终端与业务(十一)&#xff1a;市场营销计划、实施与控制 本文是中级通信工程师考试《终端与业务》科目第十一章《市场营销计划、实施与控制》的复习资料和真题汇总。本章的核心内容涵盖了市场营销计划的编制、实施过程以及控制方式&#xff0…

【Java异常】(简简单单拿捏)

【Java异常】&#xff08;简简单单拿捏&#xff09; 1. 异常的简单介绍2. 异常的抛出2.1 语法 3. 异常的处理3.1 异常声明throws3.2 try-catch捕获并处理 4. 例子&#xff08;try-catch自定义异常&#xff09; 1. 异常的简单介绍 程序员在运行代码时会遇到很多异常&#xff0c…

Python :AVIF 图片与其他图片格式间的批量转换

图片格式 AVIF转换为常见的格式&#xff0c;比如 JPG 或 PNG。本文介绍如何使用 Pillow 库实现AVIF与其他格式的相互转换。 环境配置 使用 Python 环境管理工具 conda 和常用库 Pillow 来处理图片格式转换。环境的详细信息&#xff1a; Conda: 24.7.1Python: 3.8.19Pillow: 10…

【HTML|第1期】HTML5视频(Video)元素详解:从起源到应用

日期&#xff1a;2024年9月9日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉在这里插入代码片得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对…

plt绘图日常训练

目录 练习1练习2练习3练习4练习5 前几节课已经介绍plt常用的函数&#xff0c;这节课主要是一些练习&#xff0c;方便大家熟悉 练习1 主要学习plt.figure()及plt的基本操作 import matplotlib.pyplot as plt import numpy as npxnp.linspace(-3,3,50) y1 2*x1 y2x**2plt.figur…

Windows下安装 LLama-Factory 保姆级教程

本机配置 品牌&#xff1a;联想拯救者Y9000x-2022CPU&#xff1a;12th Gen Intel Core™ i7-12700H 2.30 GHzRAM&#xff1a;24.0 GB (23.8 GB 可用)GPU&#xff1a; NVIDIA GeForce RTX 3060 Laptop GPU 6GCUDA版本&#xff1a;12.3 (可以在PowerShell下输入 nvidia-smi 命令…