加密的艺术

加密算法最早诞生在什么时候?计算机出现之后吗?不,早在公元前 7 世纪,古希腊人就已经在使用加密算法了。他们使用一根叫 scytale 的棍子来传递加密信息,加密时先绕棍子卷一张纸条,把信息沿棒水平方向写,写一个字旋转一下,直到写完。解下来后,纸条上的文字消息杂乱无章,这就是密文。将它绕在另一个同等尺寸的棒子上后,就能看到原始的消息。如果不知道棍子的粗细,就无法解密里面的内容。

加密方式发展到今天,相比 scytale 的简单原理已经有了无法想象的巨大发展,我们现在基于更复杂的数学过程,即更为复杂的算法来进行加密。许多使用现代手段创建的成熟密码系统基本被认为是不可破解的。一个不可被破解的加密方式到底有多复杂?下面我们就来领略一下。

什么是加密?

我们通常所说的加密是指使用密钥将纯文本转换为难以理解的序列的方法,通常由两个基本部分构成:算法和密钥。

算法是将普通的文本(或者可以理解的信息)与一串数字(密钥)的结合,产生不可理解的密文的步骤,密钥是用来对数据进行编码和解码的一种算法。加密可以描述为一种方法,通过该方法,明文和密钥通过密码算法,产生秘密文本。

在期望的情况下,加密文本的内容只有拥有对应密钥的用户才能访问。除了文本消息,现代加密还可以应用于其他电子传输信息,例如语音消息、图像文件或程序代码等。

加密方式分类

在现代,我们主要用到对称加密(私人密钥加密)和非对称加密(公开密钥加密)两种加密方式。

对称加密方法

对称加密起源于凯撒密码等古老的加密方法。其主要原理是文件加密和解密使用相同的密钥。如果两个通信方想要交换加密数据,则发送方和接收方都需要拥有相同密钥的副本,同时还需要找到一种秘密传输共享密钥的方法。为了保护加密信息不被第三方访问,密钥是保密的,密钥的长度也决定了该加密算法的安全性。

对称加密算法使用起来简单快捷,密钥较短,且破译困难。众所周知的对称加密方法包括比较典型的数据加密标准(DES)及其高级加密标准(AES)。

数据加密标准(DES)

DES 是一种对称加密方法,由 IBM 在 1970 年代开发,并于 1977 年由美国国家标准与技术研究院(NIST)标准化。按照当时的标准,DES 是一种安全的计算机辅助加密方法,是现代密码学的基础。密钥长 64 位,但实际上只有 56 位参与运算(第 8、16、24、32、40、48、56、64 位是校验位,使得每个密钥都有奇数个 1),在如今基本上已经过时了。当今的技术,使用蛮力攻击可以在短短几个小时内破解出 DES 密钥。

该算法由排列和替换组成,整个过程需要 16 轮,其原理结构图如下:

首先是初始置换 ,64 位的块被分成 32 位的块;创建了左半块 L0 和右半块 R0。然后经过 16 轮相同的操作(此处为函数 f )将数据与密钥组合。16 轮过后,左右两块重新组合,经过最后的置换,得到密文。DES 加密密文的解密遵循相同的方案,但顺序相反。

DES 的主要缺点是 56 位的密钥长度相对较小,无法承受当今计算能力可用的蛮力攻击。DES 的一种变体是 Triple-DES ( 3DES ) ,其中加密方法在三个连续轮次中执行。但是 3DES 的有效密钥长度仍然只有 112 位,仍低于当今 128 位的最低标准。因此,DES 已在很大程度上被取代。AES(Advanced Encryption Standard) 算法接替了 DES,它也是一种对称加密方法。

高级加密标准(AES)

到了 90 年代,很明显最常用的加密标准 DES 已经落伍了,需要一个新的加密标准来替代。于是,AES 诞生了,由于其具有更高的安全性、灵活性,它也是美国联邦政府采用的一种区块加密标准。

AES 也是将加密后的明文分成块,所以与 DES 一样是基于块加密的。该标准支持 128、192 和 256 位密钥。但 AES 使用的不是 64 位的块,而是使用大很多的 128 位块,这些块在连续几轮中使用代换-置换网络(Substitution-Permutation Network,SPN)进行加密。加密过程大致分为四个步骤:

1、KeyExpansion 密钥扩展: AES 和 DES 一样,对每个加密循环使用一个新的轮密钥。在这个过程中,输出密钥的长度也被扩展,生成映射所需数量的 128 位轮密钥。每个轮密钥都基于扩展输出密钥的一部分。所需的轮密钥数等于轮数(R),包括关键轮,加上初始轮的轮密钥(密钥数 = R + 1)。

2、Initial round 初始轮: 在初始轮中,将 128 位的输入块转移到二维表(Array)中,并使用按位异或 XOR(AddRoundKey)链接到第一轮密钥。该表由四行四列组成。每个单元包含要加密的块的一个字节(8 位)。

3、加密轮数: 加密轮数取决于使用的密钥长度:AES128 为 10 轮,AES192 为 12 轮,AES256 为 14 轮。每轮加密使用以下操作:

  • **SubBytes(字节替代) : **一个非线性替换步骤,其中根据查找表将每个字节替换为另一个字节。
  • ShiftRows(行移位): 一个转置步骤,其中状态的最后三行循环移位一定数量的步骤。
  • MixColumns(列混淆): 一种线性混合操作,它对状态的列进行操作,将每列中的四个字节组合在一起。
  • AddRoundKey(轮密钥加): 在每轮加密结束时,发生另一个 AddRoundKey。就像初始轮一样,基于数据块与当前轮次密钥的异或链接。

4. 密钥轮: 密钥轮是最后的加密轮。与前几轮不同的是,它不包括 MixColumns 转换,因此只包括 SubBytes、ShiftRows 和 AddRoundKey 操作。最后一轮的结果得到密文。

由于其本身的算法,AES 已通过了高水平的安全性认证。对于至少 128 位的密钥长度,蛮力攻击是很低效的。除此之外,AES 还用作 WPA2、SSH 和 IPSec 的加密标准。该算法还用于加密压缩文件存档,例如 7-Zip 或 RAR。

以上两种对称加密方法都是依托于对称加密的算法,而对称加密算法则分以下两大类:

  • 流密码:也叫序列密码,每次加密都通过密钥生成一个密钥流,解密也是使用同一个密钥流,明文与同样长度的密钥流进行异或运算得到密文,密文与同样的密钥流进行异或运算得到明文。
  • 块密码:也叫分组密码,它把加密和解密序列分成了一个个分组,最后把每一块序列合并到一起,形成明文或者密文。

非对称加密方法

相对于对称加密加密通信的双方需使用相同的密钥来说,非对称加密的通信双方会为每个页面都生成一个密钥对。通信中的每个参与者都有两把钥匙可供使用:一把公钥和一把私匙。为了能够加密信息,每一方都必须事先声明他们的公钥,这被称为公钥算法。这就是非对称密码系统的优势:与对称加密方法相反,密钥永远不会离开其所有者的视线。

下面我们通过一个简单例子来了解非对称加密。。假设用户 A 想向用户 B 发送一条加密消息,为此 A 需要 B 的公钥,而 B 的公钥允许 A 加密只有 B 的私钥才能解密的消息。这样除了 B,就在没有其他人没有人能够阅读该消息,包括 A 也无法解密。

这么做的优点是任何人都可以使用用户 B 的公钥加密消息,然后只能 B 的密钥解密。由于仅交换公钥,因此无需创建防篡改的安全通道,因为能解密的只有 B。

非对称加密最通用的加密算法是 Rivest、Shamir、Adleman (RSA)和 ECC。

Rivest、Shamir、Adleman (RSA)

1977 年,数学家 Rivest、Shamir 和 Adleman 提出了一种非对称加密算法,并以发明人的名字命名 —— RSA。RSA 是目前普遍认为最安全、最优秀的公钥方法之一。

RSA 使用一种基于大素数相乘的算法。如果将质数 14,629 和 30,491 相乘,可以得到结果为 446,052,839。这个数只有四个可能的除数:其中两个是 1 和它本身,另外两个是相乘前的原始素数。如果将前两个除数排除(因为每个数字都可以被 1 和它本身整除),那么将得到 14,629 和 30,491 的初始值。

以上就是 RSA 密钥生成的基础。公钥和私钥都代表两对数字:

N 即两个随机选择的非常大素数 p 和 q 的乘积 N = pxq,以及计算 N 的欧拉函数 φ(N) = (p-1)(q-1)。

要生成公钥,则需要 e,e 是一个根据一些限制(条件是 1< e < φ(N),且 e 与 φ(N) 互质)随机选择的数字。

要生成私钥,则需要计算 e 对于 φ(N) 的模反元素 d。所谓“模反元素”就是指有一个整数 d,可以使得 ed 被 φ(N) 除的余数为 1。满足 (ed) modφ(N) = 1 ,即 ed = kφ(N) +1,k≥1 是一个任意的整数;所以,若知道 e 和 φ(N) ,则很容易计算出 d。

然而只根据 N 和 e(注意:不是 p 和 q)要计算出 d 是不可能的。因此,任何人都可对明文进行加密,但是只有授权用户(知道 d)才可对密文解密。

RSA 算法的保密强度随其密钥的长度增加而增强。但是,密钥越长,其加解密所耗用的时间也越长。因此,要根据所保护信息的敏感程度与攻击者破解所要花费的代价值不值得以及系统所要求的反应时间来综合考虑。

目前互联网中最常用的 SSL/TLS 协议就是基于 RSA 算法。如果想要使用特定公钥加密的信息只能使用附属于该公匙的私钥进行解密。经客户端验证公钥可以与私钥进行匹配,才会建立安全连接。

ECC

在上图中我们还可以看到非对称加密的另一种算法 ECC,即椭圆加密算法。其数学基础是利用椭圆曲线上的有理点构成 Abel 加法群上椭圆离散对数的计算困难性。ECC 的主要优势是在某些情况下比其他的方法(比如 RSA)使用更小的密钥,提供相当或更高等级的安全。

回到非对称加密本身。这种加密算法除去“无需创建防篡改的安全通道”这一有点外,也有一个不可忽视的缺点:无法确认通信伙伴的身份。也就是说在非对称加密中,B 不能确定加密的消息确实来自 A,理论上第三个用户 C 可以使用 B 的公钥来加密并传递消息。此外,A 也不能确定公钥是否真的属于 B,公钥可能是由 C 创建并传达给 A 的,这样可以拦截 A 发给 B 的消息。

因此使用非对称加密,需要一种机制以便用户可以测试其通信伙伴的身份验证。

目前我们使用数字证书和签名来解决这个问题:

  • 数字证书:为了确保非对称加密方法的安全,通信伙伴可以通过官方认证机构确认其公钥的真实性。例如,通过 HTTPS 的 TLS/SSL 加密数据传输。
  • 数字签名:虽然数字证书可用于验证公钥,但数字签名可用于识别加密消息的发送者。私钥用于生成签名,然后接收方使用发送方的公钥验证该签名。

以上就是我们目前主要用到的加密方式啦,但是加密方式不仅仅如此,随着互联网的不断发展,肯定会越来越复杂,尽管它们涉及了很多数学知识,了解起来非常枯燥,但是正是这些枯燥的数学让我们的信息越来越安全。

原文:https://segmentfault.com/a/1190000040729633