是否可以按一种顺序加密并按另一种顺序解密?例如,我有以下内容:
例子
加密:
public1(public2(plain_text.txt))
解密:
private1(private2(encrypted))
是否有任何加密算法允许这样做?甚至有可能吗?
最佳答案
在大多数情况下,您无法更改解密顺序。
允许重新排序解密的方案称为交换密码系统。
一种可用于构建可交换密码系统的公钥密码系统是
ElGamal encryption .
这只是主要思想:假设 g 是
一个合适的组 G,对于它来说计算离散对数是困难的。
设 xA 和 xB 是两个私钥,
hA = g xA ,和
hB = g xB
是对应的公钥。两个 key 对使用相同的组
G(即,如果我们使用 G = Z/(p),则模数 p 相同)。这是其优势之一
ElGamal 方案,如果两个用户共享相同的组(或模数),它仍然是安全的。
另一方面,RSA 将是不安全的。
用 hA 加密消息 m 得到密文
(m hAr, gr).
请注意,知道 key xA 允许解密,因为
(gr)xA = hAr
要第二次加密密文,首先要重新加密现有的
密文与 A 的公钥。
他选择一个随机 r' 并计算
(m hAr hAr', grgr') = (m hAr+r', gr+r').
结果只是使用 A 的公钥进行的另一个有效加密。
这种重新加密对于避免有效的攻击是必要的,例如
对抗具有相同模数的 RSA,如下所示。
接下来,一个人会用 B 的公钥加密
(m hAr+r' hBs, gr+r', gs).
可以按任一顺序解密,例如知道 xA 允许计算
(gr+r')xA = hAr+r'
因此可以计算
(m hBs, gs),
这正是我们想要的:用 B 的公钥加密 m。
为了获得安全的实现,需要观察许多微妙之处。
做到这一点并不容易。
有关更多信息,请参见例如 Phd of Stephen Weis ,其中包含关于可交换加密的一章。
如果对“教科书 RSA”尝试相同的想法,则会出现许多问题。首先要使加密可交换,用户 A 和 B 必须共享相同的模数。
例如。 A 使用 (n, eA, dA) 而 B 使用 (n, eB, dB),其中 n 是模数,eA, eB 是公钥,dA, dB 是 secret key 。然而,知道例如 (n, eA, dA) 允许对 n 进行因子分解,从而计算 B 的 key ,这当然是一个很大的缺陷。
现在我们可以将 m 加密为
meA mod n,
再次加密为
meAeB mod n,
用 A 的 secret key 解密
meB mod n,
并用B的 key 再次解密得到m。这看起来不错,直到有人注意到
可以截获两个密文 c = meA mod n 和 c' = meB mod n 的攻击者可以使用 Euclid 算法找到 r,s 使得
r eA + s eB = 1
然后计算
m = cr (c')s mod n.
这个想法也适用于使用另一个答案中提出的 RC4 的解决方案。 Weis 的论文包含对攻击的详细描述。
关于encryption - 是否可以以与解密不同的顺序加密?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2002977/