基于ARX结构的流密码算法Salsa20

基于ARX结构的流密码算法Salsa20

0x0 ARX密码

ARX密码,是仅采用模加(Addition)、旋转移位(Rotation)和异或(Xor)三种运算构造的对称密码算法,具有良好的混淆扩散性质。其中模加运算提供了非线性复杂度,循环移位可以将高位活跃比特移动到低位,异或运算则提供了线性复杂度。使用ARX结构的分组密码算法有SpeckHIGHTCHAMLEA等,使用ARX结构的流密码算法有Salsa20ChaChaHC128HC256等,使用ARX结构的密码杂凑算法有MD5SHA2SM3SkeinBLAKE等。

0x1 Salsa20算法简介

Salsa20算法由DanielJ.Bernstein于2005年设计,是eSTREAM工程最终入选的4个面向软件实现的序列密码算法之一,该算法密钥长度为256比特或128比特,通过20轮的迭代运算,产生512比特密钥流输出。

Salsa20算法密钥长度为256比特或128比特,初始向量长度为64比特,计数器长度为64比特,该算法的核心是一个512比特输入、512比特输出的杂凑函数H,该杂凑函数将256比特密钥、64比特初始向量、64比特计数器及128比特固定常数共计512比特数据通过20轮的迭代运算,每拍产生512比特密钥流输出。算法分为初始化过程和密钥流产生过程,下面进行简要介绍。

0x2 初始化阶段

Salsa20的输入为:

其中,(k0,...,k7)为256比特的密钥,(v0,v1)为初始IV,(i0,i1)为分组标号,(σ0,σ1,σ2,σ3)为固定的常数。如果密钥长度是128比特,则(k4,k5,k6,k7)=(k0,k1,k2,k3)。其中(σ0,σ1,σ2,σ3)=(0x61707865,0x3320646e,0x79622d32,0x6b206574)或者(σ0,σ1,σ2,σ3)=(0x61707865,0x3120646e,0x79622d36,0x6b206574)。

0x3 密钥流产生过程

Salsa20为基于ARX(模加循环移位异或)混合运算设计的类分组结构流密码算法。

Salsa20的轮函数是一个16-word输入16-word输出的Hash函数。

Salsa20的最基本的部分是quarterround函数,该函数的输入为四个word,输出也为四个word。为了方便,在本文中我们将这个函数简记为QR。其定义如下:

Salsa20共有20轮变换。分别为10个列变换和10个行变换。我们将列变换简记为Col,将行变换简记为Row。列变换和行变换如下图所示。

一个Col和一个Row组成一个Doubleround函数,我们将Doubleround函数简记为Dou。容易看出,Salsa20包括10个Dou变换。我们定义第10个Dou变换后的输出为Dou10(X)。Salsa20的Hash输出值为:

Salsa20(X0)=X0+Dou10(X)。

Salsa20(X)是Salsa20算法的密钥流。我们把它记为S=Salsa20(X)=(s0,s1,...,s15)。设P是一个明文,C是相应的密文。加密函数为C=P⊕S,解密函数为P=C⊕S。Salsa20的加密过程参下图。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄金龙PLUS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值