我目前正在阅读密码学工程学。在对秘密密钥加密和公共密钥加密之间的区别进行了高级解释之后,该书说:加密那么容易吗?因为公钥加密的效率要差很多,所以要高出几个数量级。级别的解释以及我所想的那样。

#1 楼

这里讨论三个效率问题:CPU,网络带宽和功能。

公钥加密比私钥加密慢的“道德”原因是必须实现定性上更难的功能:以便能够发布加密密钥而不会泄露解密密钥。与对称加密相比,这需要更多的数学运算,而对称加密“只是”制造大量的比特。大多数已知的非对称加密系统似乎实现了所需的安全性,但是计算成本却相对较高。请注意,McEliece密码系统和NTRUEncrypt可以高速实现非对称加密和解密(比椭圆曲线上的RSA或El Gamal高得多)。没有证据表明非对称加密在计算方面确实比对称加密更难,但是相反仍然会有些令人惊讶。非对称加密的另一个效率问题是网络带宽。这是绝对的限制。公用密钥加密是公用的:包括攻击者在内的任何人都可以使用公用密钥来加密任意消息。这意味着,如果加密是确定性的,则攻击者可以对加密的数据进行详尽的搜索(即对潜在的消息进行加密,直到匹配为止)。加密的数据仍然是“有用的数据”:它具有结构,因此需要进行这种搜索。因此,非对称加密方案必须包括额外的随机性。反过来,这必然意味着数据大小增加。例如,对于PKCS#1所述的RSA,使用1024位密钥,您最多只能加密一个数据元素117个字节,从而产生128个字节的值。因此,如果要使用“仅RSA”加密大文件,最终将得到比纯文本大9%的加密消息:10 GB消息额外多了900兆字节。另一方面,对称加密只会产生固定的大小开销(例如,AES-CBC最多为+32字节,包括初始值的空间)。在许多情况下,网络带宽比CPU稀缺。发送者和接收者的确拥有一个共享的秘密,但是该值通常是“随机选择的”。 Diffie-Hellman是最著名的密钥交换算法。使用密钥交换算法进行“非对称加密”涉及在对称加密算法中使用“共享机密”作为密钥。

#2 楼

块密码通过对$ n $位的块进行操作来实现混淆和扩散。简而言之,一个好的分组密码应该尽可能彻底地“混合”明文和密钥的位,这样实际上就不可能恢复密钥或解密未知的密文。

现在,要实现混淆和扩散,有一些常用的基本操作:异或,以2 ^ 32或2 ^ 64为模的加法,位旋转,(小)表查找以及其他一些操作。所有这些操作的共同点在于,它们都是普通CPU可以非常快速地执行的所有操作。地狱,Core 2 CPU每秒可以执行60亿次加法或异或运算!活板门功能是很难反转的功能,除非给了它一些特殊的信息,这时它变得容易。拥有良好的活板门功能并不是一件容易的事,而且我们今天知道(和信任)的功能大多基于数论。据称,最广为人知的RSA依赖于反转函数的难度

$ f(m)= m ^ e \ pmod n $,

其中$ n $是复合的并且未知的因式分解。对于足够大的$ n $,反转此函数非常困难。这里的“足够大”位是关键-在RSA的情况下,$ n $必须至少有1024位长才能安全,这是由于数字字段筛的强大功能以及操作(请参阅:幂运算) )必须以至少1024位数字为模。

这就是为什么RSA比AES慢得多的原因:比CPU自然字长大得多的数字算术很慢,并且幂运算需要对指数$ e $乘以$ O(\ log e)$(RSA-1024要求以1024乘法为模(以1024位数字为模)。例如,eBACS项目在最先进的Sandy Bridge处理器中报告了一次RSA-1024解密的1640960个周期。椭圆曲线密码术可以改善这种情况,椭圆曲线密码术需要较小的密钥才能达到相同的安全级别;不过,它仍然比对称密码慢。

#3 楼

问题是,对于公钥密码术,您必须具有比对称密钥密码术所需的数学结构更多的信息。

对于对称操作,我们可以随意选择算法。几乎可以使用任何算法。即使在加密的情况下(必须能够解密),也可以通过使每个步骤都可逆,或者使用结构(例如Feistel网络或将逻辑用作键流生成器)来处理此问题本身具有可逆性。现在,因为我们需要一个安全的算法,所以我们还没有那么自由,但是,我们确实有很大的自由度。

对于非对称操作,情况有所不同。我们有免费的“公共”和“私人”操作(例如,“加密”和“解密”)。公钥和私钥必须相关联,但不应以明显的方式关联。公开密钥的持有者一定不能进行私有操作(除非还获得了私有密钥的副本,在这种情况下这很容易)。由于这一要求,我们不能使用任何任意算法,而是需要基于允许这种非显而易见的关系的问题为基础。已经提出了一些这样的问题(例如分解,特定组中的离散日志,RSA问题,特定组中的DH问题,晶格问题),并且(据我们所知)是安全的;但是,它们中的任何一个都不能像对称运算那样快速地进行评估。