既然公钥用来加密消息,私钥用来解密消息,那么私钥和公钥怎么可能兼容呢?绿色钥匙怎么能打开红色锁的门?
这是我的想法:
Hello
被公钥加密,变成%/))=
. 然后私钥解密消息。但是由于密钥不同,因此生成的消息可能与已发送的消息不同 -&#(($
例如。
当然,我知道现实生活中使用的加密/解密算法是不同的,但问题是可以理解的。密钥是如何制作的,使得一个只能加密,另一个只能解密,同时两者都有足够的信息以使它们相互兼容?是处理这个问题的算法吗?
既然公钥用来加密消息,私钥用来解密消息,那么私钥和公钥怎么可能兼容呢?绿色钥匙怎么能打开红色锁的门?
这是我的想法:
Hello
被公钥加密,变成%/))=
. 然后私钥解密消息。但是由于密钥不同,因此生成的消息可能与已发送的消息不同 -&#(($
例如。
当然,我知道现实生活中使用的加密/解密算法是不同的,但问题是可以理解的。密钥是如何制作的,使得一个只能加密,另一个只能解密,同时两者都有足够的信息以使它们相互兼容?是处理这个问题的算法吗?
公钥密码学首先由 W. Diffie 和 M. Hellman 在他们的开创性论文“密码学新方向”(1976 年)中描述,他们在其中建议这种系统将基于陷门函数。这样的假设函数很容易计算,但有效地计算它的逆函数需要额外的信息,这将是私钥。(这篇论文很短,值得一读,很少有 11 页的论文对其领域有这么大的贡献。)
如另一个答案中所述,此类函数的一个示例可以基于整数分解问题:将两个素数相乘很容易,但是没有有效的(经典)算法来找到乘积的分解。后来,Rivest、Shamir 和 Adleman 发明了第一个基于该假设的公钥算法(虽然很合理,但尚未得到证实)。
简而言之,您可以将一对作为(e, N)
公钥,其中
e
是小的素数(通常是 65537)N
是两个非常大的不同素数p
和的乘积q
,这样gcd(e, φ(N))=1
, 哪里φ(N) = (p-1)*(q-1)
。然后你可以找到d
,这样:
cipher = plaintext ^ e mod N
plaintext = cipher ^ d mod N
这d
是私钥。这里的诀窍是,为了找到这样d
的 ,有必要知道N
, 即p
和的因式分解q
。(正如@kelalaka 在评论和他的帖子中指出的那样,分解可能不需要在没有密钥的情况下恢复纯文本,但还没有人找到解决方法,所以这是另一个假设。)你可以阅读更多上面的 RSA 链接中的详细信息。
用铅笔和纸计算 RSA 很容易。它不提供任何安全性,但它可以帮助您了解公钥和私钥如何不同但如何协同工作。
让我们使用模数n = 143,公钥e = 7 和私钥d = 43。这些数字的确定方式有一些“魔力”,为了提供真正的安全性,它们需要很多, 大得多。这里的问题是 143 是公钥的一部分,它足够小,可以很容易地分解为素数 11 和 13,它们是导致私钥的神奇成分。
我们可以用这个密钥对加密数字 [0, n),因此我们将用数字 0-25 代替字母 A-Z。
RSA 加密是 c = m e mod n,其中m是“消息”,即我们的编码字母,c是该字母的密文。让我们一个字母一个字母地加密“HELO”。
RSA 解密为 m = c d mod n
因此,您可以看到公钥 7 与私钥 43 不同,但它们在模幂运算下与模数 143 一起工作以提供可逆变换。
这是用于提出可以协同工作的密钥对的“魔法”。
我认为您对此略有误解;尝试用错误的密钥解密它并不会得到错误的答案,您根本无法获得有效的解决方案...
如果你乘以 2 个素数(1 是私钥,另一个是公钥),那么它唯一能被它自己整除的就是 1 和 2 个素数。
虽然您可以检查每个素数以找出它是由哪些素数组成的(通过检查它是否分成一个整数),但没有快速的方法可以做到这一点。
例如,如果我说 91,它不是由 7 和 13 组成的,并且如果您尝试将 91 除以其他任何值,您将不会得到整数答案。
当这些数字更长时,计算所需的时间呈指数级增长,因此需要一台现代计算机直到宇宙热死才能解决它们,因此它实际上是牢不可破的。
汤姆斯科特在这段视频中解释得很好:https ://www.youtube.com/watch?v=CINVwWHlzTY