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 ...
随机推荐
- TC SRM 665 DIV2 B LuckyCycle 暴力
LuckyCycleTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.ac ...
- Anroid自定义RatingBar,显示半个(小数个)的stepSize时,变为整数个的问题
<RatingBar android:id="@+id/rb_starbar" style="@style/joblist_item_ratingbar_style ...
- ClassLoader使用记录《安卓高手之路》
我不喜欢那些泛泛而谈的去讲那些形而上学的道理,更不喜欢记那些既定的东西.靠记忆去弥补思考的人,容易陷入人云亦云的境地,最后必定被记忆所围困,而最终消亡的是创造力.希望这个高手之路系列能够记录我学习安卓 ...
- 查看修改swap空间大小
1 查看swap 空间大小(总计): # free -m 默认单位为k, -m 单位为M total used fr ...
- mysql 日期函数格式
mysql中的from_unixtime函数的format表达式字段描述: %M 月名字(January……December) %W 星期名字(Sunday……Saturday) %D 有英语前缀的 ...
- 第2章 数字之魅——寻找最大的K个数
寻找最大的K个数 问题描述 在面试中,有下面的问答: 问:有很多个无序的数,我们姑且假定它们各不相等,怎么选出其中最大的若干个数呢? 答:可以这样写:int array[100] …… 问:好,如果有 ...
- day06 Java基础
1.二维数组格式一(列固定):数据类型[][] 变量名=new 数据类型[m][n]; 二维数组格式二(列变化):数据类型[][] 变量名=new 数据类型[m][]; 二维数组格式三:数据类型[][ ...
- 各种电子面单_Api接口
电子面单是一种通过热敏纸打印输出纸质物流面单的物流服务.通过热感应显示文字,打印速度比传统针式打印速度提升4~6倍.电子面单以接口形式嵌入到自己的系统.网站上,可以在自己的平台操作打印电子面单. ...
- javaweb学习总结一(eclipse常用快捷键、debug调试以及junit测试框架)
一:web的发展趋势1:C/S(客户端/服务器)结构向B/S(浏览器/服务器)结构发展,以后的电脑只需操作系统和浏览器即可.所有的服务都存储在服务器端,只需用户登录后从服务端同步数据,例如:看电影不需 ...
- 关于使用vss版本管理工具中的sln,suo文件作用
Visual Studio.NET采用两种文件类型(.sln和.suo)来存储特定于解决方案的设置,它们总称为解决方案文件.为解决方案资源管理器提供显示管理文件的图形接口所需的信息 从而在每次继续开发 ...