是否可以在一个订单中加密并在另一个订单中解密?例如,我有以下内容:
加密:
public1(public2(plain_text.txt))
解密:
private1(private2(encrypted))
是否有允许此操作的加密算法?它甚至可能吗?
答案 0 :(得分:5)
在大多数情况下,您无法更改解密的顺序。 允许重新排序解密的方案称为可交换密码系统。 可用于构建交换密码系统的一个公钥密码系统是 ElGamal encryption。
这里只是主要想法:假设g是一个生成器 合适的组G,计算离散对数很难。 设x A 和x B 是两个私钥, h A = g x A ,和 h B = g x B 是相应的公钥。两个密钥对使用相同的组 G(即,如果使用G = Z /(p),则为相同的模量p)。这是一个优点 如果两个用户共享相同的组(或模数),它仍然是安全的ElGamal方案。 另一方面,RSA将是不安全的。
用h A加密消息m 给出密文
(m h A r ,g r )。
请注意,知道密钥x A 允许解密因为
(g r ) x A = h A r
要第二次加密密文,首先要重新加密现有的密文 带有A的公钥的密文。 他选择一个随机的r'并计算
(mh A r h A r',g r g r')= (m h A r + r',g r + r'。
结果只是使用A的公钥进行另一次有效加密。 这种重新加密对于避免例如有效的攻击是必要的 对抗RSA,模数相等,如下所示。 接下来,将使用B的公钥加密
进行加密(mh A r + r' h B s ,g r + r' ,g s )。
可以按任何顺序解密,例如知道x A 允许计算
(g r + r') x A = h A r + r'功能
因此可以计算
(m h B s ,g s ),
这正是我们想要的:用B的公钥加密m。
为了获得安全的实施,需要注意许多细微之处。 做到这一点并不容易。 有关详细信息,请参阅Phd of Stephen Weis,其中包含有关可交换加密的章节。
如果使用“教科书RSA”尝试相同的想法,则存在许多问题。首先使加密可交换,用户A和B必须共享相同的模数。 例如。使用(n,e A ,d A ),B使用(n,e B ,d B ),其中n是模数,e A ,e B 公钥和d A ,d B 秘密钥匙。但是,知道例如(n,e A ,d A )允许因子n,因此计算B的秘密密钥,这当然是一个很大的缺陷。
现在我们可以将m加密为
m e A mod n,
再次加密
m e A e B mod n,
使用A的密钥解密
m e B mod n,
并用B的密钥再次解密得到m。看起来很好,直到有人注意到这一点 攻击者可以拦截两个密文c = m e A mod n和c'= m e B mod n可以使用Euclid的算法来找到r,s这样
A + s e B = 1
然后计算
m = c r (c') s mod n。
这个想法也适用于使用另一个答案中提出的RC4的解决方案。 Weis的论文包含对攻击的详细描述。
答案 1 :(得分:3)
对于大多数RSA的公开实现,这是不可能的。解密例程期望明文处于特定格式(即,正确填充)并且如果不是则失败。同样,在加密时,它会将填充应用于明文,而不是按原样使用blob。
/ * RSA的数学允许AFAIK,只要两个键的模数是互质的(几乎总是如此)。但是你可能不得不推出自己的实现。 * /
另一个问题是明文块的数值应小于模数。因此第一个密钥的模数应该小于第二个密钥的模数,否则不能保证第一个密文是第二个加密轮的正确明文。
我隐约记得,OpenSSL有一种无填充模式。你可能会有一些运气。 编辑:总的来说,在99.9%的案例中提出自己的加密原语是一个坏主意。如果您的兴趣纯粹是学术性的,那么请成为我的客人;但如果您正在使用特定的应用功能(即加密某些东西以便需要两个非信任方的同意来解密),那么您肯定是在错误的轨道上。EDIT2:如果模数相同,RSA的数学允许。划痕第二段。但是,使用两个密钥共享相同的模数会非常危及安全性。如果Alice将私钥(m,d)和Cindy作为私钥(m,d') - 假设相同的m - 则Alice可以在O(m)时间内确定d',给定来自Cindy的单个明文/密文对。不好。
答案 2 :(得分:1)
使用公钥/私钥加密,答案是否定的。 PubK1(PubK2(plain.text))
=> encrypted.text。您必须使用PrivK2(PrivK1(encrypted.text))
解密。
但是,如果使用对称流密码(如RC4),则可以更改解密的顺序(A xor B xor C = C xor B xor A)。但这显然不是公钥/私钥算法。
答案 3 :(得分:1)
只有加密算法表现为特定类型的mathematical group时才会出现这种情况。大多数(全部?)块加密算法都不是这样的组。
答案 4 :(得分:0)
AFAIK这可以通过略微修改RSA来实现。我不知道有什么工具可以实际做到这一点。
答案 5 :(得分:0)
不,它不起作用。很简单,你无法保证唯一的解密,因为一个模数比另一个模数大。
编辑:我假设这是RSA。如果没有,那么我必须考虑其他一些。EDIT2:如果你总是愿意先使用较小的模数,那么它确实有效。