密码库LibTomCrypt学习记录——(2.13)分组密码算法的工作模式——CCM加密认证模式
- CCM
CCM是加密认证模式,CCM = CTR加密 + CBC-MAC认证。CCM模式看起来比较繁琐,尤其在参数的哦选择上,限制不断。很可能在将来某天被别的方法替代。
参考文献
- NIST SP 800-38C.
- 加密与MAC生成流程
准备:
- 加密算法CIPHER
- 密钥K;
- counter generation函数
- formatting函数
- MAC的比特长度Tlen
输入
- 随机数N
- 消息P,长度为Plen比特
- 关联数据(associated data)A
输出
- 密文 C(C包含了P对应的密文和MAC信息)
步骤
Step 1. 用formatting函数formatting_function (N, A, P) 生成B0, …,Br
Step 2. Y0= CIPHK(B0).
Step 3. For i = 1 to r, do Yi = CIPHK(Bi ⊕ Yi-1).
Step 4. T=MSBTlen(Yr).
Step 5. 用counter generation函数生成Ctr0, Ctr1, …, Ctrm, 其中m=向上取整(Plen/128).
Step 6. For j=0 to m, do Sj= CIPHK(Ctrj).
Step 7. S= S1 || S2 || …|| Sm.
Step 8. Return C=(P ⊕ MSBPlen(S)) || (T ⊕ MSBTlen(S0)).
其中:
counter generation函数和formatting函数后面介绍;
MSBPlen()表示取最高的Plenbit,其余类似。
加密与MAC生成流程示意图如下:
CCM的加密与MAC生成流程示意图
- 解密与验证流程
准备:
- 加密算法CIPHER
- 密钥K;
- counter generation函数
- formatting函数
- MAC的比特长度Tlen
输入
- 随机数N
- 密文C,长度为Clen比特
- 关联数据(associated data)A
输出
- 明文 P(或者INVALID)
步骤
//
Step 1. If Clen≤Tlen, then return INVALID.
Step 2. 用counter generation函数生成Ctr0, Ctr1, …, Ctrm, 其中m=向上取整(Plen/128).
Step 3. For j=0 to m, do S j= CIPHK(Ctrj).
Step 4. S= S1 || S2 || …|| Sm.
Step 5. P=MSBClen-Tlen(C) ⊕ MSBClen-Tlen(S).
Step 6. T=LSBTlen(C) ⊕ MSBTlen(S0).
Step 7. 如果 N, A, P无效, then return INVALID,
否则,用formatting函数 formatting_function (N, A, P)生成B0, B1, …, Br.
Step 8. Set Y0= CIPHK(B0).
Step 9. For i = 1 to r, do Yj = CIPHK(Bi ⊕ Yi-1).
Step 10. If T≠MSBTlen(Yr), then return INVALID, else return P.
- formatting_function
formatting_function(N, A, P)
B = B0 || B1 || … || Bm = Encode(N) || Encode(A)|| Encode(P)
输出参数N、A、P的含义
- N为Nonce,长度为n字节
- A为associated data ,长度为a字节
- P为Message,长度为p字节
- Q为p的定长表示,Q长度为q
这些长度的取值参见 NIST SP 800-38C A.1
生成值Bi的含义
- B0 = Encode(N),记录了Nounce N 和flag等信息的编码数据。
- B1~Bu = Encode(A) = Encode(a) || A || 0...0,记录associated data A的编码数据
- Bu+1~Bm = Encode(P) = P || 0...0,记录消息P的编码数据
第一个128比特块B0的进一步说明
- B0 = Encode(N)记录了Nounce N 和flag等信息的编码数据。
- B0(16字节)的结构以及B0的第一个字节Flag2(1字节)的结构如下图
B0 |
字节序号 |
0 |
1 …15-q |
16-q … 15 |
字节长度 |
1 |
15-q |
q |
|
内容 |
Flags |
N |
Q |
Flags |
比特序号 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
比特长度 |
Reserved |
Adata |
(t-2)/2 |
q-1 |
|||||
含义与值 |
0 |
有无A |
B1~Bu的进一步说明
B1~Bu = Encode(A)记录associated data A的编码数据
Encode(A) = Encode(a) || A || 0...0 ,
其中0...0表示末尾添加很多零,使得Encode(A)为16字节的倍数
[a]16 |
2字节 |
if 0 < a < 2^16 - 2^8 |
|
Encode(a) = |
0xff || 0xfe || [a]32 |
6字节 |
if 2^16 – 2^8 ≤ a < 2^32 |
0xff || 0xff || [a]64 |
10字节 |
If 2^32 ≤ a < 2^64 |
[a]16表示把a写成16bit长,其余类似。
Bu+1~Bm的进一步说明
Bu+1~Bm = Encode(P)记录消息P的编码数据
Encode(P) = P || 0...0 ,
其中0...0表示末尾添加很多零,使得Encode(P)为16字节的倍数
- counter_generation_function
生成counter block Ctr(i) (16字节),结构与formatting_function(N, A, P) 中的B0非常类似
Ctr(i) |
字节序号 |
0 |
1 …15-q |
16-q … 15 |
字节长度 |
1 |
15-q |
q |
|
内容 |
Flags |
N |
i |
Flags |
比特序号 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
比特长度 |
Reserved |
Reserved |
000 |
q-1 |
|||||
含义与值 |
0 |
0 |
000 |
这些长度的取值参见 NIST SP 800-38C A.1。
- LibTomCrypt与CCM
LibTomCrypt中与CCM相关的信息如下:
首先,CCM没有类似别的算法实现中的ccm_state,因为CCM的实现只有一个函数。
在LibTomCrypt中CCM只有一个函数。
int ccm_memory(int cipher, const unsigned char *key, unsigned long keylen, symmetric_key *uskey, const unsigned char *nonce, unsigned long noncelen, const unsigned char *header, unsigned long headerlen, unsigned char *pt, unsigned long ptlen, unsigned char *ct, unsigned char *tag, unsigned long *taglen, int direction)
──────────────────────────────────────
int ccm_memory(int cipher, const unsigned char *key, unsigned long keylen, symmetric_key *uskey, const unsigned char *nonce, unsigned long noncelen, const unsigned char *header, unsigned long headerlen, unsigned char *pt, unsigned long ptlen, unsigned char *ct, unsigned char *tag, unsigned long *taglen, int direction)
// [功能] 对一段数据进行CCM处理,得到密文和mac值
- cipher // [输入] 密码算法
- key // [输入] 密钥
- keylen // [输入] 密钥长度
- uskey // [输入] 扩展密钥(可选)
- nonce // [输入] 随机数
- noncelen // [输入] 随机数长度
- header // [输入] Associated Data
- headerlen // [输入] Associated Data长度
- pt // [输入] 明文
- ptlen // [输入] 明文长度
- ct // [输出] 密文
- tag // [输出] mac值
- taglen // [输出] mac值长度
- direction // [输入] 加密(0)还是解密(1)
//[备注] 适合消息不太长的场合。Ptlen决定了消息长度不能超过4G
──────────────────────────────────────
如果消息太长,或许需要考虑象omac等工作模式一样,在实际执行中按以下方式操作:
ccm_init(***);//Init需事先设置消息的总长度
while( want_send_message )
{
ccm_process (***);//除最后一次外,每次送入的消息长度必需为分组长度
}
ccm_done (***);//返回MAC值
//以上相应代码需另行完成
另外需要注意的是,代码中对各变量的长度设定可能与标准有微小的差异。
密码库LibTomCrypt学习记录——(2.13)分组密码算法的工作模式——CCM加密认证模式相关推荐
- 密码库LibTomCrypt学习记录——(2.15)分组密码算法的工作模式——GCM加密认证模式
GCM GCM是一种有大吞吐能力的加密认证模式.其中主要适用了CRT模式和类似CBC模式的GHASH模式.CRT模式基本上没有大多变化,GHASH则是利用有限域上的乘法进行HASH,此运算可以通常预先 ...
- 密码库LibTomCrypt学习记录——(2.25)分组密码算法的工作模式——EAX加密认证模式
EAX EAX是一种加密认证模式,它可以对消息明文进行加密,同时对消息明文和关联信息(Associated Data)进行认证,当然此关联信息也可以为空.EAX由Mihir Bellare等人在200 ...
- 密码库LibTomCrypt学习记录——(2.18)分组密码算法的工作模式——XTS代码
Test_XTS_AES.h文件代码如下 #ifndef _TEST_XTS_AES_H #define _TEST_XTS_AES_H typedef unsigned __int64 ulong6 ...
- 密码库LibTomCrypt学习记录——(1.4)分组密码算法——AES-NI指令与AES的速度
英特尔在比较新的CPU上提供了AES-NI指令,可以直接调用这些指令来进行AES加解密.关于此指令的速度提升情况,各方反应不一,最高有说提高17倍的,有说提高8-9倍左右的,还有说提高一半左右的.这可 ...
- 密码库LibTomCrypt学习记录——(2.3)分组密码算法的工作模式——ECB代码示例
以下代码实现了AES-ECB的正确性测试(标准测试数据),以及性能测试 说明: 1. 代码里面使用了一个Str2Num函数,它将测试向量中的字符串转为十六进制字节数据,可自行实现. 2. 测试向量出处 ...
- 密码库LibTomCrypt学习记录——(1.5)分组密码算法——示例代码AES-ECB
以下代码实现了AES-ECB的正确性测试(标准测试数据),以及性能测试 说明: 1. 代码里面使用了一个Str2Num函数,它将测试向量中的字符串转为十六进制字节数据,可自行实现. 2. 测试向量出处 ...
- 密码库LibTomCrypt学习记录——(2.11)分组密码算法的工作模式——CTR代码示例
以下代码实现了CBC的正确性测试(标准测试数据) 说明: 1. 代码里面使用了一个Str2Num函数,它将测试向量中的字符串转为十六进制字节数据,可自行实现. 2. 测试向量出处为NIST SP 80 ...
- 【博学谷学习记录】超强总结,用心分享 |产品经理-从盈利模式和推广方法对酷我英语和网易云音乐进行竞品分析
[博学谷学习记录]超强总结,用心分享 |产品经理-从盈利模式和推广方法对酷我英语和网易云音乐进行竞品分析 前言 据产业信息网报道数据,2020年中国网络音乐用户规模达6.58亿,其中手机网络音乐用户占 ...
- python环境下paillier同态密码库踩坑记录
python环境下paillier同态密码库环境搭建 前言 1. Paiilier库和Python版本的选择(非常重要) 2. 安装gmpy2 3. 安装PHE 4.安装NumPy 5. 测试 前言 ...
- 达梦数据库学习记录-包含安装、创建、体系结构、表空间用户模式对象管理备份与还原等
达梦数据库DCA学习记录 目录 达梦数据库以及认证体系简单介绍 安装DM8数据库及常见问题解决办法 创建数据库.数据库实例及相关知识点介绍 数据库连接 数据库启动与关闭 DM8线程 DM8逻辑存储结构 ...
最新文章
- 四川高中计算机学校图片,四川2021年100分能上计算机学校吗
- Python网络爬虫--urllib
- bioskey的用法
- 【Java基础】Java中的持久属性集Properties
- 您基于JEE的Web项目的结构是什么?
- qt添加qwt帮助文件_qt creator中使用qwt插件
- 反欺诈埋点的这些页面,风控人都应知悉
- 靶机渗透练习06-driftingblues6 (利用脏牛提权)
- 那个回乡创业的年轻人,终于断了再回京的念头
- 十六、that的用法汇总
- GFLOPs、GMACs、FMA之间的关系
- channel is not opened.
- 我的世界 为何用java开发?
- 基于安卓的校园订餐系统开发设计
- arm裸机程序启动流程
- 在IDEA中配置git本地仓库并提交远程仓库
- 【Flutter实战】定位装饰权重组件及柱状图案例
- 鸿蒙运行内存4G手机,一图看懂鸿蒙2.0:终于上手机、128KB内存就能跑!
- 在Ubuntu Linux终端安裝和使用ChatGPT,原来这么简单!
- 区块链:Casper 机制的历史起源-第四篇
热门文章
- 【SCIENTIFIC AMERICAN】Internet Cables Could Also Measure Quakes 网络光纤也可以用来测量地震(20191204)
- 分布式系统有哪些衡量指标?
- android 考勤界面,一种android终端实时考勤记录统计展现方法和装置与流程
- 一个意外错误使你无法删除该文件,文件或目录损坏且无法读取
- linux进阶-PHP加速器
- 信息检索的基本方法(1)
- 2014年数学建模美赛题目原文及翻译[个人思路]
- 如何使用一键回录游戏视频
- 计算机专业的学生也太太太太太惨了吧?
- css 彩虹色渐变色,纯CSS实现颜色渐变效果(包含环形渐变、线性渐变、彩虹效果等)...