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 ...
随机推荐
- QuickXdev+sublime text打造quick-cocos2d-x开发环境
Sublime 插件安装方法: 一.简单的安装方法 使用Ctrl+`快捷键或者通过View->Show Console菜单打开命令行,粘贴如下代码: import urllib.request, ...
- delphi TTreeView组件遍历磁盘目录
TTreeView组件遍历磁盘目录 实例说明 TTreeView组件是一个以分枝结构或者说树状结构显示数据的组件,以该组件显示数据具有较好的等级关系和逻辑层次,并且易于操作.在组件中显示的数据结构与系 ...
- delphi 05 图片和超链接
超链接 /取消超链接 插入/取消 书签 插入图片 粘贴图上CTRL+v 截图 插入表情GIF WEB背景色 WEB背景图片 WebBrowser1.OleObject.document.ge ...
- iOS开发——网络Swift篇&NSURLSession加载数据、下载、上传文件
NSURLSession加载数据.下载.上传文件 NSURLSession类支持三种类型的任务:加载数据.下载和上传.下面通过样例分别进行介绍. 1,使用Data Task加载数据 使用全局的 ...
- MYSQL源码 与 DBUG
一.前言 在规模稍微大点的项目中,为了方便快速找到bug的所在,我们往往需要在代码中加入一些调试用的代码,比如加入一些printf,打印出一些重点的信息:加入assert,进行断言判断.这些比较随意的 ...
- 面向对象设计原则OO
面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...
- Linux 学习笔记 查看文件内容诸多命令
查看文件内容 1.查看文件统计信息 stat 提供文件系统上某个文件的所有状态信息 2.查看文件类型 file 用来查看文件类型 (该命令将文件分成3类:文本类型:可执行文件:数据文件) 如果你有从未 ...
- hadoop学习记录(四)hadoop2.6 hive配置
一.安装mysql 1安装服务器 sudo apt-get install mysql-server 2安装mysql客户端 sudo apt-get install mysql-client sud ...
- [课程相关]homework-08
一.变量作用域和生命周期 #include <cstdlib> #include <iostream> using namespace std; void try_change ...
- hdu 4632 动态规划
思路:dp[i][j]表示区间(i,j)中回文串的个数,那么dp[i][j]=dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1]:如果str[i]==str[j],那么dp[i][j ...