当前位置: 首页 > 后端技术 > Node.js

ChaCha20-Poly1305算法

时间:2023-04-03 10:06:15 Node.js

介绍:ChaCha20-Poly1305是一种用于互联网安全协议的认证加密算法,它是ChaCha20流密码和Poly1305消息认证码(MAC)的组合。它由谷歌首创,在Andriod移动平台上使用Chrome代替RC4。由于算法精简、安全性强、兼容性强,谷歌目前致力于在移动端全面推广。概念:流密码又称流加密,是一种对称加密算法。加密和解密都使用同一个伪随机加密数据流作为密钥,明文数据依次用密钥数据流加密得到密文数据流。实际上,数据通常是一点点的,并使用异或运算进行加密。消息认证码经过特定算法生成的一小段信息,用于校验某条消息的完整性,进行身份认证。检查内容是否被更改,并对消息来源进行验证。算法介绍:ChaCha20超超系列流密码,作为salsa密码的改进版本,具有更强的抗密码分析攻击能力,20表示该算法进行了20轮加密计算。因为是流密码,所以是按字节加密的。安全的关键体现在密钥流生成的过程中,即依赖的伪随机数生成器(PRNG)的强度。加密过程是将密钥转换成流与明文逐字节异或得到密文。相反,解密就是将密文和密钥流进行异或运算,得到明文。(1)ChaCha20的初始矩阵矩阵的输入是一个256位的密钥,64位的随机数,64位的计数器值和4×32位的常量,全部用32位填充整数数组作为初始矩阵。(2)初始矩阵置换ChaCha20算法有20轮运算,其中奇偶轮在执行轮函数之前需要进行行置换和列置换,所以20轮运算可以看作是10次迭代,每次迭代先做行置换,再做列置换。(3)轮函数每次矩阵置换后,需要执行一次轮函数QUARTERROUND。该函数的输入是四个32位的字符串,即四个数组中的元素,输出也是四个32位的字符串。这样,round函数执行后,除了数据,矩阵结构没有任何变化。(4)生成密钥流经过20轮round函数(10轮行+10轮列),初始矩阵变成了一个新的4×4矩阵。此时将新矩阵与初始矩阵向量相加,对得到的矩阵进行逆序拆分序列化,得到512位的密钥比特流。(5)加密将待加密信息(明文)与密钥流按位异或得到密文。当明文大于512位时,按上述步骤依次生成密钥流。由于计数器是32位,理论上可以生成2^512位(256GB)的密钥流,所以加密一般长度的信息是完全够用的。(6)解密接收方根据ChaCha20的密钥流生成规则,使用发送方传来的初始密钥、随机数、协商常数和递增计数器值,生成与加密相同的密钥流,按位与即可得到明文对密文进行异或运算。Poly1305Poly1305消息认证码的输入是一个32字节(256bit)的密钥和任意长度的消息比特流,经过一系列计算后生成一个16字节(128bit)的摘要。(1)密钥处理先将32字节的密钥分成两组,每组16字节,前16字节称为“r”,后16字节称为“s”,申请两个16字节的密钥数组r[]和s[]。对于s,以字节为单位,倒序排列。对于r,清除r[3]、r[7]、r[11]、r[15]的前4位(使其小于16),r[4],r[8],r[12]最后两位清零(能被4整除)。清零操作完成后,类按字节倒序排列。最后得到s和r。(2)加密函数加密前在系统中分配一个寄存器作为累加器ACC(在程序中表示为数组),ACC初值为0。明文分为16字节一组,分为s/16根据铭文s的长度分组,加密s/16次(加密时为??r)。最后与s相加得到16字节的明文摘要。ChaCha20-Poly1305AEAD实现ChaCha20-Poly1305加密数据准备:256位密钥(32字节)96位随机数(12字节)任意长度的关联数据加密任意长度的数据加密涉及步骤:使用createCipheriv创建密码可选地添加关联数据将数据添加到加密流完成加密获取授权标签解密浸及步骤:创建解密对象使用createDecipheriv可选地设置关联数据使用密文更新解密流设置授权标签最终确定解密,这将验证关联数据的授权标签和加密流注意:chacha20-poly1305仅在Nodev11.2.0+中受支持。参考链接:https://www.derpturkey.com/ch...