如果您从事软件开发工作,您很可能已经以某种方式接触到密码学。签名消息、加密有效负载、验证签名和使用证书;这些是我们每天都在使用的功能,即使我们不知道。公钥密码学或非对称密码学是70年代中期开始的广泛科学研究的主题,也是当今众多书籍和研究论文的目标。这绝不是试图展示具有任何科学或学术细节水平的密码技术。相反,我将尝试展示非对称加密背后的关键功能概念,并提供如何使用它的示例(同时尽量避免使用行话)。在以下部分中,我们将讨论:对称加密与非对称加密。密钥生成。非对称加密,或如何发送加密消息。签署有效载荷。证书。1.对称加密和非对称加密对称加密和非对称加密之间的区别在于密钥用于提供底层加密功能的方式:在对称加密中,相同的密钥用于加密和解密。密钥成为参与者之间共享的共享秘密。显然,随着参与者数量的增加,密钥泄露的风险也会增加。在上图中,如果Steve的PC受到威胁,任何拥有密钥的人都可以解密发送给Alice、John和Elizabeth的所有消息。因此,一旦共享秘密在任何一个位置遭到破坏,整个系统的安全性就会受到威胁。对称加密的主要缺点是需要使用单个共享密钥并找到安全的传播方式。对称加密是70年代中期之前使用的主要加密机制,当时研究人员开始建议使用一种替代方法来创建和传播密钥,更重要的是。这就是非对称加密诞生的时候:在非对称加密中,每一方都是一对密钥(公钥和私钥)的所有者。最大的突破是公钥不是两个或更多参与者应该小心隐藏的共享秘密。相反,参与者可以通过不受信任的网络交换公钥,甚至与其他任何人共享公钥。对称加密彻底改变了密码学领域,如今它构成了大多数大规模加密方案的基础。例如,互联网。2.密钥生成非对称加密中公钥和私钥的生成依赖于数学问题,尤其是单向函数。单向函数的特点是易于通过一种方式解决(即生成密钥),但逆向计算(即在具有加密有效负载时找到密钥)计算量大。正如我在本文开头所承诺的,我不会不必要地使用与密码学相关的技术术语。但是,请记住这一点:并非所有密钥都是一样的。密钥的质量和强度取决于用于生成它的算法和密钥中的位数。目前推荐使用Diffie-Hellman算法生成的密钥大小为2048位或更大,约为使用椭圆曲线算法生成的密钥的1/10。因此,是时候使用瑞士加密工具LibreSSL(v2.8.3,如果您使用的是OpenSSL,下面的大多数命令也应该如此)创建我们的第一个非对称加密密钥对。1.创建加密私钥opensslgenrsa-des3-outalice-privatekey.pem2048opensslgenrsa-des3-outbob-privatekey.pem2048您现在已经成功为Alice和Bob生成了私钥。LibreSSL和OpenSSL中还有其他选项用于指定关键属性,包括在生成期间使用椭圆曲线算法。私钥应该妥善保管,好吧……私密,并且永远不要与其他任何人共享。2.从私钥中提取公钥嵌入式,因此可以提取Alice和Bob的公钥并将其发送给任何感兴趣的方。3.非对称加密,或如何发送加密消息非对称加密适用于公钥和私钥。要发送加密消息,接收者的公钥用于加密过程,接收者的私钥用于解密过程,如下所示:以下是上述场景中涉及的步骤,Alice希望向Bob发送加密消息:爱丽丝获得鲍勃的公钥。Alice存储Bob的公钥以备将来使用。爱丽丝将鲍勃的公钥与有效负载一起使用,然后由她的加密软件对其进行加密。加密的有效负载将发送给Bob。Bob将他的私钥和Alice发送给他的解密软件的加密消息传递给他。Bob拥有Alice发送的原始有效载荷。因此,让我们进入实际部分并使用他的公钥向Bob发送一个加密文件。哦等等......我们不能!1.混合加密上面介绍的理论部分没有错,因为它的工作原理与宣传的完全一样。然而,非对称加密有一个“陷阱”:要加密的有效负载的大小必须(几乎)与用于加密的公钥的大小相匹配。因此,要向Bob发送一张大约1MB的照片,您需要Bob拥有至少800万位的公钥。那是八百万个1和0,一个接一个。生成这样的密钥可能是不切实际的——即使它是可能的。尽管您可以创建一种结构,其中在块模式下使用非对称加密来加密大型有效载荷,但通过以接近可用公钥大小的较小位加密有效载荷,实际上没有人使用。就所用空间而言效率低下,而且速度会很慢。为了缓解非对称加密的密钥大小限制,目前的做法是使用混合加密:在混合加密中,创建一个随机对称密钥来加密负载,并使用公钥来加密随机对称密钥。让我们看看它是如何工作的:Bob将他的公钥发送给Alice。Alice生成一个共享的对称密钥。Alice使用Bob的公钥加密对称密钥。Alice使用在(2)中创建的共享密钥加密消息。Alice将加密的消息和加密的共享密钥发送给Bob。Bob使用他的私钥解密共享秘密。Bob使用共享密钥解密加密的消息。如果手动完成,上述内容将是冗长乏味的。但是,有成熟的工具和标准可以自动和安全地交换消息和文件,例如OpenPGP及其在PGP和GPG中的化身。2、使用GPG加密(GNUPrivacyGuard)GnuPG是RFC4880(也称为PGP)定义的OpenPGP标准的完整免费实现。GnuPG允许您对数据和通信进行加密和签名,并具有通用密钥管理系统以及各种公钥目录的访问模块。现在,让我们尝试使用GPG将加密文件从Alice发送给Bob:Alice和Bob都需要创建一个GPG密钥对:gpg--gen-keyBob应该导出他的公钥并将其发送给Alice:gpg--outputbob.gpg--exportbob@bob.com一旦Alice收到Bob的公钥,她应该将其导入她的本地密钥数据库:gpg--importbob.gpgAlice创建未加密的消息:echo"HelloBob">bob.msgAlice加密消息并使用加密的共享秘密将加密消息发送给Bob:gpg--outputbob.msg.gpg--encrypt--recipientbob@bob。combob.msgBob收到加密消息,通过解密共享密钥解密加密消息:gpg--outputbob.msg--decryptbob.msg.pgpGPG和PGP都被广泛使用,并且已经包含在我们每天使用的许多产品中,例如电子邮件客户端,因此您几乎不必手动执行上述序列。4.对有效载荷进行签名有时,没有必要对消息的内容进行加密,但是,我们可能仍希望确保发送者的身份。其他时候,内容需要加密,发送者的身份需要验证。在这两种情况下,这都是我们使用数字签名的地方。在我们了解如何生成数字签名以及如何验证内容和验证发送者身份之前,让我们在这里做一个重要的区分——我经常看到人们互换使用:数字签名不是电子签名。1.数字签名数字签名只是一种数学证明,用于验证数字信息的真实性。它使消息的接收者高度确定特定消息是由已知发件人创建的,并且该消息在传输过程中没有被更改。2.电子签名电子签名带有物理签名的意图,通常使用数字签名来实现这一点。在许多国家,电子签名只要符合其所依据的特定法规的要求,就可以提供与手写签名相同的法律地位。发送方使用私钥生成数字签名,接收方使用发送方的公钥验证数字签名:Alice将她的公钥发送给Bob。Alice创建一条消息并使用她的公钥生成数字签名。通常,数字签名是在消息的计算哈希值上生成的,例如在生成的SHA-256上。Bob收到原始的未加密消息以及Alice对该消息的数字签名。Bob使用Alice的公钥重新计算原始未加密消息的数字签名,并将其与Alice发送的签名进行比较。如果两个签名匹配,Bob就知道是Alice发送了原始消息,并且消息的内容没有被更改。接下来,让我们看看如何创建数字签名以及收件人如何验证收到的邮件未被篡改。3.签名openssldgst-sha256-signalice-privatekey.pem-outbob.msg.signbob.msg上面的命令使用Alice的私钥计算bob.msg文件的SHA-256输出的数字签名。然后Alice将bob.msg和bob.msg.sign文件发送给Bob。4.验证签名openssldgst-sha256-verifyalice-publickey.pem-signaturebob.msg.signbob.msgBob收到了来自Alice的两个文件,并继续使用Alice的公钥验证签名。上述命令根据数字签名验证结果返回“VerifiedOK”或“VerificationFailure”。五、证书证书,又称数字证书、身份证书或公钥证书,是证明公钥所有权的电子文件。最常见的证书格式由X.509定义,它基本上包含公钥、该公钥的数字签名以及有关公钥所有者身份的信息。证书可用于多种用途,因此有不同的证书配置文件。公钥对应于证书的所有者。但是,要让任何其他人能够验证所有者的身份,就需要一个受信任的第三方实体。这就是证书颁发机构的用途。证书颁发机构是负责签署证书的一方,通常是知名且受信任的公司或组织。为了有效地发挥这一作用,证书颁发机构需要拥有自己的根证书,并获得尽可能多的用户的信任。但是,证书颁发机构也可以提供交叉签名,它签署其他证书颁发机构的根证书。起初这听起来可能令人困惑,所以让我们试着用一个例子来说明:在上面的例子中,Bob连接到Alice的网站并想验证它是由Alice运行的。Bob在访问Alice的网站时获得证书。该证书包含Alice的公钥和来自证书颁发机构CA1的数字签名。由于Bob不知道也不信任CA1,因此他检查嵌入在证书中的证书链。通过追溯可用的交叉签名,Bob找到了他信任的证书颁发机构CA3。现在,他知道Alice的网站可以信任由Alice运营。当然,所有这些过程都是在HTTPS协议的传输层安全(TLS)下由互联网浏览器在幕后执行的。证书身份验证基于普遍信任的父证书颁发机构这一事实也是对证书的主要批评之一。如果该父证书颁发机构遭到破坏或变得流氓怎么办?尽管证书主要用于网站隐私、身份和内容真实性,但它们也可用于客户端识别。如果您对自己的证书颁发机构感兴趣,可以尝试使用各种可用的开源实现之一,例如OpenCA、EJBCA或OpenXKPI。当然,考虑到您自己的证书颁发机构的根证书不会被您的互联网浏览器或其他任何人信任,您需要按照操作系统的说明手动将其插入受信任的证书存储区。这同样适用于所有使用您自己的证书颁发机构颁发的证书的用户计算机。不,没有一个选择是让一个知名的大型根证书颁发机构交叉签署您自己的证书颁发机构的根证书。结论公钥密码术或非对称加密是一种基于密钥对、公钥和私钥的密码系统。非对称加密的主要用例是加密通信,提供消息认证和真实性。在本文中,我试图介绍非对称加密背后的基本概念,尽管只是触及了如此复杂主题的表面。密码学是一个引人入胜的领域,迄今为止一直在积极研究,并为好奇的人提供了丰富的信息。在开始之前,如果您的项目需要加密,请记住加密的黄金法则:不要抵押自己的加密货币。有许多库已经实现了健壮、安全、经过验证的算法。做你的研究并选择那些已经满足你的项目需求的。
