我该怎么做?
#1 楼
解决此问题的方法是使用混合加密。即,这涉及使用RSA对对称密钥进行非对称加密。随机生成对称加密(例如AES)密钥,并使用它加密明文消息。然后,使用RSA加密对称密钥。同时传输对称加密的文本和非对称加密的对称密钥。
接收器随后可以解密RSA块,这将产生对称密钥,从而可以解密对称加密的文本。 />
可以更正式地显示如下。假设$ M $是纯文本,$ K_ {AES} $是随机选择的AES密钥,而$ K_ {Pu} $是您已经拥有的接收者的公共RSA密钥。
$$ C_1 = E_ {AES}(M,K_ {AES})$$
$$ C_2 = E_ {RSA}(K_ {AES},K_ {Pu})$$
然后发送$ C_1 $和$ C_2 $。
让$ K_ {Pr} $为接收者的私有RSA密钥。然后,接收方可以恢复$ M $为
$$ K_ {AES} = D_ {RSA}(C_2,K_ {Pr})$$ (C_1,K_ {AES})$$
(要允许流式解密或大消息,通常通常先发送$ C_2 $,然后发送(大得多的)$ C_1 $。)
评论
$ \ begingroup $
我在这个主题上的旧博客条目包含一些示例代码(在C#中)@ pages.infinit.net/ctech/20031101-0151.html
$ \ endgroup $
– Poupou
2011年9月7日在22:57
$ \ begingroup $
@samoz非常有用,也正是我想要的东西。
$ \ endgroup $
–Prix
16 Dec 5'在9:54
$ \ begingroup $
应该一个符号C2,C1还是两个?
$ \ endgroup $
–伊恩·沃伯顿(Ian Warburton)
19-10-10在15:07
#2 楼
从理论上讲,您可以使用RSA对长消息进行加密,就像使用块密码对长消息进行加密一样。这需要适当的链接模式,例如CBC:每个明文“块”首先与加密的前一个块(的一部分)进行异或。使用RSA和适当的填充,每个块的大小开销很大。即,使用PKCS#1中描述的“ v1.5”填充和1024位RSA密钥,每个RSA调用都可以加密一条消息,最高可达117个字节,并产生128个字节的值。因此,为了应用CBC链接,您将必须“提取”以前大小合适的128字节值的一部分。此时,由于CBC依赖于擅长对数据进行“随机化”的加密块,并且没有证据表明128字节从外部看起来足够随机(实际上,有充分的理由说明为什么使用CBC加密),事情在安全性方面可能变得微妙。
(如果不使用适当的填充,那么您已经遇到了更大的问题。没有填充的RSA不再是RSA,更重要的是,没有更加安全。)
在这种情况下,任何人都不会进行这种带有CBC的RSA加密。原因如下:
构造没有受到足够的审查以确保其安全;
大小开销意味着加密的消息将比纯文本长大约9.4%。消息;
RSA加密不是很快(现代CPU仍可以每秒成功加密2 MBytes的数据)。
最后一个原因是最常见的引用,但在我看来,这三者的吸引力最小。
实际上,每个人都将RSA加密用作密钥交换机制,以与快速,安全的对称加密系统一起使用,如@samoz所述。对此进行了更多的分析(因此,这被认为是一种安全的处理方式),它仅以固定量(即使加密千兆字节,最多也可以扩展几百个字节)来扩展数据,并且速度也要快得多。
评论
$ \ begingroup $
您能指出为什么使用PKCS#1兼容填充方案时需要CBC over ECB吗?填充方案应该已经包含了至少8个字节的随机数据,所以这不是按块进行的吗?注意:我当然只在这里考虑机密性。
$ \ endgroup $
–马腾·博德威斯♦
13年3月2日在16:50
$ \ begingroup $
正确...“可以”但不能。使用基于PRNG的强密钥对负载进行对称加密(例如AES512),然后使用2048位RSA公钥对密钥进行加密。它是快速,有效的,可以(虚拟地)处理任何大小的有效载荷,并且不比本文所述的效率较低的方法复杂。
$ \ endgroup $
–达雷尔·蒂格(Darrell Teague)
16 Mar 11 '16 at 20:47
#3 楼
[...]但我需要使用它来发送大型邮件。
对此的简短回答是“不,你不要”,除非是针对某些情况。愚蠢的课堂作业之类的。正如@Samoz的回答所表明的那样,可以通过多种方法将非对称加密强制成为流密码,但缺点是会扼杀交易。
尤其是
这不是标准的,只有您使用时才会成为特有的方案。
使用非对称加密会暴露密码本身的弱点,
它会迫使您管理大量的非常大的密钥。 >
相比之下,众所周知的流加密算法(如AES)在计算上是高效的,需要更小的密钥,并且密钥更少,在操作员错误下更健壮,并且是标准的。 ,其中一个比参与亚洲内战略逊一筹的错误就是尝试使用现有的加密算法来完成棘手的事情。
评论
$ \ begingroup $
虽然我同意提议的情况是非标准的,但我只是说使用AES我认为是不正确的,因为它假定您可以安全地分发密钥。另外,您是什么意思暴露了密码本身的弱点?
$ \ endgroup $
–萨摩斯
13年7月16日在13:43
$ \ begingroup $
在描述为第一个答案的混合方法中,没有密钥交换。客户端使用强大的PRNG生成密钥,使用对称算法(如AES)对有效负载进行加密,然后使用公共RSA密钥对密钥进行加密。
$ \ endgroup $
–达雷尔·蒂格(Darrell Teague)
16 Mar 11 '16 at 20:49
#4 楼
该问题已经假定对称密钥的安全分发,即使用RSA。 “如何使用RSA”中的隐含假设是“(非对称)密钥分发已得到解决”。因此,您只需发送带有AES密文的RSA加密密钥即可。我使用的XML文件具有RSA密钥ID,加密的AES密钥,文件哈希以及其他可能的元数据(如果可以明文发送),然后传输文件对。评论
$ \ begingroup $
不需要“对称密钥的安全分发”。 RSA对的公钥是“ public”。那是唯一传播的信息。然后,只有具有私钥组件(不交换)的接收方才能解密用于(AES)加密有效负载的RSA加密密钥。
$ \ endgroup $
–达雷尔·蒂格(Darrell Teague)
16 Mar 11 '16 at 20:52
评论
RSA是原始的。需要将其组装到系统中才能有用。简短的答案-选择任何已知安全的加密系统,使用RSA原语,并提供所需的特征(例如,支持较长的明文块)。长度不是RSA原语通常不适合直接使用的唯一原因。不幸的是,由于我的解释不足,您无法获得我的较早职位。但是,您可以在s13.zetaboards.com/Crypto/topic/7234475/1附录的示例3中找到对任意长度的明文进行加密的意义,即普通块加密,也就是您所要求的。 >