CCM加密学习
这几天终于搞定了AES硬件加密工具的使用,几种简单的加密模式也都实验通过了,比较麻烦的一种是CCM模式的加密,它是CTR加密模式和CMAC认证算法的混合使用。本文先介绍CCM模式的原理与基本实现,然后结合OpenSSL的加密库,了解一下具体过程,最后,在AES硬件加密引擎上实现。
CCM介绍
CCM是CTR加密模式和CMAC认证算法的混合使用,常用在需要同时加密和认证的领域,比如WiFi安全中的WPE协议,它就使用了AES-CCM模式。
CCM首先使用CBC-MAC模式来认证传输帧,然后使用CTR模式来加密帧。在这里,用于加密的初始化向量IV构成结构如下:

sequence counter表示在一个帧中16个字节块的数目. Flags域结构如下:

Bit7设置为0,Adata为1的话,表示此帧有额外的认证数据,为0则表示没有额外的认证数据。M为认证域长度经过转换后的结果.L固定为1. 在不同的安全模式下,初始化向量中的Flags值不同。
从上表可以看出,只要有MIC的存在,那么Adata就必须为1.
首先引入两个CCM模式下的两个参数:
L : 长度域,取值为2~8, OpenSSL中缺省为8
M : tag的长度,可选范围为4,6,8,10,12,14,16.OpenSSL中缺省为12
接下来,将详细描述如何在硬件加密模块上实现CCM模式的认证和加密。
在硬件AES加密引擎上面,没有完整的实现CCM模式的加密,需要软硬件一起配合,才能实现CCM模式。
在CCM模式下CBC-MAC
对于待加密数据中的前数据块,采用CBC-MAC模式加密生成认证域,对于最后一个数据块,需要改为使用CBC模式加密。当最后一个数据块载入AES硬件加密引擎后,从AES读出的就是消息的MAC校验码。
在CCM模式下CTR
以下是认证执行的步骤。
1. 载入加密密钥
2. 载入全0的初始化向量
3. 构建一个16个字节的数组B,其第一个元素B[0]需要有如下的构造。

其中,Flag的值和安全级别有关系,具体关系间下表。

其他内容元素按规则来填充。
4. 按照16字节加密块来划分,第一个块填充初始化向量,第二个块填充Adata相关内容,第三个块(或者更多块)填充明文内容
5. 先按照CBC_MAC模式加密前N-1个块,最后一个数据块使用CBC模式来加密.当认证域长度为16时,CBC_MAC加密后的内容是不变的,如果不为16,则高M字节内容保持不变,其余字节变为0.
6. 等待加密完成后,从结果中,读出Mval个字节到Cstate就可以了。
函数头说明:
void Test_SSP_CCM_Auth (uint8 Mval, // 认证域字节长度 [0,4,8,16]
uint8 *N, // N 指向13字节的随机数
uint8 *M, // M 指向明文的指针
uint16 len_m, // len_m 明文长度
uint8 *A, // A 指向Adata的指针
uint16 len_a, // len_a 数据长度
uint8 *AesKey, //AesKey 指向密钥的指针
uint8 *Cstate) //输出Cstate 缓存
加密步骤:
CCM模式下的加密,需要使用前面生产的Cstate值,具体使用步骤如下:
加密也需要初始化向量,其构成如下:

当在OFB模式,将认证域加密生产U时,CTR的值必须为0,当在CTR模式,CTR的值必须不为0
1. 创建A块,并按照规则来填充A[0],当做后的IV
2. 创建T块,将Cstate的前Mval填充到T中。
3.分配缓存,用于填充输入明文,不足16字节的补0.
4. 以OFB模式,将明文T加密输出到Cstate[也叫做U]。当认证域长度为16时,上传缓存内容保持不变,如果不为16,则上传内容的高M位保持不变,其余字节变为0.结果为U.
5. 以CTR模式,将IV最高字节设置为1,重新载入IV,然后加密明文缓存块
6. 最后的结果,是输出的密文块加上U,都是16字节对齐的。
void Test_SSP_CCM_Encrypt (uint8 Mval, //认证域字节长度 [0,4,8,16]
uint8 *N, //指向13个字节的随机数指针
uint8 *M, //指向待加密明文 (明文输出也在这里,多加16个字节的空间)
uint16 len_m, //待加密明文长度
uint8 *AesKey, //AekKey密钥指针
uint8 *Cstate) //明文的认证域内容
从目前浅显的理解上来看,CCM的认证和加密好像是相互独立设置的,从逻辑上,一段明文进来,先通过认证,产生一个tag,在后续加密时使用此Tag和IV生成一个新的校验U.原负载明文填充满后,通过CTR模式来加密数据,在密文的后面附上新的校验码U,这样,就完成了校验和加密的过程。
---------------今天就先介绍到这里,还有解密过程和代码没贴上来,周一来了再贴-----------------------
-------------------周一来了,整理剩下的代码---------------------------------------------------
解密的过程和加密的相反,先解密,再解认证。
void Test_SSP_CCM_Decrypt (uint8 Mval, //认证域长度
uint8 *N, //随机数
uint8 *C, //待解密密文指针
uint16 len_c, //待解密密文长度
uint8 *AesKey, //解密密钥
uint8 *Cstate) //认证域内容
解密流程:
1. 先利用随机数,构造A向量
2. 从待解密密文中提取最后Mval字节(补全16个字节)到U向量中
3. 通过OFB模式,来将U解密成T
4. 通过CTR模式,将密文解密成明文
5. 最后,将T附加在明文后
鉴权的过程是利用上述解密出来的明文,全场为len_c,认证域长度位为Mval,位置在字节的尾端,鉴权就是把解密的明文,通过(len_c-Mval)长度鉴权计算,把得到的结果和解密输出的结果进行对比,如果相同,则鉴权成功,否则,鉴权失败。
参考资料:openssl学习之ccm,gcm 模式
CCM加密学习的更多相关文章
- SQLite XXTea加密学习
这几天优化数据库读写,移植了xxtea加密到最新的数据库sqlite 3.12.2里,一些好文章放在这里.移植后,数据库读写性能异常优秀! 这几天又发现,数据库还是发生了无法写入情况,数据库崩溃掉了. ...
- (C#基础)各种加密学习
之前,一直想对这个做一个了解,但是总是坚持不下去,很急躁.最近看了几遍文章,很有感触,于是又来重新开始学习,从最最基础的开始——正所谓“慢就是快”.心态变了,继续吧!上代码! using System ...
- WIFI_认证加密学习_STA_AP_WDS
2-1.1_15_使用卡1_准备工作及配置内核====================================1.无线网卡连接上路由或AP之后使用上是和有线网卡是一样的,都是socket编程. ...
- MD5加密学习
MD5(Message Digest --消息摘要算法)算法是一种散列(hash)算法(摘要算法,指纹算法),不是一种加密算法(易错),任何长度的任意内容都可以用MD5计算出散列值.主要作用是[验明“ ...
- C# Winform MD5加密学习积累
string password = txtPassword.Text.Trim(); byte[] result = Encoding.Default.GetBytes(password); MD5 ...
- ios开发Base64编码以及加密相关学习
一:.Base64补充 ```objc 1.Base64简单说明 描述:Base64可以成为密码学的基石,非常重要. 特点:可以将任意的二进制数据进行Base64编码 结果:所有的数据都能被编码为并只 ...
- CCM和GCM
分组密码链接-消息认证码--CCM Counter with CBC-MAC 组成CCM的关键算法是AES加密算法.CTR工作模式和CMAC认证算法,在加密和MAC算法中共用一个密钥K. CCM ...
- SMBv3远程代码执行漏洞复现(CVE-2020-0796)
漏洞基本信息 服务器消息块(SMB),是一个网络通信协议,用于提供共享访问到文件,打印机和串行端口的节点之间的网络上.它还提供了经过身份验证的进程间通信机制.SMB的大多数用法涉及运行Microsof ...
- CentOS7 下编译安装 Samba,什么是 SMB/CIFS 协议
目录 一.关于 Samba 1. SMB 2. Samba 二.yum 安装 Samba 1. 安装 Samba 2. 查看版本 3. 查看配置文件 4. 启动服务 5. 本地客户端验证 6. Win ...
随机推荐
- Python 学习之二:Python超短教程
前言 本教程综合Stanford CS231N和UC Berkerley CS188的Python教程. 教程非常短,但适合有一定编程基础.学过其它语言的童鞋. Python 启动Python 解释器 ...
- 高级I/O之STREAMS
http://en.wikipedia.org/wiki/STREAMS STREAMS(流)是系统V提供的构造内核设备驱动程序和网络协议包的一种通用方法,对STREAMS进行讨论的目的是为了理解系统 ...
- 出错处理完美搭配之perror&exit
对于库函数出错处理有两个十分有用的函数perror和exit: 一.错误报告 perror函数用一种简单统一的方式报告错误.ANSI C中的许多库函数,尤其是I/O函数,会调用操作系统去执行一些工作. ...
- PAT 1001
Calculate a + b and output the sum in standard format -- that is, the digits must be separated into ...
- 最简单的Java调用C/C++代码的步骤
1)首先在Java类中声明一个native的方法 (2)使用javah命令生成包含native方法声明的C/C++头文件 (3)按照生成的C/C++头文件来写C/C++源文件 (4)将C/C++源文件 ...
- [PHP] Eclipse开发PHP环境配置
首先准备好软件: 1. Apache,到这里找个最新版本 2. PHP,到这里下载 3. Eclipse IDE for Java EE Developers,到这里下载 4. DLTK Core F ...
- Java基础知识强化102:线程间共享数据
一.每个线程执行的代码相同: 若每个线程执行的代码相同,共享数据就比较方便.可以使用同一个Runnable对象,这个Runnable对象中就有那个共享数据. public class MultiThr ...
- javaweb学习总结九(xml解析以及调整JVM内存大小)
一:解析XML文件的两种方式 1:dom,document object model,文档对象模型. 2:sax,simple API for XML. 3:比较dom和sax解析XML文件的优缺点 ...
- javaweb学习总结一(eclipse常用快捷键、debug调试以及junit测试框架)
一:web的发展趋势1:C/S(客户端/服务器)结构向B/S(浏览器/服务器)结构发展,以后的电脑只需操作系统和浏览器即可.所有的服务都存储在服务器端,只需用户登录后从服务端同步数据,例如:看电影不需 ...
- IIS 7.0、IIS 7.5 和 IIS 8.0 中的 HTTP 状态代码 转
http://support.microsoft.com/kb/943891/zh-cn 日志文件位置 默认情况下,IIS 7.0.IIS 7.5 和 IIS 8.0 将日志文件放在以下文件夹中: i ...