encryption - 是否可以以与解密不同的顺序加密?

标签 encryption encryption-asymmetric

是否可以按一种顺序加密并按另一种顺序解密?例如,我有以下内容:

  • 纯文本.txt
  • 公钥/私钥对 1
  • 公钥/私钥对 2

  • 例子

    加密:
    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/

    相关文章:

    php - BCRYPT 和 Random SALTS 在数据库中一起

    java - java中的MD5算法解密

    java - 自定义 Java 公钥生成(比特币)

    javascript - Javascript 中的随机函数被认为是不安全的。真的有关系吗?

    encryption - 非对称加密

    java - 使用非对称加密(公共(public)私钥 Enc)时出现 IllegalBlockSize 异常

    java - 使用签名不匹配解密 hyperlocal (Google RTB)

    ssl - TCP/IP 套接字无法与 TLSv1_2_client_method() 建立安全连接

    Android - 将 RC4 与密码一起使用

    c# - 是否可以强制仅从已知客户端调用 Web 服务?