是否可以以一种顺序加密并以另一种顺序解密?例如,我有以下内容:
- 纯文本.txt
- 公钥/私钥对 1
- 公钥/私钥对 2
例子
加密:
public1(public2(plain_text.txt))
解密:
private1(private2(encrypted))
是否有任何加密算法允许这样做?甚至可能吗?
是否可以以一种顺序加密并以另一种顺序解密?例如,我有以下内容:
加密:
public1(public2(plain_text.txt))
解密:
private1(private2(encrypted))
是否有任何加密算法允许这样做?甚至可能吗?
在大多数情况下,您无法更改解密顺序。允许重新排序解密的方案称为交换密码系统。一种可用于构建可交换密码系统的公钥密码系统是ElGamal 加密。
这里只是主要思想:假设 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得到密文
(mh 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' ) = (mh 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'
因此可以计算
(mh B s , g s ),
这正是我们想要的:用 B 的公钥对 m 进行加密。
要获得安全的实施,需要注意许多细微之处。而要做到这一点并不容易。有关更多信息,请参见Stephen Weis的博士,其中包含关于交换加密的一章。
如果使用“教科书 RSA”尝试相同的想法,则会出现许多问题。首先要使加密可交换,用户 A 和 B 必须共享相同的模数。例如,A 使用 (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 加密为
我是一个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 的攻击者可以使用欧几里得算法找到 r,s 使得
re A + se B = 1
然后计算
m = c r (c') s mod n。
这个想法也适用于另一个答案中提出的使用 RC4 的解决方案。Weis 的论文包含对攻击的详细描述。
对于 RSA 的大多数公共实现,这是不可能的。解密例程期望明文采用特定格式(即正确填充),如果不是,则失败。同样,在加密时,它将对明文应用填充,而不是按原样使用 blob。
/* RSA 的数学允许这样做,AFAIK,只要两个键的模是互质的(几乎总是如此)。但是您可能必须推出自己的实现。*/
另一个问题是明文块的数值应该小于模数。所以第一个密钥的模数应该小于第二个密钥的模数,否则不能保证第一个密文将是第二轮加密的正确明文。
我隐约记得,OpenSSL 有一个无填充模式。你可能有一些运气。
编辑:一般来说,在 99.9% 的情况下,提出自己的加密原语是一个坏主意。如果您的兴趣纯粹是学术上的,那么请做我的客人;但是,如果您追求的是特定的应用功能(即加密某些东西,以便需要两个非信任方的同意才能解密),那么您肯定走错了路。
EDIT2:如果模数相同,则 RSA 的数学允许这样做。刮第二段。但是让两个密钥共享相同的模数会极大地损害安全性。如果 Alice 有私钥 (m, d) 和 Cindy 作为私钥 (m, d') - 假设相同的 m - 那么 Alice 可以在 O(m) 时间内确定 d',给定来自 Cindy 的单个明文/密文对。不好。
This would only be true if the encryption algorithm behaved as a specific kind of mathematical group. Most (all?) block encryption algorithms are not such groups.
使用公钥/私钥加密,答案是否定的。 PubK1(PubK2(plain.text))
=> 加密的文本。您必须使用 解密PrivK2(PrivK1(encrypted.text))
。
但是,如果您使用 RC4 等对称流密码,则可以更改解密顺序(A xor B xor C = C xor B xor A)。但这显然不是公钥/私钥算法。
AFAIK 这应该可以通过对 RSA 进行轻微修改来实现。我不知道有什么工具可以真正做到这一点。
不,它不起作用。很简单,你不能保证唯一的解密,因为一个模数比另一个大。
编辑:我假设这是 RSA。如果没有,那么我将不得不考虑其他一些。
EDIT2:如果您总是愿意先使用较小的模数,那么它确实有效。