加密的基础术语和概念

编程
9 min read
poster

与日常登录网站时输入的密码不同,这里所说的密码,是一种安全传送消息的方法,英文 cryptography,即密码术密码学

基础术语

发送者与接收者

以 Alice 向 Bob 发送电子邮件的场景为例:我们称邮件的发送方 Alice 为发送者(sender),邮件的接收方 Bob 为接收者(receiver)。

flowchart LR subgraph ga [ ] direction LR a([Alice]) -->|邮件| b[通信传输] -->|邮件| c([Bob]) end

邮件传送的过程中,邮件会在多台计算机和通信设备之间中转,中转的过程中,就存在被窃听的可能,窃听的人称为窃听者(eavesdropper)。

flowchart LR subgraph ga [ ] a([Alice]) -->|邮件| b[通信传输] -->|邮件| c([Bob]) end b -->|窃听| e([Eve]) style e fill:#fee2e2,stroke:#b91c1c,color:#b91c1c

上面的例子,只是方便叙述,便于人们理解发送者、接收者的概念,实际上发送者和接收者也可以指某种发送装置和接收装置,发送的内容也不仅仅局限于邮件,可以是任何内容,我们统称为消息(message)。而窃听者也可以是任何用来追踪信息的装置,或者安装在电脑上用来窃取信息的程序。

加密与解密

假设 Alice 为了防止窃听,决定对邮件进行加密。 加密前的消息称为明文(plaintext),加密之后的消息称为密文(ciphertext),将明文转化为密文的过程称为加密(encrypt)。

flowchart LR p["(明文)下午三点一起吃火锅"] --> e([加密]) --> c["(密文)jêäòV...ônTÇq"]

Bob 收到邮件后,需要做的第一件事就是对密文进行解密,只有解密后可读。解密(decrypt)就是将密文恢复成明文的过程。

flowchart LR c["(密文)jêäòV...ônTÇq"] --> d([解密]) --> p["(明文)下午三点一起吃火锅"]

正当的接收者将密文还原为明文称为解密,但接受者以外的其他人试图将密文还原为明文,则称为密码破译(cryptanalyst),简称破译,有时也称为密码分析,进行破译的人称为破译者(crypatanalyst)。

flowchart LR subgraph Alice a1[明文] -->|加密| a2[密文] end subgraph Bob b1[密文] -->|解密| b2[明文] end subgraph Eve e1[密文] -->|破译| e2[明文] end t -->|窃听| e1 a2 --> t([通信传输]) --> b1 style Eve fill:#fee2e2,stroke:#b91c1c,color:#b91c1c

密码算法

用于解决复杂问题的步骤,通常称为算法(algorithm)。从明文生成密文的步骤,也就是加密的步骤,称为“加密算法”,而解密的步骤则称为“解密算法”。加密、解密的算法合在一起统称为密码算法

秘钥(key):无论是加密还是解密,都需要秘钥,就像现实中的保险柜的钥匙,钥匙可以保护保险柜中物品的安全,而密码中的秘钥可以保护信息的安全。秘钥一般是一个非常大的数字,类似 2342893478239749823749823749823748 这样。

加密:

flowchart LR k["(秘钥)2342893478239749823749823749823748"] --> e p["(明文)下午三点一起吃火锅"] --> e([加密]) --> c["(密文)jêäòV...ônTÇq"]

解密:

flowchart LR k["(秘钥)2342893478239749823749823749823748"] --> e c["(密文)jêäòV...ônTÇq"] --> e([解密]) --> p["(明文)下午三点一起吃火锅"]

暴力破解(brute-forceattack):将所有可能的秘钥全部尝试一遍,由于这种方法的本质是从所有的秘钥中找出正确的秘钥,因此又称为穷举搜索(exhaustive search)。

秘钥空间(keyspace):一种密码能够使用的“所有秘钥的集合”称为秘钥空间,所有可用秘钥的总数就是秘钥空间的大小。秘钥空间越大,暴力破解就越困难。

加密方案

对称密码(对称加密)

根据秘钥的使用方法,可以将密码分为对称密码和公钥密码两种。 对称密码(symmetric cryptography)是指在加密和解密时使用同一秘钥的方式。

flowchart TB p1["(明文)下午三点一起吃火锅"] --> e([加密]) --> c["(密文)jêäòV...ônTÇq"] --> d([解密]) --> p2["(明文)下午三点一起吃火锅"] k1["(加密秘钥)2342893478239749823749823749"] --> e k2["(解密秘钥)2342893478239749823749823749"] --> d

最早的对称加密标准叫 DES(Data Encryption Standard),是 1977 年美国联邦信息处理标准(FIPS)中采用的一种对称密码,一直以来被政府和银行等广泛使用。然而随着计算机进步,现在 DES 已经能够被暴力破解。

根据 DES Challenge 比赛记录,1997 年破译秘钥用了 96 天,而在 1999 年的比赛,破译秘钥仅仅用了 22 小时 15 分钟。

新一代的对称密码标准为 AES (Advanced Encryption Standard),作为取代前任 DES 的新标准。AES 的选定过程是对全世界公开的,全世界的企业和密码学家提交了多个对称密码算法作为 AES 的候选,最终在 2000 年从这些候选算法中选出了一种名为 Rijndael 的对称密码算法,并将其确定为了 AES。

使用对称密码时,加秘解密使用同一个秘钥,这就会遇到一个棘手的问题:秘钥配送问题(key distribution problem)。双方在加密通信前,必须保证拿到了同样的秘钥,而且秘钥不能泄露。实际上,那个时候政府、军队等机构都是通过特工来配送秘钥,但如此高昂的秘钥配送成本个人和小公司是无法负担起的。直到公钥加密技术的发明,才解决了这个问题。

公钥密码(非对称加密)

公钥密码(public-key cryptography)则是指在加密和解密时使用不同秘钥的方式。因此公钥密码又称为非对称密码(asymmetric cryptography)。

flowchart TB p1["(明文)下午三点一起吃火锅"] --> e([加密]) --> c["(密文)jêäòV...ônTÇq"] --> d([解密]) --> p2["(明文)下午三点一起吃火锅"] k1["(加密秘钥)9809898787982375982347892364"] --> e k2["(解密秘钥)2378592378957878976676677346"] --> d

公钥密码中,加密秘钥一般是公开的,因此该秘钥被称为公钥(public key),公钥可以通过邮件直接发给接收者,也可以做成网页公开给世界上任何人,完全不必担心被窃听者截取。相对地,解密秘钥是绝对不能公开的,这个秘钥只能由你自己来使用,因此称为私钥(private key)。公钥和私钥是一一对应的,一对公钥和私钥统称为秘钥对(key pair)。用公钥加密的密文,必须使用该公钥配对的私钥才能够解密。

最广泛使用的公钥密码算法——RSA,它的名字是由它的三位开发者,即 Ron Rivest、Adi Shamir 和 Leonard Adleman 的姓氏首字母组成的(Rivest-Shamir-Adleman)。RSA 被广泛用于公钥密码和数字签名。

公钥密码并不是完美的,它的处理速度远低于对称密码。为了解决这个问题,又产生了一种新的方案——混合密码系统。

混合密码系统(混合加密)

混合密码系统(hybrid cryptosystem):将对称密码和公钥密码结合起来的密码方式称为混合密码系统,这种系统结合了对称密码和公钥密码两者的优势。、

将消息通过对称密码来加密,将加密消息时使用的秘钥通过公钥密码来加密,这样的两步密码机制就是混合密码系统的本质。

flowchart TB a["消息(混合密码系统的明文)"] b1(["用对称密码加密消息"]) b2["用对称密码加密后的消息"] b3(["组合"]) c1(["伪随机数生成器"]) c2["会话秘钥"] c3(["用公钥密码加密会话秘钥"]) c4["用公钥密码加密的会话秘钥"] d["接收者的公钥"] e1["用公钥密码加密的会话秘钥"] e2["用对称密码加密的消息"] subgraph sub-bc ["混合密码系统的加密过程"] direction LR subgraph sub-b ["加密消息"] b1 b2 end subgraph sub-c ["加密会话秘钥"] c1 c2 c3 c4 end b3 end subgraph sub-e ["混合密码系统的密文"] e1 e2 end a -->|明文| b1 -->|密文| b2 --> b3 c1 --> c2 -->|明文| c3 -->|密文| c4 --> b3 c2 -->|秘钥| b1 d -->|秘钥| c3 b3 --> sub-e style sub-c stroke-dasharray: 5 5 style sub-b stroke-dasharray: 5 5 style sub-bc stroke-dasharray: 5 5

混合密码系统运用了伪随机数生成器对称密码公钥密码这三种技术,通过这三种技术的结合,创造出了一种兼具对称密码和公钥密码优点的密码方式。

会话秘钥(session key)是指为本次通信而生成的临时秘钥,一般由伪随机数生成器生成。在混合加密系统中,会话秘钥具有双重性,它即是对称密码的秘钥,同时也是公钥密码的明文。

混合密码系统的解密,解密时的流程与加密刚好相反,第一步是分离“用公钥密码加密的会话秘钥”和“用对称密码加密的消息”,会话秘钥由接收者的私钥解密,解密后得到会话秘钥用来解密消息的密文。

flowchart TB a(["分离"]) a1["用对称密码加密的消息"] a2(["用对称密码解密消息"]) b1["用公钥密码加密的会话秘钥"] b2(["用公钥密码解密会话秘钥"]) b3["会话秘钥"] c["接收者的私钥"] d["消息"] e1["用公钥密码加密的会话秘钥"] e2["用对称密码加密的消息"] subgraph sub-ab ["混合密码系统的解密"] subgraph sub-a ["解密消息"] a1 -->|密文| a2 end subgraph sub-b ["解密会话秘钥"] b1 -->|密文| b2 -->|明文| b3 end a --> a1 a --> b1 b3 -->|秘钥| a2 end subgraph sub-e ["混合密码系统的密文"] e1 e2 end sub-e --> a c -->|秘钥| b2 a2 -->|明文| d style sub-ab stroke-dasharray: 5 5 style sub-a stroke-dasharray: 5 5 style sub-b stroke-dasharray: 5 5

结合了对称密码与公钥密码,混合密码的用途更广,比如通信使用的 SSL/TLS,以及著名的密码软件 PGP 都使用了混合密码系统。

参考资料

本文作者:杨奇的博客
版权声明:本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可,非商业转载及引用请注明出处(作者、原文链接),商业转载请联系作者获得授权。
杨奇的博客 微信公众号
微信公众号
杨奇的博客
评论