简介:
ChaCha20-Poly1305是由ChaCha20流密码和Poly1305消息认证码(MAC)结合的一种应用在互联网安全协议中的认证加密算法,由Google公司率先在Andriod移动平台中的Chrome中代替RC4使用。由于其算法精简、安全性强、兼容性强等特点,目前Google致力于全面将其在移动端推广。
概念:
流密码
又叫流加密,是对称加密算法的一种,加密和解密双方使用相同伪随机加密数据流作为密钥,明文数据每次与密钥数据流依次对应加密,得到密文数据流。实践中数据通常是一个位(bit)并用异或操作加密。
消息认证码
经过特定算法后产生的一小段信息,检查某段消息的完整性,以及作身份认证。检查内容是否被更改,作消息来源的身份验证。
算法介绍:
ChaCha20
chaochao系列流密码,作为salsa密码改良版本,具有更强的抵抗密码分析攻击的特性,20表示该算法有20轮的加密计算。
由于是流密码,故以字节为单位进行加密,安全性的关键体现在密钥流生成的过程,即所依赖的伪随机数生成器(PRNG)的强度,加密过程即是将密钥流与明文逐字节异或得到密文,反之,解密是将密文再与密钥流做一次异或运算得到明文。
(1)ChaCha20的初始矩阵
矩阵的输入为一个256位的密钥、64位随机数、64位计数器值以及4×32位的常数,它们均填充在32位整型数组中作为初始矩阵。
(2)初始矩阵置换
ChaCha20算法有20轮运算,其中奇数轮次与偶数轮次在执行轮函数前需要分别经过行置换和列置换,故20轮运算可以看作10次迭代,每次迭代先做行置换再做列置换。
(3)轮函数
在矩阵每次完成置换后,都需要执行一次轮函数QUARTERROUND,该函数输入为4个32位串,即4个数组中的元素,输出同样也为4个32位串,这样执行完轮函数后除了数据以外,矩阵结构未发生任何变化。
(4)生成密钥流
在经过轮函数20轮周期(10轮行周期+10轮列周期)后,初始矩阵已经变成了一个新的4×4矩阵,此时将新矩阵与初始矩阵矢量相加,得到的矩阵再拆分倒序序列化处理后即得到一个512位的密钥比特流。
(5)加密
将需要加密的信息(明文)与密钥流按位异或即得到密文,当明文大于512位时,按照上述步骤依次生成密钥流,由于计数器是32位,理论上可以生成2 ^ 512 bit(256GB)的密钥流,所以一般长度的信息加密完全足够。
(6)解密
接收方使用发送方传输过来的初始密钥、随机数以及协商好的常数和依次递增的计数器值按照ChaCha20的密钥流生成规则产生与加密相同的密钥流,按位与密文异或即可得到明文。
Poly1305
Poly1305消息认证码的输入为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,划分为s/16组,进行s/16次加密(加密中会✖️r)。最后与s相加得到16字节明文摘要。
ChaCha20-Poly1305 AEAD实现
ChaCha20-Poly1305
的加密数据准备:
- 256位密钥(32字节)
- 96位随机数(12个字节)
- 任何长度的关联数据
- 任何长度的数据进行加密
加密涉及步骤:
- creating the cipher using
createCipheriv
- optionally adding the associated data
- adding data to the encryption stream
- finalizing the encryption
- obtain the authorization tag
解密涉及步骤:
- create the decipher object usig
createDecipheriv
- optionally set the associated data
- update the decipher stream with the ciphertext
- set the authorization tag
- finalize the decipher, which will validate the authorization tag for the associated data and the encrypted stream
注意:chacha20-poly1305
仅在Node v11.2.0 +中受支持。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。