|
|
51CTO旗下网站
|
|
移动端

公钥密码学简介

在本文中,我试图介绍非对称加密背后的基本概念,尽管只是从头开始讨论了这样一个复杂的话题。

作者:闻数起舞来源:今日头条|2020-05-20 08:35

如果您从事软件开发,则可能已经以一种或另一种方式向您介绍了加密技术。 签名消息,加密有效载荷,验证签名以及使用证书; 这些都是我们每天都使用的功能,即使我们不知道也是如此。

公钥密码学或非对称密码学是70年代中期开始的广泛科学研究的主题,也是当今众多书籍和研究论文的目标。

这绝不是试图以任何水平的科学或学术细节介绍密码技术。

相反,我将尝试展示非对称密码技术背后的关键功能概念,并提供示例说明如何使用它(同时尽量避免使用专业术语)。

在以下各节中,我们将讨论:

  • 对称加密与非对称加密。
  • 密钥生成。
  • 非对称加密,或如何发送加密的消息。
  • 签署有效载荷。
  • 证书。

一、对称加密与非对称加密

对称加密与非对称加密的区别在于使用密钥来交付基础加密功能的方式:

在对称加密中,同一密钥既用于加密又用于解密。 密钥成为参与者之间共享的共享秘密。

显然,随着参与者数量的增加,泄露密钥的风险也随之增加。

在上图中,如果 史蒂夫(Steve)的PC受到了威胁,任何获得密钥的人都可以解密发送给爱丽丝(Alice),约翰(John)和伊丽莎白(Elizabeth)的所有消息。

因此,一旦共享秘密在任何单个位置受到破坏,整个系统的安全性就会受到损害。 对称加密的主要缺点是使用单个共享密钥以及找到安全的传播方式的要求。

对称加密是直到70年代中期之前使用的主要加密机制,当时研究人员开始建议使用另一种方法来创建和传播密钥,更重要的是。

这是非对称加密诞生的时候:

公钥密码学简介

在非对称加密中,每一方都是一对密钥(公共密钥和私有密钥)的所有者。

最大的突破是,公开密钥不是一个共享的秘密,应该由两个或多个参与者小心地隐藏起来。 相反,参与者可以通过不受信任的网络交换公用密钥,甚至可以与其他任何人共享公用密钥。

对称加密彻底改变了密码学领域,如今它已成为大多数大规模加密方案的基础。 例如,互联网。

二、密钥生成

非对称加密中公钥和私钥的创建取决于数学问题,尤其是单向函数。

单向函数的特征在于易于以一种方式解决(即生成密钥),但是反计算(即在具有加密的有效载荷时找到密钥)在计算上非常昂贵。

就像我在本文开头所承诺的那样,我不会不必要地使用与密码学有关的技术术语。 但是,请记住这一点:并非所有键都是相同的。

密钥的质量和强度取决于生成密钥的算法以及密钥的位数。

当前使用Diffie-Hellman算法生成的密钥的密钥大小建议为2048位或更大,约为使用椭圆曲线算法生成的密钥的1/10。

因此,是时候使用瑞士的加密工具LibreSSL(v2.8.3,如果您使用的是OpenSSL,下面的大多数命令也应如此)来创建我们的第一个非对称加密密钥对。

1. 创建一个加密的私钥

  1. openssl genrsa -des3 -out alice-privatekey.pem 2048openssl genrsa -des3 -out bob-privatekey.pem 2048 

您现在已经成功为Alice和Bob生成了私钥。 LibreSSL和OpenSSL中都有指定密钥属性的其他选项,包括在生成过程中使用椭圆曲线算法。

私钥应该保持,好…私密,切勿与其他任何人共享。

2. 从私钥中提取公钥

  1. openssl rsa -in alice-privatekey.pem -outform PEM -pubout -out alice-publickey.pemopenssl rsa -in bob-privatekey.pem -outform PEM -pubout -out bob-publickey.pem 

现在,由于没有嵌入任何敏感信息,因此可以提取Alice和Bob的公钥并将其发送给任何感兴趣的方。

三、非对称加密,或如何发送加密的消息

非对称加密适用于公钥和私钥。 要发送加密的消息,在加密过程中使用接收者的公钥,在解密过程中使用接收者的私钥,如下所示:

以下是上述场景中涉及的步骤,其中Alice希望将加密的消息发送给Bob:

  • 爱丽丝获得鲍勃的公钥。
  • 爱丽丝存储鲍勃的公钥以备将来使用。
  • 爱丽丝将鲍勃的公钥与有效载荷一起使用,然后将其通过她的加密软件进行加密。
  • 加密的有效负载将发送到Bob。
  • 鲍勃将自己的私钥和爱丽丝发送给他的解密软件的加密消息传递。
  • Bob获得了Alice发送的原始有效负载。

因此,让我们进入实际部分,并使用Bob的公钥向他发送加密文件。 哦,等等…我们不能!

1. 混合加密

上面介绍的理论部分没有任何问题,因为它的工作原理与广告宣传完全一样。 但是,有一个不对称加密的"陷阱":要加密的有效负载的大小必须(几乎)与用于加密的公钥的大小匹配。

因此,要向Bob发送大约1MB的照片,您需要Bob拥有至少800万比特的公共密钥。 那是八百万个1和0,一个接一个。 生成这样的密钥可能不太实际-即使可以实现。

尽管您可以创建一种结构,在该结构中以块模式使用非对称加密来加密大型有效负载,但是通过以接近可用公共密钥大小的较小比特来加密有效负载,实际上,这是没人在使用的东西。 就所用空间而言,效率低下,而且速度将非常缓慢。

为了减轻非对称加密的密钥大小限制,当前的做法是使用混合加密:

公钥密码学简介

在混合加密中,将创建一个随机对称密钥来加密有效负载,并使用公共密钥来加密随机对称密钥。 让我们看看它是如何工作的:

  • 鲍勃将他的公钥发送给爱丽丝。
  • 爱丽丝生成共享的对称密钥。
  • 爱丽丝用鲍勃的公钥加密对称密钥。
  • 爱丽丝使用(2)中创建的共享密钥对消息进行加密。
  • 爱丽丝将加密的消息和加密的共享密钥发送给鲍勃。
  • 鲍勃使用他的私钥解密共享密钥。
  • 鲍勃使用共享密钥解密加密的消息。

如果手动执行,上述情况将是冗长而乏味的。 但是,有完善的工具和标准可以自动安全地交换消息和文件,例如OpenPGP及其在PGP和GPG中的化身。

2. 使用GPG加密(GNU Privacy Guard)

GnuPG是RFC4880(也称为PGP)定义的OpenPGP标准的完整和免费实现。

GnuPG允许您对数据和通信进行加密和签名,并具有通用的密钥管理系统以及用于各种公钥目录的访问模块。

现在,让我们尝试使用GPG将加密的文件从爱丽丝发送到鲍勃:

  • 爱丽丝和鲍勃都需要创建GPG密钥对:gpg –gen-key
  • 鲍勃应导出其公钥并将其发送给Alice:gpg –output bob.gpg –export bob@bob.com
  • 爱丽丝收到鲍勃的公钥后,应将其导入到本地密钥数据库中:gpg –import bob.gpg
  • 爱丽丝创建未加密的消息:echo" Hello Bob"> bob.msg
  • 爱丽丝对邮件进行加密,然后将加密的邮件与加密的共享密钥一起发送到Bob:gpg-输出bob.msg.gpg –encrypt-收件人bob@bob.com bob.msg
  • 鲍勃(Bob)接收加密的消息,并通过解密共享密钥并解密加密的消息来解密它:gpg –output bob.msg –decrypt bob.msg.pgp

GPG和PGP都已被广泛使用,并且已经包含在我们日常使用的许多产品中,例如电子邮件客户端,因此您几乎不必手动执行上述顺序。

四、签署有效载荷

有时,不一定需要加密消息的内容,但是,我们可能仍要确保发送者的身份。 其他时候,内容需要加密,发件人的身份也需要验证。 在两种情况下,这都是我们使用数字签名的地方。

在我们看到如何生成数字签名以及如何对内容进行验证以及验证发件人的身份之前,让我们在这里进行重要的区分-我经常看到人们可以互换使用:数字签名不是电子签名 。

1. 数字签名

数字签名只是用于验证数字消息真实性的数学证明。

它使邮件的接收者具有很高的确定性,可以相信特定的邮件是由已知的发件人创建的,并且该邮件在传输过程中没有被更改。

2. 电子签名

电子签名带有物理签名的意图,通常使用数字签名来实现。

在许多国家/地区,电子签名只要符合其所依据的特定法规的要求,就可以提供与手写签名相同的法律地位。

发送者使用私钥产生数字签名,接收者使用发送者的公钥验证数字签名:

公钥密码学简介
  • 爱丽丝将她的公钥发送给鲍勃。
  • 爱丽丝创建一条消息,并使用她的公钥产生数字签名。 通常,在消息的计算出的哈希值上,例如在所得的SHA-256上,产生数字签名。
  • Bob收到了原始的未加密消息以及该消息的Alice的数字签名。
  • Bob使用Alice的公钥重新计算了原始未加密邮件的数字签名,并将其与Alice发送的签名进行了比较。
  • 如果两个签名都匹配,则鲍勃知道是爱丽丝发送了原始邮件,并且邮件的内容没有更改。

接下来,让我们看看如何创建数字签名以及收件人如何验证收到的邮件是否未被篡改。

3. 签发签名

  1. openssl dgst -sha256 -sign alice-privatekey.pem -out bob.msg.sign bob.msg 

上面的命令使用Alice的私钥在bob.msg文件的SHA-256输出上计算数字签名。 然后,爱丽丝将bob.msg以及bob.msg.sign文件发送给Bob。

4. 验证签名

  1. openssl dgst -sha256 -verify alice-publickey.pem -signature bob.msg.sign bob.msg 

鲍勃从爱丽丝那里收到了两个文件,然后继续使用爱丽丝的公钥来验证签名。 上面的命令根据数字签名验证结果返回" Verified OK"或" Verification Failure"。

五、证书

证书,也称为数字证书,身份证书或公钥证书,是证明公钥所有权的电子文档。

证书的最常见格式由X.509定义,从根本上讲,它包含一个公共密钥,该公共密钥的数字签名以及有关公共密钥所有者身份的信息。

证书可用于多种目的,因此,存在不同的证书配置文件。

公钥对应于证书的所有者。 但是,要使其他任何人都能够验证所有者的身份,则需要一个受信任的第三方实体。

这就是证书颁发机构的用处。证书颁发机构是负责签署证书的一方,通常是受信任的知名公司或组织。

为了有效地执行此角色,证书颁发机构需要拥有自己的根证书,该证书由尽可能多的用户信任。 但是,证书颁发机构也可以提供交叉签名,从而对其他证书颁发机构的根证书进行签名。

刚开始时听起来可能会令人困惑,所以让我们尝试通过一个示例进行说明:

公钥密码学简介
  • 在上面的示例中,鲍勃连接到爱丽丝的网站,并希望验证是由爱丽丝经营的。
  • Bob在访问爱丽丝的网站时获得了证书。 该证书包含Alice的公钥以及来自证书颁发机构CA1的数字签名。
  • 由于Bob不了解也不信任CA1,因此他检查了嵌入证书中的证书链。
  • 通过追溯可用的交叉签名,Bob到达了他信任的证书颁发机构CA3。 现在,他知道爱丽丝的网站可以信任由爱丽丝运营。

当然,所有这些过程都是由Internet浏览器在幕后在HTTPS协议的传输层安全性(TLS)下进行的。

证书身份验证是基于共同受信任的父证书颁发机构的事实,这也是对证书的主要批评之一。

如果该父证书颁发机构被破坏或流氓怎么办?

尽管证书主要用于网站隐私,标识和内容可靠性,但它们也可以用于客户端标识。

如果您对自己的证书颁发机构感兴趣,可以尝试使用各种可用的开源实现之一,例如OpenCA,EJBCA或OpenXKPI。

公钥密码学简介

当然,请考虑到由于您自己的证书颁发机构的根证书不会被您的Internet浏览器或其他任何人信任,因此您需要按照操作系统的说明将其手动插入到受信任的证书存储中。

使用您自己的证书颁发机构颁发的证书的所有用户的计算机也是如此。

不,不是一种选择是让一个知名的大型根证书颁发机构对您自己的证书颁发机构的根证书进行交叉签名。

结论

公钥密码术或非对称加密是一种基于密钥对,公钥和私钥的密码系统。 非对称加密的主要用例是加密通信,提供消息验证和真实性。

在本文中,我试图介绍非对称加密背后的基本概念,尽管只是从头开始讨论了这样一个复杂的话题。 密码学是一个引人入胜的领域,迄今为止,它一直在进行积极的研究,并为好奇的人们提供了大量的信息。

离开之前,如果您需要在项目中进行加密,请牢记加密的黄金法则:不要投放自己的加密货币。

那里有许多库以及已经实施的强大,安全,经过考验的算法。 做研究并选择已经满足项目需求的研究。

【责任编辑:赵宁宁 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

云计算从入门到上瘾

云计算从入门到上瘾

传统IT工程师的转型
共26章 | 51CTO阿森

197人订阅学习

从头解锁Python运维

从头解锁Python运维

多维度详解
共19章 | 叱诧少帅

345人订阅学习

Active Directory 架构规划实战

Active Directory 架构规划实战

4类AD架构规划
共15章 | wx5918591c0084b

324人订阅学习

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO官微