端到端加密:public 密钥和私钥如何既不同又兼容?

End-to-end encryption: How can a public key and a private key be different, yet compatible?

由于public密钥用于加密消息,私钥用于解密消息,那么私钥和public密钥怎么可能相互兼容呢?绿钥匙怎么开红锁的门?

这是我的想法:

Hello被public密钥加密,变成%/))=。然后私钥解密消息。但由于密钥不同,生成的消息可能与已发送的消息不同 - 例如 &#(($

当然,我知道现实生活中使用的encryption/decryption算法是不同的,但问题是可以理解的。密钥是如何制作的,使得一个只能加密,另一个只能解密,同时两者都具有足够的信息以便彼此兼容?是处理这个问题的算法吗?

我认为你对它的概念有点误解;尝试用错误的密钥解密它不会得到错误的答案,您根本无法获得有效的解决方案...

如果你乘以2个质数(1是私钥,另一个是public密钥)那么唯一能整除它的就是它本身,1和2个质数。

虽然您可以遍历每个素数来找出它是由哪些素数组成的(通过检查它是否能整除为整数),但没有快速的方法来做到这一点。

例如,如果我说 91,它是由 7 和 13 组成的并不是很明显,如果您尝试将 91 除以任何其他值,您将不会得到整数答案。

当这些数字更长时,计算时间会呈指数增长,因此现代计算机需要等到宇宙热寂才能解出它们,因此它实际上是牢不可破的。

Tom Scott 在这段视频中解释得很好:https://www.youtube.com/watch?v=CINVwWHlzTY

Public-密钥密码学首先由 W. Diffie 和 M. Hellman 在他们的开创性论文“New Directions in Cryptography" (1976), in which they suggested that such system would be based on a trapdoor function 中描述。这样的假设函数很容易计算,但计算它的反函数efficiently 需要额外的信息,这将是私钥。(这篇论文很短,值得完整阅读,很少有一篇 11 页的论文对其领域有如此大的贡献。)

如另一个答案中所述,此类函数的一个示例可以基于整数分解问题:将两个素数相乘很容易,但没有有效的(经典)算法来找到乘积的分解。后来,Rivest、Shamir 和 Adleman 发明了基于该假设的 first public-key algorithm(虽然未被证实,但很合理)。

简而言之,可以取一对(e, N)作为一个public键,其中

  • e 是小质数(通常是 65537)
  • N 是两个非常大的不同素数 pq 的乘积,因此 gcd(e, φ(N))=1,其中 φ(N) = (p-1)*(q-1).

然后你可以找到d,这样:

cipher = plaintext ^ e mod N
plaintext = cipher ^ d mod N

这个d就是私钥。这里的技巧是,为了找到这样的 d,有必要知道 N 的因式分解,即 pq。 (正如@kelalaka 在评论和 his post 中指出的那样,在没有密钥的情况下,分解可能不是恢复纯文本所必需的,但是还没有人找到解决它的方法,所以这是另一个假设。)你可以在上面的 RSA link 中阅读更多详细信息。

用铅笔和纸很容易计算 RSA。它不提供任何安全性,但它可能会帮助您了解 public 和私钥如何不同但如何协同工作。

让我们使用 modulus,n = 143 和 public 键,e = 7和私钥,d = 43。这些数字的确定方式有些“神奇”,要提供真正的安全性,它们需要大得多。这里的问题是 143 是 public 密钥的一部分,它足够小,可以很容易地分解为素数 11 和 13,它们是导致私钥的神奇成分。

我们可以用这对密钥对数字 [0, n) 进行加密,因此我们将用数字 0–25 代替字母 A–Z。

RSA加密是c=memodn,其中m是“消息”,我们的编码字母, c 是该字母的密文。让我们逐个字母地加密“HELO”。

  • H -> 7: 77 mod 143 = 6
  • E -> 4: 47 mod 143 = 82
  • L -> 11: 117 mod 143 = 132
  • O -> 14: 147 mod 143 = 53

RSA解密为m=cdmodn

  • 643 mod 143 = 7 -> H
  • 8243 mod 143 = 4 -> E
  • 13243 mod 143 = 11 -> L
  • 5343 mod 143 = 14 -> O

因此,您可以看到 public 密钥 7 与私钥 43 不同,但它们与 modulus 143 在 mod 下协同工作求幂以提供可逆转换。

这是用来产生协同工作的密钥对的“魔法”。

  1. 选择两个质数:p = 11, q = 13
  2. 计算modulus:n = p x q = 143
  3. 计算总和:λ(n) = lcm(p - 1, q - 1) = lcm(10, 12) = 60
  4. 选择 public 与 λ(n) 互质的密钥 e: e = 7
  5. 确定私钥d: d = e-1 mod λ(n) = 43