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模式)相关推荐

  1. TLS协议中的握手协议

    TLS 握手协议(handshake protocol) 握手是TLS协议中最精密复杂的部分.在这个过程中,通信双方协商连接参数(沟通双方各有什么加密算法,选择一个最合适的算法),并且完成身份验证.根 ...

  2. TLS协议中PRF和TLS1.3中的HKDF

    TLS 协议中 PRF 和 TLS 1.3 中的 HKDF 我的TLS实现,大家可以参考:https://github.com/mrpre/atls/ TLS 1.3协议详解:https://blog ...

  3. 9. PKI - 三种密钥交换算法详解(RSA DHE ECDHE)及他们在SSL/TLS协议中的应用

    9. PKI - 三种密钥交换算法详解(RSA& DHE& ECDHE)及他们在SSL/TLS协议中的应用 RSA密钥交换算法 DHE密钥交换算法 ECDHE密钥交换算法 参考 密钥交 ...

  4. SSL / TLS协议中数字签名与hash算法的联系

    今天要为大家介绍的是哈希算法,在介绍SHA之前,只有了解什么是SHA,我们才清楚SSL证书如何使用哈希来形成数字签名.那么什么是哈希呢? HASH算法将任意长度的二进制值映射为较短的固定长度的二进制值 ...

  5. SSL/TLS协议详解(中)——证书颁发机构

    SSL/TLS协议详解(中)--证书颁发机构 本文翻译自:https://www.wst.space/ssl-part-3-certificate-authority/ 上一篇中,我们讨论了关于Dif ...

  6. TLS 协议-对称加密原理

    文章目录 TLS 协议-对称加密原理 1.TLS 设计的目的 2.TLS/SSL 发展历史及通用模型 3.TLS 协议 4.TLS 安全密码套件解读 5.对称加密示意图 6.基于 XOR 的对称加密原 ...

  7. mysql tls_mysql8 参考手册--加密连接TLS协议和密码

    支持的连接TLS协议 MySQL支持使用TLSv1,TLSv1.1,TLSv1.2和TLSv1.3协议的加密连接,这些协议按从低到高的顺序列出.实际允许连接的协议集受多种因素影响: MySQL配置.可 ...

  8. 解密TLS协议全记录之Openssl的使用与Nginx Server的配置

    引言 Openssl是TLS协议进行报文加密,安全通讯而用到的开源代码包,代码主要由C语言编写,我个人也只看了其中一部分代码,当作工具使用,没有深入分析. 其维基百科的链接:https://zh.wi ...

  9. SSL/TLS协议详解(三)——证书颁发机构

    目录 证书颁发机构的需求 数字签名的定义 证书颁发机构的技术实现 如果攻击者篡改证书会怎样 信任链 数字签名的数学算法 浏览器如何实际验证给定服务器证书的有效性 TLS加密客户端-服务器通信并阻止中间 ...

  10. HTTPS加密过程和TLS证书验证

    HTTPS加密过程和TLS证书验证 HTTPS 是在 HTTP 和 TCP 之间建立了一个安全层,HTTP 与 TCP 通信的时候,必须先进过一个安全层,对数据包进行加密,然后将加密后的数据包传送给 ...

最新文章

  1. windows程序设计之对话框简介1
  2. java设计模式---模板方法模式
  3. 基于词典的前缀扫描中文分词
  4. oracle全库快照,Oracle数据库快照的使用
  5. Kotlin学习笔记(3)- 语法
  6. 利用Python3发送邮件-亲测可行
  7. PHP自动加载下——PSR4
  8. android 没有gen文件,关于eclipse:对于Android项目,Gen文件夹为空
  9. docker创建镜像之Dockerfile
  10. 什么是OpenStack
  11. 转iOS逆向工程:Reveal查看任意app的高级技巧!
  12. hadoop2.6---常用命令
  13. 思科最模拟器Cisco Packet Tracer 7.3.0安装配置
  14. java常见面试题:Java程序员面试题(四)
  15. Python 读取/处理 s2k/$2k 文本文件
  16. VUE(混入mixin、计算属性computed、监听watch)
  17. 支付宝小程序授权/获取用户信息
  18. 来扯点ionic3[3] 页面的生命周期事件,也就是凡间所说的钩子
  19. 自然语言处理与编译原理
  20. C++无法打开源文件

热门文章

  1. 使用 GitHub Pages 和 Hexo 以及 Aurora 主题搭建静态个人博客
  2. PMP-资源优化:资源平衡、资源平滑区别和举例,附对比图收藏
  3. Mac添加Windows共享打印机
  4. 何为自动化测试?(纯干货)
  5. 使用tayga测试无状态nat64功能
  6. vnc远程控制软件怎么用,在Windows中vnc远程控制软件怎么用
  7. 创建mysql视图索引_mysql 创建索引和视图
  8. Android Material-dialogs的使用(kotlin)
  9. 如何屏蔽搜狗浏览器中的广告 搜狗浏览器拦截广告的教程
  10. python数据分析:词性标注