
_START_ARTICLE_
Salsa20
_START_SECTION_
结构
_START_PARAGRAPH_
在其内部，该算法采用模加⊕（逻辑异或），32位模加2³² ⊞，和在一个内部十六个32位word的state上进行恒定距离循环移位操作（<<<）。只使用add-rotate-xor操作避免了软件实现中计时攻击的可能性。基本的Salsa20循环函数R(a,b,c,k)是_NEWLINE_b ⊕= (a ⊞ c) <<< k;_NEWLINE_初始状态是根据密钥的8个word、流位置的2个word、nonce的两个word（基本上是额外的流位置）和4个固定word制成。20轮循环混合制成16个word的流密码输出。_NEWLINE_一个quarter-round会使用四个word的输入并制成四个word的输出。内部的16-word状态被布置为一个4x4矩阵；偶数循环应用quarter-round操作到四行的每项，奇数循环应用quarter-round操作到四列的每项。连续两轮循环（一次行循环和一次列循环）被称为double-round。_NEWLINE_更精确的规范已在下方呈现为伪代码，尽管这种行/列模式更难看出⊞是模加2³²，<<<是左旋操作，及⊕是异或。x ⊕= y是x = x ⊕ y的缩写。_NEWLINE_x[ 4] ⊕= (x[ 0] ⊞ x[12])<<<7;    x[ 9] ⊕= (x[ 5] ⊞ x[ 1])<<<7;_NEWLINE_x[14] ⊕= (x[10] ⊞ x[ 6])<<<7;    x[ 3] ⊕= (x[15] ⊞ x[11])<<<7;_NEWLINE_x[ 8] ⊕= (x[ 4] ⊞ x[ 0])<<<9;    x[13] ⊕= (x[ 9] ⊞ x[ 5])<<<9;_NEWLINE_x[ 2] ⊕= (x[14] ⊞ x[10])<<<9;    x[ 7] ⊕= (x[ 3] ⊞ x[15])<<<9;_NEWLINE_x[12] ⊕= (x[ 8] ⊞ x[ 4])<<<13;   x[ 1] ⊕= (x[13] ⊞ x[ 9])<<<13;_NEWLINE_x[ 6] ⊕= (x[ 2] ⊞ x[14])<<<13;   x[11] ⊕= (x[ 7] ⊞ x[ 3])<<<13;_NEWLINE_x[ 0] ⊕= (x[12] ⊞ x[ 8])<<<18;   x[ 5] ⊕= (x[ 1] ⊞ x[13])<<<18;_NEWLINE_x[10] ⊕= (x[ 6] ⊞ x[ 2])<<<18;   x[15] ⊕= (x[11] ⊞ x[ 7])<<<18;_NEWLINE__NEWLINE_x[ 1] ⊕= (x[ 0] ⊞ x[ 3])<<<7;    x[ 6] ⊕= (x[ 5] ⊞ x[ 4])<<<7;_NEWLINE_x[11] ⊕= (x[10] ⊞ x[ 9])<<<7;    x[12] ⊕= (x[15] ⊞ x[14])<<<7;_NEWLINE_x[ 2] ⊕= (x[ 1] ⊞ x[ 0])<<<9;    x[ 7] ⊕= (x[ 6] ⊞ x[ 5])<<<9;_NEWLINE_x[ 8] ⊕= (x[11] ⊞ x[10])<<<9;    x[13] ⊕= (x[12] ⊞ x[15])<<<9;_NEWLINE_x[ 3] ⊕= (x[ 2] ⊞ x[ 1])<<<13;   x[ 4] ⊕= (x[ 7] ⊞ x[ 6])<<<13;_NEWLINE_x[ 9] ⊕= (x[ 8] ⊞ x[11])<<<13;   x[14] ⊕= (x[13] ⊞ x[12])<<<13;_NEWLINE_x[ 0] ⊕= (x[ 3] ⊞ x[ 2])<<<18;   x[ 5] ⊕= (x[ 4] ⊞ x[ 7])<<<18;_NEWLINE_x[10] ⊕= (x[ 9] ⊞ x[ 8])<<<18;   x[15] ⊕= (x[14] ⊞ x[13])<<<18;_NEWLINE_Salsa20在其输入上实行20轮混合，然后添加最终数组到原数数组来获得64字节输出块。但是，使用8轮和12轮的缩减循环的变体Salsa20/8和Salsa20/12也已分别被引入。这些变体被引入以补充原有的Salsa20，但不是取代它，甚至在eSTREAM的基准测量中比Salsa20表现更好，尽管它相应有着较低的安全余量。
_START_SECTION_
eSTREAM选用
_START_PARAGRAPH_
Salsa20已被选择作为eSTREAM项目“Profile 1”（软件）的第三阶段设计，其在第二阶段结束时得到了Profile 1中算法中的最高投票得分。 Salsa20先前被选择为Profile 1（软件）的第二阶段设计重点，并作为eSTREAM项目Profile 2（硬件）的第二阶段，但最终没有晋级到“Profile 2”的第三阶段，因为eSTREAM觉得这对于极其资源受限的硬件环境可能不是一个好的候选。
_START_SECTION_
密码分析
_START_PARAGRAPH_
截至2015年，没有已知的对Salsa20/12或完整Salsa20/20的攻击被发布；已知的最佳攻击是打破12轮或20轮循环中的8轮。_NEWLINE_在2005年，Paul Crowley报告了一个对Salsa20/5的攻击，预计时间复杂度2¹⁶⁵，并赢得Bernstein的1000美金 “最有趣Salsa20密码分析”奖励。此次攻击及所有后续的攻击都是基于截断差分分析。在2006年，Fischer、Meier、Berbain、Biasse和Robshaw报告了一个对Salsa20/6的攻击，预计时间复杂度2¹⁷⁷，以及一个对Salsa20/7的相关密钥攻击，预计时间复杂度2²¹⁷。_NEWLINE_在2007年，Tsunoo 等人公布了一个Salsa20的密码分析，在2²⁵⁵次操作中，使用211.37对密钥流，打破8/20轮来恢复256位的私钥。但是，这种攻击似乎没有比蛮力攻击更好。_NEWLINE_在2008年，Aumasson、Fischer、Khazaei、Meier和Rechberger报告了一个追对Salsa20/7的密码分析攻击，时间复杂度2¹⁵³，并且他们报告了首个对Salsa20/8用预计时间复杂度2²⁵¹的攻击。此攻击使用了对中性密钥位进行截断差分概率检测的新概念。此攻击可以打破使用128位密钥的Salsa20/7。_NEWLINE_在2012年，Aumasson 等人的攻击使Shi 等人将Salsa20/7（128位密钥，时间复杂度2¹⁰⁹）改进为Salsa20/8（256位密钥，时间复杂度2²⁵⁰）。_NEWLINE_在2013年，Mouha和Preneel发布了一则证明，叙述使用15轮循环的Salsa20在128位的安全差分分析。具体来说，它没有比2⁻¹³⁰更高概率的差分特征，因此差分分析会比用尽128位密钥更困难。
_START_SECTION_
ChaCha20
_START_PARAGRAPH_
Google选择了伯恩斯坦设计的，带Poly1305消息认证码的ChaCha20作为OpenSSL中RC4的替代品，用以完成互联网的安全通信。Google最初实现了https (TLS/SSL)流量在Chrome浏览器（Android手机版）与Google网站之间的通信。_NEWLINE_不久之后，Google在TLS中采用它，ChaCha20和Poly1305算法也以chacha20-poly1305@openssh.com 成为OpenSSH中的一个新密码包。后来，通过编译时选项避免它依赖于OpenSSL也成为可能。_NEWLINE_ChaCha20也被用在OpenBSD和NetBSD操作系统中的arc4random随机数生成器，取代已经脆弱的RC4，在DragonFly BSD中内核的CSPRNG子程序中也是如此。_NEWLINE_ChaCha20已经在RFC 7539中标准化。它在IKE和IPsec中的使用已在RFC 7634中标准化。在RFC 7905中，Chacha20-Poly1305已经被加入TLS扩展标准。