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,具体如下表)
scheme | IV |
---|---|
Ascon-128 | 0x80400c0600000000 |
Ascon-128a | 0x80800c0800000000 |
Ascon-80pq | a0400c06 |
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$具体如下表所示
scheme | IV |
---|---|
Ascon-Hash | 0x00400c0000000100 |
Ascon-HashA | 0x00400c0400000100 |
Ascon-Xof | 0x00400c0000000000 |
AsconXofA | 0x00400c0400000000 |
不同模式对应的初始状态为下图所示
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)