这几天终于搞定了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加密学习的更多相关文章

  1. SQLite XXTea加密学习

    这几天优化数据库读写,移植了xxtea加密到最新的数据库sqlite 3.12.2里,一些好文章放在这里.移植后,数据库读写性能异常优秀! 这几天又发现,数据库还是发生了无法写入情况,数据库崩溃掉了. ...

  2. (C#基础)各种加密学习

    之前,一直想对这个做一个了解,但是总是坚持不下去,很急躁.最近看了几遍文章,很有感触,于是又来重新开始学习,从最最基础的开始——正所谓“慢就是快”.心态变了,继续吧!上代码! using System ...

  3. WIFI_认证加密学习_STA_AP_WDS

    2-1.1_15_使用卡1_准备工作及配置内核====================================1.无线网卡连接上路由或AP之后使用上是和有线网卡是一样的,都是socket编程. ...

  4. MD5加密学习

    MD5(Message Digest --消息摘要算法)算法是一种散列(hash)算法(摘要算法,指纹算法),不是一种加密算法(易错),任何长度的任意内容都可以用MD5计算出散列值.主要作用是[验明“ ...

  5. C# Winform MD5加密学习积累

    string password = txtPassword.Text.Trim(); byte[] result = Encoding.Default.GetBytes(password); MD5 ...

  6. ios开发Base64编码以及加密相关学习

    一:.Base64补充 ```objc 1.Base64简单说明 描述:Base64可以成为密码学的基石,非常重要. 特点:可以将任意的二进制数据进行Base64编码 结果:所有的数据都能被编码为并只 ...

  7. CCM和GCM

    分组密码链接-消息认证码--CCM    Counter with CBC-MAC 组成CCM的关键算法是AES加密算法.CTR工作模式和CMAC认证算法,在加密和MAC算法中共用一个密钥K. CCM ...

  8. SMBv3远程代码执行漏洞复现(CVE-2020-0796)

    漏洞基本信息 服务器消息块(SMB),是一个网络通信协议,用于提供共享访问到文件,打印机和串行端口的节点之间的网络上.它还提供了经过身份验证的进程间通信机制.SMB的大多数用法涉及运行Microsof ...

  9. CentOS7 下编译安装 Samba,什么是 SMB/CIFS 协议

    目录 一.关于 Samba 1. SMB 2. Samba 二.yum 安装 Samba 1. 安装 Samba 2. 查看版本 3. 查看配置文件 4. 启动服务 5. 本地客户端验证 6. Win ...

随机推荐

  1. 检测Insert、Capslock、NumLock、ScrollLock状态键的状态

    unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, ...

  2. Android Socket编程学习笔记

    http://blog.csdn.net/eyu8874521/article/details/8847173 度娘给出的描述:通常也称作"套接字",用于描述IP地址和端口,是一个 ...

  3. sharepoint 2013 未能加载类型"Microsoft.AnalysisServices.SharePoint.Integration.ReportGalleryView"

    最近在做PowerPivot for sharepoint server 2013的时候,创建PowerPivot库,之后打开,出现了一个问题: 未能加载类型"Microsoft.Analy ...

  4. 通过GitHub和Hexo搭建个人博客

    LinEvan个人博客 最终有自己的个人博客,逼格一下子提高说不少. 网上一搜教程一大堆,非常多已经写得非常好了,我就不凑这个热闹了.推荐一篇博文:怎样搭建一个独立博客--简明Github Pages ...

  5. centos安装memcache与telnet

    ####################linux下安装memcache过程######################http://www.cnblogs.com/zgx/archive/2011/ ...

  6. mysql权限及用户

    一:Flush table tables_name MySQL的FLUSH句法(清除或者重新加载内部缓存) FLUSH flush_option [,flush_option],如果你想要清除一些My ...

  7. (重刷)HDU 1874 畅通工程续 + HDU 2544 最短路 最短路水题,dijkstra解法。

    floyd解法 今天初看dijkstra,先拿这两题练手,其他变形题还是不是很懂. 模版题,纯练打字... HDU 1874: #include <cstdio> #define MAXN ...

  8. [改善Java代码]使用构造函数协助描述枚举项

    一.分析 一般来说,我们经常使用的枚举项只有一个属性,即排序号,其默认值是从0.1.2... ....但是除了排序号外,枚举还有一个(或多个)属性:枚举描述,它的含义是通过枚举的构造函数,声明每个枚举 ...

  9. Android 内存分析工具 MAT(Memory Analyzer Tool)

    如果使用DDMS确实发现了我们的程序中存在内存泄漏,那又如何定位到具体出现问题的代码片段,最终找到问题所在呢?如果从头到尾的分析代码逻辑,那肯定 会把人逼疯,特别是在维护别人写的代码的时候.这里介绍一 ...

  10. ImageView的src和background的区别

    参考资料: http://blog.csdn.net/dalleny/article/details/14048375 http://www.android100.org/html/201508/27 ...