密码学/公钥概述
我们在本书的前面简要提到了 非对称密码。 在本章和后续章节中,我们将更详细地描述它们的工作原理。
公钥密码学的发现彻底改变了 1970 年代密码学的实践。 在公钥密码学中,用于加密消息的密钥与用于解密消息的密钥不同。 这需要非对称密钥算法。
(所有以前的密码算法和密码系统,现在被追溯分类为“对称密钥密码学”或“共享密钥密码学”,始终使用相同的密钥来加密消息,并在稍后解密该消息)。
公钥密码学是一种密码学,其中人和人之间的密钥交换过程不必保密。 私钥实际上从未交换过。 事实上,人 A 将信息(可能是关于会话密钥的信息)发送给 B,以便只有 B 能够理解。 攻击者无法发现交换的意义,因为 B 拥有攻击者没有的信息。 人 A 也没有访问 B 的秘密信息(私钥),他只是通过“公钥”间接访问了它。 公钥是通过使用单向函数从私钥生成的。
公钥密码学背后的概念可以用一个简单的谜题来表达。
爱丽丝想给鲍勃发送一个饰品,而没有让入侵者偷走。 每个人都有一个锁和一把钥匙。 非公钥解决方案
- 爱丽丝把她的钥匙放进盒子里,送到鲍勃那里。
- 鲍勃复制了钥匙,并把它寄了回来。
- 爱丽丝将饰品装在一个锁定的盒子里寄出。
- 鲍勃用复制的钥匙打开盒子。
虽然这种解决方案是最直观的,但它有一个主要的问题。 攻击者可以监控这些盒子并复制发送的钥匙。 如果攻击者拥有爱丽丝的钥匙,饰品或其他任何东西在运输途中都会被盗。 对一些人来说,这个谜题似乎不可能,但那些了解公钥密码学的人很容易解决它。 公钥解决方案
- 爱丽丝将饰品放在一个盒子里,锁上并送到鲍勃那里。
- 鲍勃用自己的锁再次锁上盒子,然后将盒子寄回来。
- 爱丽丝取下她的锁,寄给鲍勃。
- 鲍勃取下最后的锁,拿走了饰品。
这个谜题的诀窍是给盒子加了两道锁。
这种来回的“双锁”过程在许多非对称密钥算法中使用,例如 ElGamal 加密和 Diffie-Hellman 密钥交换,但并非所有算法都使用。
这就是双锁原则,但它不是公钥密码学,因为两个密钥都是秘密的。 在公钥密码学中,一个密钥是公开的,另一个是秘密的。 任何知道公钥的人都不能解密用公钥加密的消息。 只有秘密密钥才能解密用公钥加密的消息。
公钥在现实世界中的类比是挂锁。 挂锁很容易关上,但反过来就难多了,即打开。 这并不不可能,但与关上它相比,打开它需要更多的努力,假设你没有(私有)钥匙。 爱丽丝可以将一个打开的挂锁通过邮件寄给鲍勃(相当于公钥)。 然后,鲍勃将一个给爱丽丝的信息放入一个盒子里,并用挂锁锁上盒子。 现在,鲍勃将锁定的盒子寄回给爱丽丝,爱丽丝用她的私钥打开它。
请注意,这种方法容易受到中间人攻击。 如果查尔斯拦截了带有爱丽丝挂锁的邮件,并用他自己的挂锁替换了它,鲍勃将用错误的挂锁锁上盒子,查尔斯将能够拦截答案。 然后,查尔斯甚至可以用爱丽丝的挂锁再次锁上盒子,并将盒子转发给爱丽丝。 这样,她将永远不会注意到信息被拦截了。 这说明从可信来源获取公钥(挂锁)非常重要。 这正是证书的用途。 它们与公钥一起提供,基本上会说一些类似“我,微软,在此确认此挂锁属于爱丽丝”的话,并使用安全的数字签名进行签名。
因此,如果爱丽丝公开了她的密钥,有人(鲍勃)就可以安全地向爱丽丝发送加密数据。
鲍勃能够证明自己拥有一个秘密密钥,方法是提供
- 纯文本
- 用秘密密钥加密的相同文本
- 与秘密密钥相对应的公钥。
与双锁原则类似的是 Merkle 的谜题,它是 Diffie-Hellman 密钥交换的祖先,而 Diffie-Hellman 密钥交换本身与 RSA 公钥系统非常相似。