1. 使用OpenSSL 命令行
在 Ubuntu Linux Distribution (发行版)中, OpenSSL 通常可用。当然,如果不可用的话,也可以使用下以下命令安装 OpenSSL:
$ sudo apt-get install openssl
安装完后可以使用以下命令检查 OpenSSL 版本:
$ openssl version
其输出将如下所示:
OpenSSL 1.0.2 1 Mar 2016
2. 密码学简介
密码学(Cryptography) 是在面对敌手时确保信息安全的科学。这里有一个前提设想是,敌手(或者说对手) 可以使用无限的资源。密码(Ciphers) 是用于加密或解密数据的算法,如果对手拦截到该数据,但是无法解密(Decryption),那么该数据就是无意义的,而解密需要密钥。
密码学主要用于提供保密服务,它本身不能被认为是一个完整的解决方案,而是在更广泛的安全系统中解决安全问题的关键组成部分。例如,保护区块链生态系统需要许多不同的密码学原语,如哈希函数、对称密钥密码学、数字签名和公共密钥密码学等。
除保密服务外,加密技术还提供其它安全服务,如完整性(Integrity) 、不可否认性(Non-Repudiation) 和 身份验证(Authentication) --包括实体身份验证和数据源身份验证。另外,它还提供可追责性(Accountability) ,这是许多安全系统的要求。可追责性可以解决电子现金双重支付的问题。
3. 密码学的数学基础
3.1 集合
集合(Set,记为 S) 就是将不同的对象放在一起,例如 S= {1,2,3,4,5}。
3.2 群
群(Group,记为 G)是定义了一个二元运算的交换集合,该运算组合了集合的两个元素。群运算是分闭的,并全对于已定义的标识元素来说是可结合的。另外,集合中的每个元素都有一个逆(Inverse)。
具体来说,G 中的每个序偶(a,b)通过运算生成 G 中的元素(a,b),并满足以下公理。
封闭性:封闭(Closure)意味着如果元素 a 和 b 在集合中,则对元素执行运算后得到的元素也将在集合中,即如果 a 和 b 都属于 G,则 a.b 也属于 G。
结合律:结合(Associative) 意味着元素的分组不分影响运算的结果。例如,对于 G 中的任意元素a,b,c,都有:
(a.b).c=a.(b.c)
单位元:G 中存在一个元素 e,对于任意元素 都有:
a.e=e.a=a
逆元:对于 G 中的任意元素 a,都存在一个元素 a' G,使得下式成立:
a.a' = a'.a =e
3.3 域
域(Field,记为 F) 是一个包含加法和乘法群的集合。更确切地说,集合中的所有元素都构成一个加法和乘法群。它满足加法运算和乘法运算的特定公理(即上面介绍的封闭性、结合律、单位元和逆元)。
4. 密码学模型
下图显示了通用密码学模型
在上图中,P 表示纯文本( Plaintext), E 表示加密(Encryption),C 表示密文(Ciphertext),D 表示解密(Decryption)。基于该模型,对实体、发送者、接收者、对手、密钥和信道等概念的解释如下:
实体:发送、接收数据或执行运算的个人或系统。
发送者:发出数据的实体
接收者:接收数据的实体
对手:试图绕开或破解安全服务的实体。
密钥:用于加密或解密其他数据的数据。
信道:为实体之间的沟通提供一种媒介。
5. 现代信息安全的基本要求
现代信息安全的基本要求包括 5 项,即保密性、完整性、可认证性、不可否认性和可追责性。
5.1 保密性
保密性(Confidentiality) 是指应确保信息仅对授权实体可用,防止将信息泄露给未经授权的人,这涉及加密和解密技术的应用。
5.2 完整性
完整性(Integrity) 是指应确保仅授权实体能够修改信息,防止信息出现未经授权的篡改,这涉及消息认证码和数字签名等技术的应用。
5.3 可认证性
认证(Authentication) 可确保有关实体的身体或消息的有效性,保证信息来自正确的发送者,这涉及消息认证和数字签名等技术的应用。
6. 密码学原语
密码学原语(Cryptographic Primitives) 是安全协议或系统的基本构建块。
所谓安全协议(Security Protocol) 就是指要采取的一组步骤,它通过利用适当的安全机制来实现所需的安全目标。目前正在使用的安全协议有多种类型,如认证协议、不可否认协议和密钥管理协议等。
密码学原语的分类如下图所示:
7. 对称密码学介绍
7.1 流密码
7.2 分组密码
8. 分组密密码加密模式
分组密码的加密工作模式允许使用同一个分组密码对多于一块的数据进行加密,并保证其安全性。
在分组加密模式下,根据使用的密码类型,将明文分为固定长度的块。然后,将加密函数应用于每个块。
8.1 电子密码本
电子密码本(Electronic Code Book,ECB)是一种基本的操作模式。在该模式中,通过将加密算法一对一地应用于每个明文块来生成加密数据。这是最直接的加密模式,但是由于它不太安全并且可以泄露信息,因此在实践中已不建议使用。
分组密码的电子密码本模式如下图所示:
在上图中可以看到,我们提供了明文 P 作为分组密码加密函数的输入,再加上密钥 KEY,共同产生密文 C 作为输出。
8.2 密码块链接
在密码块链接(Cipher Block Chaining,CBC)模式下,每个明文块都与先前加密的块进行 XOR 运算。CBC 模式使用初始化向量(Initialization Vector,IV) 加密第一个块。建议随机选择 IV,如下图所示:
8.3 计数器模式
计数器 (Counter,CTR) 模式有效地使用了分组密码作为流密码。在这种情况下,将提供一个唯一的随机数,该随机数与计数器值连接以生成密钥流,如下图所示:
9. 密钥流生成模式
在密钥流生成模式(Keystream Generation Mode) 下,加密函数可生成一个密钥流,然后将其与纯文本流进行 XOR 运算以实现加密。
9.1 消息认证模式
在消息认证模式(Message Authentication Mode) 下,消息认证代码(Message Authentication Code,MAC) 来自加密函数。MAC 是提供完整性服务的加密校验和。使用分组密码生成 MAC 的最常见方法是 CBC-MAC。在 CBC-MAC 中,链的最后一块的一部分用作 MAC。例如,MAC 可用于确认消息是否由未授权实体修改,这可以通过 MAC 函数使用密钥对消息进行加密来实现。具体方法是:接收者在接收到消息后,使用密钥再次对接收到的消息进行加密,并将其与从发送者接收到的 MAC 进行比较,如果它们都匹配,则可知消息未被授权的用户修改,这就是 MAC 能提供完整性服务的原理;如果它们都不匹配,则表示消息在传输过程中未授权实体修改过。
9.2 加密哈希模式
哈希函数主要用于将消息压缩为固定长度的摘要。在密码哈希模式(Cryptographic Hash Mode)下,分组密码用作压缩函数以生成纯文本哈希。
10. 数据加密标准
当前市场主导的分组密码是高级加密标准(AES),我们将介绍 AES 的设计和机制。但是,在讨论 AES 之前,有必要先介绍一下数据加密标准(Data Encryption Standard,DES)的历史,因为正是 DES 促进了新 AES 标准的开发。
数据加密标准由美国国家标准技术研究院(National Institute of Standards and Technology,NIST)引入,作为加密的标准算法,在 20 世纪 80 年代和 90 年代被广泛使用。但是,由于技术和密码学研究的进步,它并不能被证明对暴力破解攻击(Brute Force Attack) 具有很强的抵抗力。例如,1998 年 7 月,电子前沿基金会(Electronic Frontier Foundation,EFF)就使用 EFF DES Cracker (或 Deep Crack) 的专用机器破坏了 DES。
DES 仅使用 56 位密钥,这引起了人们的一些担忧。该问题通过引入三重 DES(Triple DES,3DES) 获得了解决,3DES提出了使用 168 位密钥,方法是将 DES 算法执行 3 次以获得 3 个 56 位密钥,这样暴力破解攻击就几乎不可能成功。但是,3DES 轮的数量众多而计算速度慢,分组长度为 64 位而效率低下,从而难以用软件有效实现。
以下是有关如何使用 AES 进行加密和解密的 OpenSSL 示例:
openssl enc -aes-256-cbc -in message.txt -out message.bin
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
OpenSSL 工具可用于下图显示的所有密码: