各种加密模式在TLS协议中的运用 2 (AEAD:CCM模式)
AEAD 模式
名词解释
AE:Authenticated encryption
AD:Associated-Data
本篇背景知识
CBC、各种加密模式在TLS协议中的运用 1、CTR模式
与Mac-then-Encrypt不同,AEAD是整个算法流程,同时保证了数据的私密性和完整性。回想MtE和EtM模式, mac和和cipher都是分别计算的;
CCM
CCM其实是Encrypt-and-Mac的变种
密码学相关的书籍是这样的定义CCM的:
其中,CMAC是这么定义的
这两张图乍一看感觉什么都没说。。。实际上,确实什么都没说。
RFC3610中定义了其具体实现,我们先看RFC中的描述,然后回过头再看流程图。
文字描述:
计算TAG
流程图中,Nonse+ADD+Plain,然后划分成不同的block,送入进行CMAC。
RFC3610中,详细描述了各个block是如何组成的。
The first block B_0 is formatted as follows, where l(m) is encoded inmost-significant-byte first order:Octet Number Contents------------ ---------0 Flags1 ... 15-L Nonce N16-L ... 15 l(m)Within the first block B_0, the Flags field is formatted as follows:Bit Number Contents---------- ----------------------7 Reserved (always zero)6 Adata5 ... 3 M'2 ... 0 L'
上面的描述,翻译成人话就是,首先,一个block是16字节
block0[0] = flag
block0[1 - ivlen-1] = iv
block0[:15] = len(input)
在说仔细点,就是block0的第一个字节是一个flag。第二个字节及其之后的至是IV,RFC规定,AEAD算法中,IV_len是12字节(4+8)。剩余字节,填写input的长度。input长度从最后面开始填。
举个例子,如果input是0xff字节,那么,block[15]就是0xff,如果input是0x1234字节,那么block0[14]=0x12, block[15]=0x34。
至于flag,
bit7保留,写死是0,bit6表示为1,表示有add,为0表示没有add。bit5-3,3个bit,
rfc上这么描述The M' field is set to (M-2)/2
。
套用mbedtls源码描述,block0[0]是这么生成的,详细为什么这么搞,去看RFC3610。
b[0] = 0;b[0] |= ( add_len > 0 ) << 6;b[0] |= ( ( tag_len - 2 ) / 2 ) << 3;b[0] |= (16 - 1 - iv_len) - 1;
至此,block0构造完成了。我们把block0送入AES进行加密。
至此入参IV被处理了。
接着处理add,TLS协议中,add为13字节的header,header的内容和上篇文章描述的相同,具体参考上篇文章。
If 0 < l(a) < (2^16 - 2^8), then the length field is encoded as twooctets which contain the value l(a) in most-significant-byte firstorder.If (2^16 - 2^8) <= l(a) < 2^32, then the length field is encoded assix octets consisting of the octets 0xff, 0xfe, and four octetsencoding l(a) in most-significant-byte-first order.If 2^32 <= l(a) < 2^64, then the length field is encoded as tenoctets consisting of the octets 0xff, 0xff, and eight octets encodingl(a) in most-significant-byte-first order.
由于TLS协议送入的add是13字节,我们遵守第一条If 0 < l(a) < (2^16 - 2^8)
的规矩和即可,即需要构造特殊的2字节的值来描述add长度。
我们定义block1[16]
block1[0] = ( add_len >> 8 ) & 0xFF ;block1[1] = ( add_len ) & 0xFF ;
block1[2:15]填写add的值即可,然后block1以CBC模式接着送入AES,换句话说,block1需要先与block0被加密后的结果亦或之后,再送入AES。
当然,如果add不止13字节,那么接着把剩余的add拷贝到blockx[0:15]中,进行CBC加密,后面的这些block不需要构造特殊的2字节的值了,直接每16字节送入AES-CBC处理,处理完成为止。只是TLS协议中,不会出现这种情况。
至此,入参add被处理完了。
接着处理input,input的处理比上面都简单,直接按照16字节分块,进行AES-CBC模式处理。
至此,Tag计算完成。
计算cipher text
cipher text分为两部分,
(1):第一部分是把plain text送入ctr模式进行AES计算
(2):第二部分就是Tag = ctr(Tag)。
plain txt的ctr模式的counter是这么组成了
Octet Number Contents------------ ---------0 Flags1 ... 15-L Nonce N16-L ... 15 Counter iThe Flags field is formatted as follows:Bit Number Contents---------- ----------------------7 Reserved (always zero)6 Reserved (always zero)5 ... 3 Zero2 ... 0 L'Another way say the same thing is: Flags = L'.
换成c语言描述 ctr是这么组成的
q = 16 - 1 - iv_len;ctr[0] = q - 1;memcpy( ctr + 1, iv, iv_len );memset( ctr + 1 + iv_len, 0, q );ctr[15] = 1;
最后,TAG在进行一次CTR模式加密,由于Tag长度是16,所以计算其实只需要一次,ctr的counter是0,秘钥也就是加密秘钥。
至此,CCM模式加密完成。
总结
CCM模式中,我们依稀还能看到类似AES-HMAC这样的形式,其中CCM模式中的Tag计算,和AES-HMAC的mac计算行为是相似的,只是CCM种是CBC模式的AES计算。这个TAG计算和我们的平时的AES-CBC是基本一样的,唯一不同的是,Tag只取最后一个block,而普通的AES-CBC看到是每个块都保留。所以由此可见,Tag的计算是不可逆的,从而,使得它有了mac的功能。
各种加密模式在TLS协议中的运用 2 (AEAD:CCM模式)相关推荐
- TLS协议中的握手协议
TLS 握手协议(handshake protocol) 握手是TLS协议中最精密复杂的部分.在这个过程中,通信双方协商连接参数(沟通双方各有什么加密算法,选择一个最合适的算法),并且完成身份验证.根 ...
- TLS协议中PRF和TLS1.3中的HKDF
TLS 协议中 PRF 和 TLS 1.3 中的 HKDF 我的TLS实现,大家可以参考:https://github.com/mrpre/atls/ TLS 1.3协议详解:https://blog ...
- 9. PKI - 三种密钥交换算法详解(RSA DHE ECDHE)及他们在SSL/TLS协议中的应用
9. PKI - 三种密钥交换算法详解(RSA& DHE& ECDHE)及他们在SSL/TLS协议中的应用 RSA密钥交换算法 DHE密钥交换算法 ECDHE密钥交换算法 参考 密钥交 ...
- SSL / TLS协议中数字签名与hash算法的联系
今天要为大家介绍的是哈希算法,在介绍SHA之前,只有了解什么是SHA,我们才清楚SSL证书如何使用哈希来形成数字签名.那么什么是哈希呢? HASH算法将任意长度的二进制值映射为较短的固定长度的二进制值 ...
- SSL/TLS协议详解(中)——证书颁发机构
SSL/TLS协议详解(中)--证书颁发机构 本文翻译自:https://www.wst.space/ssl-part-3-certificate-authority/ 上一篇中,我们讨论了关于Dif ...
- TLS 协议-对称加密原理
文章目录 TLS 协议-对称加密原理 1.TLS 设计的目的 2.TLS/SSL 发展历史及通用模型 3.TLS 协议 4.TLS 安全密码套件解读 5.对称加密示意图 6.基于 XOR 的对称加密原 ...
- mysql tls_mysql8 参考手册--加密连接TLS协议和密码
支持的连接TLS协议 MySQL支持使用TLSv1,TLSv1.1,TLSv1.2和TLSv1.3协议的加密连接,这些协议按从低到高的顺序列出.实际允许连接的协议集受多种因素影响: MySQL配置.可 ...
- 解密TLS协议全记录之Openssl的使用与Nginx Server的配置
引言 Openssl是TLS协议进行报文加密,安全通讯而用到的开源代码包,代码主要由C语言编写,我个人也只看了其中一部分代码,当作工具使用,没有深入分析. 其维基百科的链接:https://zh.wi ...
- SSL/TLS协议详解(三)——证书颁发机构
目录 证书颁发机构的需求 数字签名的定义 证书颁发机构的技术实现 如果攻击者篡改证书会怎样 信任链 数字签名的数学算法 浏览器如何实际验证给定服务器证书的有效性 TLS加密客户端-服务器通信并阻止中间 ...
- HTTPS加密过程和TLS证书验证
HTTPS加密过程和TLS证书验证 HTTPS 是在 HTTP 和 TCP 之间建立了一个安全层,HTTP 与 TCP 通信的时候,必须先进过一个安全层,对数据包进行加密,然后将加密后的数据包传送给 ...
最新文章
- windows程序设计之对话框简介1
- java设计模式---模板方法模式
- 基于词典的前缀扫描中文分词
- oracle全库快照,Oracle数据库快照的使用
- Kotlin学习笔记(3)- 语法
- 利用Python3发送邮件-亲测可行
- PHP自动加载下——PSR4
- android 没有gen文件,关于eclipse:对于Android项目,Gen文件夹为空
- docker创建镜像之Dockerfile
- 什么是OpenStack
- 转iOS逆向工程:Reveal查看任意app的高级技巧!
- hadoop2.6---常用命令
- 思科最模拟器Cisco Packet Tracer 7.3.0安装配置
- java常见面试题:Java程序员面试题(四)
- Python 读取/处理 s2k/$2k 文本文件
- VUE(混入mixin、计算属性computed、监听watch)
- 支付宝小程序授权/获取用户信息
- 来扯点ionic3[3] 页面的生命周期事件,也就是凡间所说的钩子
- 自然语言处理与编译原理
- C++无法打开源文件