English  简体中文
   

AEAD算法浅析

2016-12-13       撰稿人:北京数字认证股份有限公司 宋玲娓


EAD的概念: 在通常的密码学应用中,Confidentiality (保密) 用加密实现,Message authentication (消息认证) 用MAC实现。这两种算法的配合方式,引发了很多安全漏洞,过去曾经有3种方法:1. Encrypt-and-MAC 2.MAC-then-Encrypt 3.Encrypt-then-MAC ,后来发现,1和2都是有安全问题的,所以,2008年起,逐渐提出了“用一个算法在内部同时实现cipher+MAC”的idea,称为AEAD(Authenticated encryption with additional data)。 在AEAD这种概念里,cipher+MAC 被 一个AEAD算法替换。

 

AEAD是目前最重要主流的加密算法,其中主流的AEAD模式是 aes-gcm-128/aes-gcm-256/chacha20-poly1305。

AEAD加密完的格式是:

1

2

3

4

5

6

 struct {

     opaque nonce_explicit[SecurityParameters.record_iv_length];

     aead-ciphered struct {

         opaque content[TLSCompressed.length];

     };

 } Generic AEAD Cipher;

AEAD ciphers的输入是: key,nonce, 明文和 “additional data”. key是 client_write_key 或者 the server_write_key. 不需要使用 MAC key.

每一个AEAD算法都要指定不同的nonce构造算法,并指定 GenericAEADCipher.nonce_explicit 的长度. 在TLS 1.2中,规定很多情况下,可以按照rfc5116 section 3.2.1的技术来做。其中record_iv_length是nonce的显式部分的长度,nonce的隐式部分从key_block作为 client_write_iv和 and server_write_iv得出,并且把显式部分放在 GenericAEAEDCipher.nonce_explicit 里.

在TLS 1.3 draft中,做了更改:

规定 AEAD算法的 nonce的长度规定为 max(8 bytes, N_MIN),即如果N_MIN比8大,就用N_MIN; 如果比8小,就用8。

并且规定 N_MAX小于8字节的AEAD不得用于TLS。

规定TLS AEAD中每条record的nonce通过下面的方法构造出来: 64bit的sequence number的右侧填充0,直到长度达到iv_length。然后把填充过的sequence number和静态的 client_write_iv或 server_write_iv (根据发送端选择)做异或(XOR)。异或完成后,得到的 iv_length 的nonce就可以做每条record的nonce用了。

AEAD输入的明文就是 TLSCompressed.fragment (记得上面的介绍吗?AEAD是MAC和encrypt的集成,所以输入数据不需要在算MAC了).

AEAD输入的additional_data 是:

1

2

 additional_data = seq_num + TLSCompressed.type +

                    TLSCompressed.version + TLSCompressed.length;

如果解密/验证完整性失败,就回复一条 fatal bad_record_mac alert 消息.

aes-gcm的iv长度,nonce长度,nonce构成等,

 

 

 

 

AEAD: https://www.imperialviolet.org/2014/02/27/tlssymmetriccrypto.html

 
中国密码学会电子认证专业委员会 版权所有
地址:北京市海淀区闵庄路甲89号 4号楼
联系电话:010-82546543-686
京ICP备05046059号-4