Salsa20

title: 结构.
content: 在其内部,该算法采用模加⊕(逻辑异或),32位模加2 ⊞,和在一个内部十六个32位word的state上进行恒定距离循环移位操作(«<)。只使用add-rotate-xor操作避免了软件实现中计时攻击的可能性。基本的Salsa20循环函数 codice_1是 初始状态是根据密钥的8个word、流位置的2个word、nonce的两个word(基本上是额外的流位置)和4个固定word制成。20轮循环混合制成16个word的流密码输出。  一个quarter-round会使用四个word的输入并制成四个word的输出。内部的16-word状态被布置为一个4x4矩阵;偶数循环应用quarter-round操作到四行的每项,奇数循环应用quarter-round操作到四列的每项。连续两轮循环(一次行循环和一次列循环)被称为double-round。  更精确的规范已在下方呈现为伪代码,尽管这种行/列模式更难看出⊞是模加2,«<是左旋操作,及⊕是异或。codice_2是codice_3的缩写。 Salsa20在其输入上实行20轮混合,然后添加最终数组到原数数组来获得64字节输出块。但是,使用8轮和12轮的缩减循环的变体Salsa20/8和Salsa20/12也已分别被引入。这些变体被引入以补充原有的Salsa20,但不是取代它,甚至在eSTREAM的基准测量中比Salsa20表现更好,尽管它相应有着较低的安全余量。
title: eSTREAM选用.
content: Salsa20已被选择作为eSTREAM项目“Profile 1”(软件)的第三阶段设计,其在第二阶段结束时得到了Profile 1中算法中的最高投票得分。 Salsa20先前被选择为Profile 1(软件)的第二阶段设计重点,并作为eSTREAM项目Profile 2(硬件)的第二阶段,但最终没有晋级到“Profile 2”的第三阶段,因为eSTREAM觉得这对于极其资源受限的硬件环境可能不是一个好的候选。
title: 密码分析.
content: 截至2015年,没有已知的对Salsa20/12或完整Salsa20/20的攻击被发布;已知的最佳攻击是打破12轮或20轮循环中的8轮。  在2005年,Paul Crowley报告了一个对Salsa20/5的攻击,预计时间复杂度2,并赢得Bernstein的1000美金 “最有趣Salsa20密码分析”奖励。此次攻击及所有后续的攻击都是基于截断差分分析。在2006年,Fischer、Meier、Berbain、Biasse和Robshaw报告了一个对Salsa20/6的攻击,预计时间复杂度2,以及一个对Salsa20/7的相关密钥攻击,预计时间复杂度2。  在2007年,Tsunoo 等人公布了一个Salsa20的密码分析,在2次操作中,使用2对密钥流,打破8/20轮来恢复256位的私钥。但是,这种攻击似乎没有比蛮力攻击更好。  在2008年,Aumasson、Fischer、Khazaei、Meier和Rechberger报告了一个追对Salsa20/7的密码分析攻击,时间复杂度2,并且他们报告了首个对Salsa20/8用预计时间复杂度2的攻击。此攻击使用了对中性密钥位进行截断差分概率检测的新概念。此攻击可以打破使用128位密钥的Salsa20/7。  在2012年,Aumasson 等人的攻击使Shi 等人将Salsa20/7(128位密钥,时间复杂度2)改进为Salsa20/8(256位密钥,时间复杂度2)。  在2013年,Mouha和Preneel发布了一则证明,叙述使用15轮循环的Salsa20在128位的安全差分分析。具体来说,它没有比2更高概率的差分特征,因此差分分析会比用尽128位密钥更困难。
title: ChaCha变种.
content: 在2008年,丹尼尔·J·伯恩斯坦发布了一个密切相关的“ChaCha”密码家族,其目的是增加每一轮的扩散以实现相同或稍微提升的性能。 Aumasson et al. paper也攻击过ChaCha,实现了少一轮循环:256位ChaCha6有复杂性2,ChaCha7有复杂性2。128位ChaCha6在2以内,但据称攻击128位的ChaCha7失败。  ChaCha替换了基本的Salsa20循环函数codice_1 修改后的计算方法: 循环移位量也被更新。一个完整的quarter-round,codice_5变为: 这除了使其在双操作数指令集(如x86)上更有效率,也使其在每次quarter-round中更新每个word两次。  在事实上,8轮的两次循环允许一些优化。此外,输入格式可以被重新布置,以支持高效的SSE实现优化,这对Salsa20已被发现。相比逐行、逐列下移置换,还可以沿对角线进行。这样ChaCha中的两轮循环是: 其中的数字是十六个32位state word。ChaCha20使用两轮10次迭代。  ChaCha是BLAKE哈希算法的基础,NIST哈希算法竞争的一个入围者,并且继任者BLAKE2调整为更高的速度。它还定义了一个使用16个64位word(state的1024位)的变种,具有相应调整的循环移位常数。
title: ChaCha20.
content: Google选择了伯恩斯坦设计的,带Poly1305讯息鉴别码的ChaCha20(即ChaCha20-Poly1305),作为OpenSSL中RC4的替代品,用以完成互联网的安全通信。Google最初实现了HTTPS (TLS/SSL)流量在Chrome浏览器(Android手机版)与Google网站之间的通信。  不久之后,Google在TLS中采用它,ChaCha20-Poly1305算法也以chacha20-poly1305@openssh.com成为OpenSSH中的一个新密码套件。后来,通过编译时选项避免它依赖于OpenSSL也成为可能。  ChaCha20也被用在OpenBSD和NetBSD操作系统中的arc4random随机数生成器,取代已经脆弱的RC4,在DragonFly BSD中内核的CSPRNG子程序中也是如此。  ChaCha20已经在中标准化。它在IKE和IPsec中的使用已在中标准化。在中,ChaCha20-Poly1305已经被加入TLS扩展标准。  若CPU或软件不支援AES指令集,ChaCha20可提供比AES更好的效能。在ARM处理器上,ChaCha20比ARM更省电。  WireGuard协定使用了带Poly1305讯息鉴别码的ChaCha20。

Summary: Salsa20是一种流加密算法,由丹尼尔·J·伯恩斯坦提交到eSTREAM。它建立在基于add-rotate-xor(ARX)操作的伪随机函数之上——32位模加、异或(XOR)和循环移位操作。Salsa20映射一个256位密钥、一个64位nonce以及一个64位流位置到一个512位的输出(也存在一个128位密钥的版本)。这使Salsa20具有了不同寻常的优势,用户可以在恒定时间内寻求输出流中的任何位置。它可以在现代x86处理器中提供约每4–14次循环周期一字节的速度,并具有合理的硬件性能。它没有注册专利,并且Bernstein还撰写了几篇对常见架构优化的公有领域实现。

Salsa20: Salsa20 and the closely related ChaCha are stream ciphers developed by Daniel J. Bernstein. Salsa20, the original cipher, was designed in 2005, then later submitted to eSTREAM by Bernstein. ChaCha is a modification of Salsa20 published in 2008. It uses a new round function that increases diffusion and increases performance on some architectures.