Abstract

Ascon的介绍文档(NIST的版本)

Ascon密码套件提供了身份验证加密(Auth. Enc with Associated Data)和哈希(Hashing)的功能,包含认证密码套件Ascon-128和Ascon-128a,Hash函数套件Ascon-hash和Ascon-Hhasha,可扩展输出套件Ascon-Xof和Ascon-Xofa

所有方案(套件)均提供128比特的安全级别,内部使用相同的230比特置换(不同套件的置换轮数不同)

Ascon套件在实践中被设计为具有高安全性和鲁棒性,占用较少的硬件资源,且软硬件实现效率很高

Ascon的置换字长为64比特,操作仅包含四种位运算(按位与、按位异或、按位取反、移位)

1 Specification

1.1 Algorithms in the Ascon Cipher Suite

Ascon的密码套件包含一系列的验证加密设计和对应的Hash函数族与可扩展输出函数

Authenticated Enc

加解密算法主要有四个参数

  • $k$:密钥长度,Ascon的密钥长度$k\leq 160$
  • $r$:分组长度
  • $a,b$:内部轮数

加密算法输入为密钥$K$,nonce值$N(|N|=128)$,关联数据(Associated Data)$A$(任意长度),明文$P$(任意长度),输出对应的认证密文$C$和长度为128比特的认证标签$T$

$$ \mathcal E_{k,r,a,b}(K,N,A,P)=(C,T)\\ \mathcal D_{k,r,a,b}(K,N,A,C,T)=(P,\bot) $$

Hashing

Hash算法族和可扩展输出函数定义为$\mathcal \chi_{h,r,a,b}$,其中参数$h$表示输出长度限制($h=0$表示无输出长度限制)

该函数将任意长度的消息$M$映射到一个长度为$l\leq h$的串

$$ \mathcal \chi_{h,r,a,b}(M,l)=H $$

Hash函数中$h=256$,可扩展输出函数中$h=0$

1.2 Recommended Parameter Sets

表1给出了Ascon的两个AEAD套件的推荐参数,优先推荐使用Ascon-128,其次是Ascon-128a

表2给出了Hash的推荐参数,优先推荐使用Ascon-Hash,其次是Ascon-HashA

建议组合使用Ascon-128+Ascon-Hash,或者Ascon-128a+Ascon-Hasha

Further Constructions

Ascon定义了两个可扩展输出函数,分别为$\mathcal \chi_{0,64,12,12},\mathcal \chi_{0,64,12,8}$

Ascon定义了一个额外的认证加密方案$\mathcal E,\mathcal D_{160,64,12,6}$

1.3 State and Notation

本节介绍Ascon用到的一些记号

  • $S$:Ascon的状态,所有套件的状态均为320比特,Ascon的状态被划分为长度为$r$比特的$S_r$和长度为$c$比特的$S_c$,表示为$S =S_r ||S_c=x_0||x_1||x_2||x_3||x_4$,其中$x_i$的长度为64比特
  • $p^a,p^b$:表示两个置换,置换轮数分别为$a,b$

表3是一些Ascon用到的记法

1.4 Authenticated Encryption

Ascon的认证加密基于$[BDPV12]$的Monkey Duplex模式,使用更强的密钥初始化和密钥终结函数(Finalization Func.)

Ascon的加解密操作如图1所示


Initialization

Ascon的320比特初始状态包括$k$比特密钥,128比特Nonce和初始向量IV(不同的套件使用不同的IV,具体如下表)

schemeIV
Ascon-1280x80400c0600000000
Ascon-128a0x80800c0800000000
Ascon-80pqa0400c06

IV的构成包含5各部分,如下

$$ IV_{k,r,a,b}=k||r||a||b||0^{160-k} $$

对应的Ascon的初始状态为

$$ S=IV_{k,r,a,b}||K||N $$

在初始化阶段,首先对初始状态进行$a$轮的循环置换,之后与密钥$K$进行异或,完成初始化

$$ S\larr p^a(S)\oplus(0^{320-k}||K) $$

Processing Associated Data

首先将关联数据$A$划分为长度为$r$的块(最后一块不足$r$比特则填充1个1和若干个0),记块的数量为$s$(若没有关联数据,则$s=0$)

之后将每一个块与$S$的前$r$比特进行异或(也即与$S_r$进行异或),然后进行$b$轮置换,每轮置换中用当前块更新状态

$$ S\larr p^b((S_r\oplus A_i)||S_c),1\leq i\leq s $$

处理完所有$s$个块之后,再将$S$与单比特异或

$$ S\larr S\oplus (0^{319}||1) $$

Processing Plaintext/Ciphertext

首先将明文$P$划分为长度为$r$的块(最后一块不足$r$比特则填充1个1和若干个0),记块的数量为$t$

加密过程如下:将第$i$块明文与$S$的前$r$比特进行异或(也即与$S_r$进行异或),得到对应的密文块$C_i$,之后然后进行$b$轮置换,每轮置换用密文$C_i$更新状态$S$,若$i=t$(最后一块密文),则不进行置换

$$ C_i\larr S_r\oplus P_i\\ S\leftarrow \left\{\begin{matrix} &p^b(C_i||S_c) ,1\leq i<t\\ &C_i||S_c ,i=t \end{matrix}\right. $$

最后一块密文需要截断,使其与原始明文的最后一块长度一致

解密过程和加密过程类似,将密文与$S_r$进行异或并得到明文,然后进行$b$轮置换,每轮置换用密文更新状态$S$

对于密文的最后一块,需要将$S_r$截断至与密文最后一块长度相等,然后进行异或得到明文最后一块,并更新状态

$$ \tilde P_t\larr \lfloor S_r\rfloor \oplus \tilde C_t\\ S\larr (S_r\oplus (\tilde P_t||1||0^{r-1-l}))||S_c $$

Finalization

完成加密后,需要进行最终来输出认证标签$T$,首先用密钥$K$更新当前状态,然后对当前状态进行$a$轮置换

最后将最终状态的低128比特与密钥的低128比特进行异或,得到认证标签

$$ S\larr p^a(S\oplus (0^r||K||0^{c-k}))\\T\larr \lceil S\rceil ^{128}\oplus \lceil K\rceil ^{128} $$

算法流程如下图所示

1.5 Hashing

Hash函数定义为$\mathcal \chi_{h,r,a,b}$,结构如下图如所示

Initialization

Hash函数初始向量$IV$由分组长度$r$,轮数$a,b$和参数$h$决定,初始状态为$S\larr p^a(IV_{h,r,a,b}||0^{256})$

$$ IV_{h,r,a,b}\larr 0^8||r||a||a-b||h $$

不同模式的$IV$具体如下表所示

schemeIV
Ascon-Hash0x00400c0000000100
Ascon-HashA0x00400c0400000100
Ascon-Xof0x00400c0000000000
AsconXofA0x00400c0400000000

不同模式对应的初始状态为下图所示

Absorbing Message

吸收阶段将消息$M$划分为$r$比特的块,若最后一块长度不足$r$,则填充1个1和若干个0,记分块数量为$s$

吸收阶段的状态更新与加密阶段类似

$$ S\leftarrow \left\{\begin{matrix} &p^b((S_r\oplus M_i)||S_c) ,1\leq i<s\\ &(S_r\oplus M_i)||S_c ,i=s \end{matrix}\right. $$

Squeezing

Hash函数输出之前还需要执行$a$轮的置换

$$ S\larr p^a(S) $$

然后每次从状态中挤压64比特的块,并更新内部状态

$$ H_i\larr S_r\\S\larr p^b(S),1\leq i\leq t=\lfloor l/r\rfloor $$

直到输出$H$的长度为设定的长度$l$(最后一块取最高位的若干比特)

Hash函数的完整算法如下图所示

1.6 Permutation

AEAD和Hashing的核心部分,置换基于SPN结构,处理320比特的状态,分为$p^a,p^b$两类置换,这两类置换唯一的区别在于置换的轮数不同

置换包含三个步骤$p_L,p_S,p_C$,也即$p=p_L\circ p_S\circ p_C$,具体步骤如下图所示

和前面提到的一样,将状态划分为5个64比特的部分$S =S_r ||S_c=x_0||x_1||x_2||x_3||x_4$,然后进行处理

Addition of Constants

常数加层部分对应图3中的$p_C$,每轮会将一个常数$c_r$与$x_2$进行相加(也即计算$x_2\larr x_2\oplus c_r$),不同轮采用的常数不同,具体如下表所示

Substitution Layer

代换层对应图3中的$p_S$,目的是更新64个并行的5比特S盒(如图3b中所示,将$x_0\dots x_4$的对应位置视为一个长度为5比特的S盒),下表为S盒的查找表(具体的操作在原文42页,7.2节中的图5)

LInear Diffusion Layer

线性扩散层对应图3中的$p_L$,目的是对每个64比特寄存器执行一个内部扩散$x_i\larr \sum_i(x_i),0\leq i\leq 4$,具体如下图所示

2 Implement

Ascon的官方github号:Ascon (github.com)

Ascon的部分语言实现(包含JAVA、C、Python和硬件实现):ascon/ascon_collection: A collection of Ascon implementations & documents (as submodules) (github.com)

3 Security Analysis

‍后续有空补充

References

$[1]$ Ascon – Authenticated Encryption and Hashing (tugraz.at)

$[2]$ Ascon v1.2. Submission to NIST

$[3]$ Ascon (github.com)

$[4]$ ascon/ascon_collection: A collection of Ascon implementations & documents (as submodules) (github.com)