对称加密:性能问题

cam*_*cam 2 encryption performance

对称加密算法的性能是否取决于加密的数据量?假设我需要通过网络快速发送大约1000个字节,最好将50个字节的数据加密20次,或者一次加密1000个字节?哪个会更快?它取决于使用的算法吗?如果是这样,对于512字节以下的数据量,最高性能,最安全的算法是什么?

Tho*_*nin 5

简短的答案是:

  • 您希望一次加密所有数据.实际上,您希望在一次函数调用中为它们提供加密代码,以便它可以更快地运行.

  • 使用适当的加密算法,加密将比网络本身快得多.它需要一个非常糟糕的实现,一台非常旧的PC或一个非常快速的网络,使加密成为瓶颈.

  • 如有疑问,请使用SSL/TLS等全部协议.如果在协议中选择加密算法,请使用AES.

现在答案越长:

分组密码流密码.流密码以初始化阶段开始,其中密钥在系统中输入(通常称为"密钥调度"),然后"在运行中"加密数据字节.利用流密码,加密消息具有与输入消息相同的长度,并且加密时间与输入消息长度成比例,除了密钥调度的计算成本.我们这里不是说大数字; 在一台不太新的PC上,密钥调度时间低于1微秒.然而,为了获得最佳性能,您需要进行一次密钥计划,而不是50次.

分组密码也有一个关键的时间表.当已经执行密钥调度时,分组密码可以加密块,即固定长度的数据块.块长度取决于算法,但通常为8或16个字节.AES是分组密码.为了加密任意长度的"消息",必须多次调用块密码,这比看起来更棘手(存在许多安全问题).决定这些调用如何组合在一起的部分称为链接模式.众所周知的链接模式称为CBC.根据链接模式,可能需要一个称为填充的额外步骤,其中向输入消息添加一些额外字节,以使其长度与所选链接兼容.填充必须是这样的,在解密时,它可以被明确地删除.常见的填充方案称为"PKCS#5".

存在称为"CTR"的链接模式,其有效地将块密码转换为流密码.它有一些好处; 特别是,CTR模式不需要填充,加密的消息长度将与输入消息的长度相同.带CTR模式的AES很好.典型PC上的加密速度约为100 MB/s(例如,使用单核的2.4 GHz Intel Core2).

警告:使用相同的密钥加密多个消息存在问题.对于链接模式,这些问题隐藏在"IV"的名称下(作为"初始值").对于大多数链接模式,IV是密码块的相同大小的随机值.IV不需要是秘密的(它通常与加密的消息一起传输,因为解密方也必须知道它)但必须随机且统一地选择,并且每个消息需要新的IV.一些链接模式(例如CTR)可以容忍非均匀IV,但仅适用于具有给定密钥的第一消息.使用CBC甚至第一条消息需要完全随机的IV.如果这段话对你没有意义,那么,不要尝试设计加密协议,它比你想象的要复杂得多.而是使用已指定的协议,例如SSL(用于加密隧道)或CMS(用于加密消息).这些协议的制定是一个漫长而痛苦的攻击和对策历史,牙齿磨损很多.不要重演那段历史......

警告2:如果您使用加密,那么您担心安全性:可能会有不利实体一心攻击您的系统.大多数情况下,简单加密并不能完全阻止它们; (适当应用)加密本身只能击败被动攻击者,即那些观察传输字节但不改变它们的人.通用攻击者也是活动的,即他删除一些数据字节,移动和复制其他数据,或者添加他自己设计的额外字节.要击败活跃的攻击者,您需要的不仅仅是加密,还需要进行完整性检查.同样,诸如SSL和CMS之类的协议已经处理了细节.