关于前端:ChaCha20Poly1305-算法

15次阅读

共计 2027 个字符,预计需要花费 6 分钟才能阅读完成。

简介:

​ 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 个字节)
  • 任何长度的关联数据
  • 任何长度的数据进行加密

加密波及步骤:

  1. creating the cipher using createCipheriv
  2. optionally adding the associated data
  3. adding data to the encryption stream
  4. finalizing the encryption
  5. obtain the authorization tag

解密波及步骤:

  1. create the decipher object usig createDecipheriv
  2. optionally set the associated data
  3. update the decipher stream with the ciphertext
  4. set the authorization tag
  5. finalize the decipher, which will validate the authorization tag for the associated data and the encrypted stream

留神:chacha20-poly1305仅在 Node v11.2.0 + 中受反对。

参考链接:https://www.derpturkey.com/ch…

正文完
 0