【密码算法 之六】CCM 浅析
CCM模式浅析
- 1. 综述
- 2. 加密
- 2.1 前置条件(Prerequisites)
- 2.2 输入(Input)
- 2.3 输出(Output)
- 2.4 加密流程(Steps)
- 3. 解密
- 3.1 前置条件(Prerequisites)
- 3.2 输入(Input)
- 3.3 输出 (Output)
- 3.4 解密流程(Steps)
- 4. 总结
- 附录:B0的构造规则
1. 综述
CCM(Counter with Cipher Block Chaining-Message Authentication Code)是CBC-MAC与CTR的组合,可同时进行数据加密及认证,它基于对称秘钥分组加密算法,分组大小 128bits
,因此 CCM 可以用于 AES,但是不能用于DES、3DES(分组大小为64bits)。CCM模式可以认为是分组加密算法的一种模式。
CCM是CTR加密模式和CMAC认证算法的混合使用,常用在需要同时加密和认证的领域,比如WiFi安全中的WPE协议,它使用了AES-CCM模式。
CCM首先使用CBC-MAC(Cipher Block Chaining-Message Authentication Code)模式对传输帧进行认证,然后使用CTR模式进行数据的加密。
在数据通信中,传输的数据包由两部分组成:数据包头和用户数据(payload)。用户数据一般需要加密以防止窃听,但是传输路上的设备(路由器、交换机等)则往往需要数据包头以保证数据包能够正确的送到目的地,因此对数据包头不能加密。
CCM的输入包括三个元素:
- 待认证和加密的数据,称为有效载荷(P);
- 将被认证但不被加密的相关数据(ADD);
- Nonce,与P及ADD相关的一个唯一值;
2. 加密
2.1 前置条件(Prerequisites)
- 分组加密算法(block cipher algorithm),必须分组长度为 128bit 的分组加密算法
- 加密秘钥 K
- 计数器生成函数(counter generation function)
- 格式化函数(formatting function)
- MAC的长度 Tlen
2.2 输入(Input)
- N值(valid nonce N),其实就是 IV值
- 明文P及长度Plen(valid payload P of length Plen bits)
- 关联数据A(valid associated data A)
2.3 输出(Output)
- 密文C(ciphertext C)
2.4 加密流程(Steps)
(1)通过格式化函数将(N, A, P)数据格式化为 B0,B1,…,Br 等 128bit
的数据块(Br可能是非 128bit 对齐的块);
(2)对第0个数据块 B0 加密,得到密文块 Y0;
(3)依次加密后面的所有数据块:For i = 1 to r, Yi = CIPHK(Bi⊕Yi-1);
(4)取 Yr 的 高
Tlen 字节作为 Tag 值,记为 T
,此值就是MAC值;
(5)通过计数发生器,依次生成 Ctr0,Ctr1,…,Ctrm,其中 m = (Plen + 127 ) / 128;
(6)For j=0 to m, do Sj = CIPHK(Ctrj)) ,对 Ctrj 数据块依次进行加密,得到 Sj;
(7)将S1、S2,…,Sm拼接在一起,得到S,S = S1 || S2 || …|| Sm(注意;拼接的时候不包含S0);
(8)C = (P ⊕ MSBPlen(S)) || (T ⊕ MSBTlen(S0));
3. 解密
3.1 前置条件(Prerequisites)
- 分组加密算法(block cipher algorithm),必须分组长度为 128bit 的分组加密算法
- 加密秘钥 K
- 计数器生成函数(counter generation function)
- 格式化函数(formatting function)
- MAC的长度 Tlen
3.2 输入(Input)
- N值(valid nonce N)
- 密文 C 及长度 Clen(purported ciphertext C of length Clen bits)
- 关联数据 A(valid associated data A)
3.3 输出 (Output)
- 明文 P 或者 INVALID(无效)
3.4 解密流程(Steps)
解密流程其实就是加密流程的逆操作。
(1)若密文长度 Clen <= Tlen,则返回 INVALID;
(2)通过计数发生器,依次生成 Ctr0,Ctr1,…,Ctrm,其中 m = (Plen + 127 ) / 128;
(3)For j=0 to m, do Sj = CIPHK(Ctrj)) ,对 Ctrj 数据块依次进行加密,得到 Sj;
(4)将S1、S2,…,Sm拼接在一起,得到S,S = S1 || S2 || …|| Sm(注意;拼接的时候不包含S0);
(5)P = MSBClen - Tlen( C ) ⊕ MSBClen - Tlen( S );
(6)T = LSBTlen( C ) ⊕ MSBTlen( S0 );
(7)通过格式化函数将(N, A, P)数据格式化为 B0、B1,…,Br 等 128bit
的密文块;
(8)对第1个密文块 B0 加密,得到密文块 P0;
(9)依次加密后面的所有密文块:For i = 1 to r, do P = CIPHK(Bi ⊕ Yi-1);
(10)若 T != MSBTlen(Yr) 则返回 INVALID,否则返回明文 P
4. 总结
加密流程总结
- 首先将数据N,A,P格式化成block块,分别对各个块进行加密,取最后一个“密文块”的高Tlen字节作为Tag值(至此CCM方法计算的MAC值已经得到了);
- 通过“计数生成函数”生成各Ctr0,Ctr1 … Ctrm值(生成器的种子就是nonce),然后分别对各个Ctrx值进行加密,得到密文Sx,将S1,S2 … Sm拼接组成S(特别注意:这里的S0);
- 最后得到密文,密文是P和T按照一定的形式进行的拼接;
- CCM的加密过程是“先计算MAC,再进行加密”,符合“MTE”的模式;
解密流程总结
- 解密流程是加密流程的反操作。
附录:B0的构造规则
Flag[bit7]:保留位,值为0
Flag[bit8]:Adata,代表是否有附件数据AAD,0代表无附加数据,1代表有附加数据
t:代表MAC的长度,MAC可能比较长,但是此处仅用了3bit表示MAC长度,所以规则上为了表示更惨的长度,所以有一个公式,即:(t - 2)/2;比如若置为 011b,则 (t - 2)/2 = 011b(3),故 t = 8,即MAC的长度为8字节;
q:代表有效数据长度的字节数(数据长度在B0中占多少个字节),比如 q - 1 = 110b(8),即q = 9,有效的数据长度在B0中占9个字节;
Q:有效数据长度
N:Nonce值
密码算法系列文章的入口地址如下:
【密码算法 之零】对称算法(DES,、3DES、 AES、DM5、HMAC、CMAC、SHAxx、SM3、SM4),非对称算法(RSA、ECC、ECDSA、ECDH、SM2、SM9…)
【密码算法 之六】CCM 浅析相关推荐
- 【密码算法 之零】对称算法(DES,、3DES、 AES、DM5、HMAC、CMAC、SHAxx、SM3、SM4),非对称算法(RSA、ECC、ECDSA、ECDH、SM2、SM9...)
由于工作的需要,在过去的两年中学习.适配了很多算法,包括对称算法.非对称算法.国密算法.国际算法等.为了逼迫自己能够牢记并掌握这些算法的基本知识点,故本人写了一个关于算法的专栏(持续更新中...) ...
- 【密码算法 之七】GCM 浅析
文章目录 1. 概述 1.1 GHASH 1.3 GCTR 2. GCM 加密 3. GCM 解密 4. 总结 在我的另一篇博客[密码算法 之三]分组密码工作模式 (ECB \ CBC \ CFB ...
- 【密码算法 之八】Hash类算法(单向散列函数) MD5 \ SHA1 \ SHA224 \ SHA256 \ SHA384 \ SHA512等浅析
1. 综述 Hash算法,又称单向散列函数(one-way hash function). 单向散列函数有一个输入和一个输出,其中输入称为消息(message),输出称为散列值(hash va ...
- 密码算法(SM1、SM2、SM3、SM4、同态加密、密态计算、隐私计算和安全多方计算)
文章目录 SM1 对称密码 SM2 椭圆曲线公钥密码算法 SM3 杂凑算法 SM4 对称算法 同态加密 密态计算和隐私计算 安全多方计算技术 安全多方计算的应用场景 对称加密算法 非对称加密算法(公钥 ...
- 商用密码应用与安全性评估要点笔记(密码发展、密码算法)
1.3 密码发展 词条 内容 创新的动力 信息系统的应用需求和攻击威胁 发展三个阶段 古典密码.机械密码.现代密码 古典密码 代换密码,采用一个代换表将一段明文变换成一段密文.若代换表只有一个,是单表 ...
- SM4密码算法(附源码)
from:http://blog.csdn.net/mao0514/article/details/52930944 SM4是我们自己国家的一个分组密码算法,是国家密码管理局于2012年发布的.网址戳 ...
- python如何调用文件进行换位加密_python 换位密码算法的实例详解
python 换位密码算法的实例详解 一前言: 换位密码基本原理:先把明文按照固定长度进行分组,然后对每一组的字符进行换位操作,从而实现加密.例如,字符串"Error should neve ...
- JavaScript实现希尔密码 算法(附完 整源码)
JavaScript实现希尔密码 算法 Matrix.js完整源代码 hillCipher.js完整源代码 hillCipher.test.js完整源代码 Matrix.js完整源代码 export ...
- 古典密码算法------替代密码算法
替代密码算法的原理是使用替代法进行加密,就是将明文中的字符用其它字符替代后形成密文.例如:明文字母a.b.c.d ,用D.E.F.G做对应替换后形成密文. 替代密码包括多种类型,如单表替代密码.多明码 ...
最新文章
- cwRsync文件双向同步问题
- python索引 切片_python_索引_切片
- 基于FPGA的OLED屏幕开发
- MATLAB从入门到精通系列之如何在MATLAB中导入excel单sheet页及多sheet页表格
- 开源任务调度平台elastic-job-lite源码解析
- java轴_JAVA2D:翻译轴
- new/delete和malloc/free的区别(举例说明)(简单点)
- 如何防止XshellPortable、putty、SecureCRT等断网造成Linux命令中断
- 一个基于Microsoft Azure、ASP.NET Core和Docker的博客系统
- 谁在偷你的记忆? 应用服务器版
- 8 个 jQuery 的 PDF 浏览插件
- 人生不该有如此压力,来吃下这口缓解焦虑的良药[50P]
- 新手使用python易踩坑语法:if语句中or 与in连用
- 如何用一个makefile编译多个目标
- Java六大线程池和四大拒绝策略
- 会计科目类词汇(中英)
- 解决sourcetree特别卡的问题
- 怎么查忘仙服务器信息,忘仙怎么跨服战斗 跨服玩法介绍[多图]
- 【OpenCV-Python】教程:3-16 利用Grabcut交互式前景提取
- 零基础JavaScript学习【第八期】