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) 模式有效地使用了分组密码作为流密码。在这种情况下,将提供一个唯一的随机数,该随机数与计数器值连接以生成密钥流,如下图所示:
以下是有关如何使用 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 工具可用于下图显示的所有密码: