最简单的公私钥非对称加密例子(需要小学三年级数学水平才能看懂)

首先我们要知道,目前主要存在两种加密技术:
对称式加密和非对称式加密。

  • 对称加密:
    对称加密非常容易理解,指的是在加密和解密过程中使用同一个密钥。
    最简单的例子:
    明文“123”,密钥就是全部位+1,密文则是“234",接收者和发送者使用同一密钥(+1),将其逆操作一遍(-1),则恢复明文“123”

  • 非对称加密
    非对称加密比对称式加密要复杂一些,它使用两把密钥进行加密。这两把密钥被称为公钥和私钥形成的所谓的"密钥对",其最终目的是要实现用公钥加密的信息可以用私钥解开,反过来私钥加密的内容公钥也能解开。 那么,如何实现这一点呢?现在举一个建立在乘法关系上的最简单的例子。


第一步:信息隐藏基本原理

基础概念:任意数乘以 1 等于任意数本身。
将这个概念扩展一下,可以得出:
设 N 为乘数, M 为被乘数
N 的个位为 1 且 N 的位数大于 M,则两者的积可以映射
出 M 的值。
例:1001 这个数,乘以任何一个 3 位数,其结果的末三位一定是 M 本身。
在这里插入图片描述
注意:NM 相乘的积要完整映射 M,则 N 的中间位数必须填充为 0.又因为我们只需要在结果的末位还原 M,因此N 的最高位可以是 1-9 内任选一个。例:2001 这个数,与 1001 产生的效果完全一样:

在这里插入图片描述
现在将上述例子普适化,则有:
需求: N 乘以 M ,两者之积的末位等于 M。
N 需满足以下条件:

  1. N 的位数必须大于 M
  2. N 的最低位(个位)等于 1
  3. N 的最高位从 1 - 9 任选
  4. 除了最高位和最低位外,N 的其余位数用 0 填充

满足以上 4 点,则需求成立。
现在,我们再代入一个实际数字进行验算:
设 M = 5872 (任意数)
N 最高位从 1 到 9 任选一个,例如:8
N 的个位为 1
N 的位数必须大于 5872(大于四位数)
N 除最高和最低位外,其余位数填充为 0
则有 N = 80001
将 N 和 M 相乘:
5872 * 80001 = 469765872 (积的后四位等于 M)
简而言之,在这一步,我们需要用一种特殊的数,即类
似 80001,9000001,400000001 这种数,将明文与这种
数相乘,其末位就能够映射明文本身。当然,这个特殊
数字不能直接作为密钥使用,我们还需要将它拆分为两
部分,即公钥和私钥。


第二步:公私钥创建

以 30 为例,首先求出它的全部约数:
{1,2,3,5,6,10,15,30}
约数总是成对出现的,那么 30 的约数对则有:
1 * 30 = 30
2 * 15 = 30
3 * 10 = 30
5 * 6 = 30
注意:任意数可以与 1 组成约数对。
原理:任意数乘以 30 的任意约数对,其积相等。

带入 5 为例:
[约数对选 1 和 30]
5 * 1 = 5 ,5 * 30 = 150, 5 * 150 = 750

[约数对选 2 和 15]
5 * 2 = 10, 5 * 15 = 75, 10 * 75 = 750

再举个例子,比如现在带入 6:
6 * 1 = 6 ,6 * 30 = 180, 6 * 180 = 1080
6 * 2 = 12, 6 * 15 = 90, 12 * 90 = 1080

现在,带入我们前面算出的 80001,枚举出它的所有约数对:
1 * 80001 = 80001
3 * 26667 = 80001
9 * 8889 = 80001
27 * 2963 = 80001

随便从上面的组合中挑一对,则形成了我们的公钥和私钥。
随机抽选一个数做验算(以 27 和 2963 为约数对):
例:明文 2133
2133 * 27(公钥) = 57591
57591 * 2963(私钥)= 170642133

现在,改用以 9 和 8889 做公私钥:
2133 * 9 = 19197
19197 * 8889 = 170642133

发现了吗,结果都是170642133。

利用任意数乘以80001的任意约数对,其积相等的原理,最终算出来的结果都是一样的。实际使用的时候,我们只将约数对的其中一半告诉对方,另一半秘而不宣,那么对方用其中一个约数乘出来的结果,如果不乘以另一半的话,则他无法知道最终的积是多少。例如,现在我们将 27 作为公钥,可以告诉任何人,任何人用 27 加密后的密文,却只有我能解出明文(因为私钥 2963 没有公开)

至此,就实现了用公钥加密的内容,可以用私钥解密,或者反过来用私钥加密的内容可以用公钥来解密这个目的


第三步:场景讨论

那么公私钥这种非对称式加密有什么用呢?

现在拿银行做例子:
比如你访问工行的网站,你怎么能确定这个网站就是真的工行而不是钓鱼网站呢?

1、采用对称式加密方法:
工行和你首先约定一个密钥,你将一段明文用该密钥加密后传给工行,工行用同样的密钥解密出明文再
发回给你,如果明文对得上,说明该网站是真实的。但问题来了,这个密钥如果在传输过程中被窃听了,那么黑客随时可以利用相同的密钥对密文进行解密,对称加密的一大缺点是密钥的管理与分配,换句话说,如何把密钥发送到需要解密你的消息的人的手里是一个大问题。

2、采用非对称加密方法:
工行先算出两把钥匙(即一对公私钥),它只把公钥给你,私钥由银行自己保存,不接触网络。当你拿
到公钥后,对一段明文进行加密,现在,你将密文发送给工行,那么工行利用私钥将解密后的明文返回给你,如果返回的明文和你之前的明文对得上,那么确定是真实的工行无疑。即使传输过程中被黑客窃听也不怕,因为黑客没有私钥(私钥保存在工行内部且不接触外部网络),就算最糟糕的情况公钥和密文两者都被窃听了他也无法解密,也无法向你回传正确的明文,因此也就无法冒充工行网站。

当然,这里仅仅是展示一下原理,乘法这种关系还是太单薄,是可以通过穷举法破解的。真实的环境都是采用比如 RSA 这样的算法,使用的是指数和取模运算,但其底层逻辑跟上例一样,只是复杂程度更为困难,这里不做延申讨论。

猜你喜欢

转载自blog.csdn.net/rockage/article/details/127573855
今日推荐