对称加密性能影响有多大
在下面的表格里,我给你总结了常见的一些算法,以及一些相关的信息。其中,计算性能参考的是 ECRYPT 性能基准测试在 2020 年 7 月对较长数据的运行结果。
从上表中可以看出每个字节的加密、解密运算大约需要0.5个时钟周期,对比单向散列函数的性能,加密解密运算是一种很快的运算。
序列算法和分组算法
为了能够处理任意大小的数据并且输出结果长度固定,单向散列函数需要将数据分组,然后对数组进行运算。在对称加密算法里对输出数据没有长度限制,对数据的处理方式也就有更多的想象空间。
如果按照数据是否分组的角度考虑,就有两种处理方式:
- 进行数据分组,然后按数组运算,这就是分算法。
- 不对数据分组,直接按照原始数据运算,这就是序列算法
那么怎么计算序列算法呢?
序列算法的基本思路,是从密钥推导出跟明文长度相同长度的密钥序列,然后用密钥序列与明文异或运算得到密文,密文与密钥序列异或运算得到明文。
序列算法的关键是如何重固定长度的密钥推导出任意长度的密钥序列,一般来说密钥序列的推导和异或运算都是快速运算。所以序列算被认为是更高效的算法。
由于不需要数据分组,序列算法的安全性主要取决于密钥序列的推导算法,而不用考虑数据分组带来的种种陷阱。对于应用程序而言,这是一个易于使用不易出错的选择。
分组算法的安全性,除了算法本身之外,还取决于数据分组的策略。应用程序需要同时指定分组算法和分组策略。对于不太了解密码技术的细节的程序员来说,这实在是一个不小的挑战。
良好的性能,以及皮实的用法,这是我倾向于优先使用序列算法的两个基本原因。同样,按照这两个标准,同时考虑安全强度,我建议你使用下面的对称密钥算法,按照优先级从高到低排列:
- ChaCha20
- AES-256
- AES-128