Encryption 是否可以按与解密不同的顺序进行加密?

Encryption 是否可以按与解密不同的顺序进行加密?,encryption,encryption-asymmetric,Encryption,Encryption Asymmetric,可以按一种顺序加密,按另一种顺序解密吗?例如,我得到了以下信息: 纯文本.txt 公钥/私钥对1 公钥/私钥对2 例子 加密: public1(public2(plain_text.txt)) 解密: private1(private2(encrypted)) 是否有任何加密算法允许这样做?甚至有可能吗?AFAIK只要对RSA稍加修改,这应该是可能的。我不知道有哪种工具能够真正做到这一点。对于大多数公开的RSA实现,这是不可能的。解密例程期望明文采用特定格式(即正确填充),如果不是,则会

可以按一种顺序加密,按另一种顺序解密吗?例如,我得到了以下信息:

  • 纯文本.txt
  • 公钥/私钥对1
  • 公钥/私钥对2
例子 加密:

public1(public2(plain_text.txt))
解密:

private1(private2(encrypted))

是否有任何加密算法允许这样做?甚至有可能吗?

AFAIK只要对RSA稍加修改,这应该是可能的。我不知道有哪种工具能够真正做到这一点。

对于大多数公开的RSA实现,这是不可能的。解密例程期望明文采用特定格式(即正确填充),如果不是,则会失败。同样,在加密时,它会对明文应用填充,而不是像现在这样使用blob

/* RSA的数学允许这样做,AFAIK,只要两个键的模是互质的(这几乎总是正确的)。但您可能必须推出自己的实现。 */

另一个问题是明文块的数值应该小于模数。因此,第一个密钥的模数应该小于第二个密钥的模数,否则无法保证第一个密码文本在第二轮加密中是正确的明文

我隐约记得,OpenSSL有一种无填充模式。你可能会有一些运气

编辑:一般来说,在99.9%的情况下,提出自己的加密原语是个坏主意。如果你的兴趣纯粹是学术性的,那就请便吧;但是如果你想要的是一个特定的应用功能(即加密某些东西,以便需要两个非信任方的同意才能解密),那么你肯定走错了方向


EDIT2:如果模相同,RSA的数学就允许这样做。划掉第二段。但是,两个密钥共享相同的模数会极大地降低安全性。如果Alice有私钥(m,d),Cindy作为私钥(m,d')——假设相同的m——那么Alice可以在O(m)时间内确定d',给定Cindy的单个明文/密码文本对。不好。

对于公钥/私钥加密,答案是否定的。
PubK1(PubK2(plain.text))
=>encrypted.text。您必须使用
PrivK2(PrivK1(encrypted.text))
进行解密


但是,如果使用对称流密码(如RC4),则可以更改解密顺序(a xor B xor C=C xor B xor a)。但这显然不是一个公钥/私钥算法。

不,它不起作用。很简单,您不能保证唯一解密,因为一个模数比另一个大

编辑:我假设这是RSA。如果不是,那么我就得考虑其他的一些


EDIT2:如果您总是愿意先使用较小的模,那么它确实有效。

只有当加密算法表现为一种特定类型的加密算法时,这才是正确的。大多数(全部?)块加密算法不是这样的组。

在大多数情况下,您无法更改解密顺序。 允许重新排序解密的方案称为交换密码系统。 一种可用于构建交换密码系统的公钥密码系统是 这个

这里只是主要的想法:假设g是 一个合适的群G,对于它计算离散对数是困难的。 假设xA和xB是两个私钥, hA=g xA,和 hB=gxb 是相应的公钥。两个密钥对使用相同的组 G(即,如果我们使用G=Z/(p),则相同的模量p)。这是这项技术的一个优点 ElGamal方案,如果两个用户共享同一组(或模),则仍然是安全的。 另一方面,RSA将是不安全的

使用hA对消息m进行加密会产生密文

(男,女)

注意,知道密钥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'

因此我们可以计算

(哈佛商学院理学学士、理学学士)

这正是我们想要的:用B的公钥对m进行加密

要获得一个安全的实现,需要注意许多细微之处。 要做到这一点并不容易。 有关更多信息,请参见示例,其中包含关于交换加密的一章


如果在“教科书RSA”中尝试同样的想法,会有很多问题。首先,为了使加密可交换,用户A和B必须共享相同的模。 例如,A使用(n,eA,dA)和B使用(n,eB,dB),其中n是模数,eA,eB是公钥,dA,dB是私钥。然而,知道例如(n,eA,dA)允许因子n,从而计算B的密钥,这当然是一个很大的缺陷

现在我们可以将m加密为

meA mod n

再次加密为

meAeB mod n

使用A的密钥进行解密

meB模块n

然后用B的密钥再次解密得到m。看起来不错,直到有人注意到 能够截获两个密文c=meA mod n和c'=meB mod n的攻击者可以使用欧几里德算法找到r,s,从而

r eA+s eB=1

然后计算

m=cr(c')s模块n


这个想法也与另一个答案中提出的使用RC4的解决方案相反。Weis的论文详细描述了这次攻击。

为什么顺序很重要?相反,为什么顺序需要重要呢?拆分私钥(使用Blakely Shamir key splitti)会吗