- 一般来说,使用OpenSSL对称加密算法有两种方式,一种是使用API函数的方式,一种是使用OpenSSL提供的对称加密算法指令方式。本书将介绍对称加密算法的指令方式
- OpenSSL的对称加密算法指令主要用来对数据进行加密和解密处理,输入输出的方式主要是文件,当然,也可以是默认的标准输入输出设备。
- OpenSSL基本上为所有其支持的对称加密算法都提供了指令方式的应用,这些应用指令的名字基本上都是以对称加密算法本身的名字加上位数、加密模式或其他属性组合而成。比如DES算法的CBC模式,其对应的指令就是des-cbc。
- 要查找最新版本的OpenSSL支持哪些对称加密算法指令,只要在OpenSSL应用程序提示符下输入“-help”,就可以看到在输出信息最后部分(Ciphercommands)有很多我们熟悉的算法名称,这些就是OpenSSL支持的对称加密算法指令。OpenSSL还将所有的对称加密算法指令集成在一个指令程序中,那就是enc指令。
- enc指令是OpenSSL中对称加密算法指令的集大成者,用户可以在它的一个参数中指定使用哪种加密算法和模式,从而统一了对称加密算法指令的入口。enc指令的格式跟单独一个对称加密算法指令的格式是基本一样的,但是增加了一个算法类型的选择参数选项。
- 比如,下面两种形式的指令是等价的:
- OpenSSL的对称加密算法指令还可以增加BASE64编解码的功能,也就是说,可以在数据加密后将数据进行BASE64编码后输出保存,然后在解密的时候先将数据进行BASE64解码后再进行解密。这样,对于加密后数据的保存和处理就更加方便,因为BASE64编码将加密后的很多不可见字符都编码成可见的字符了。当然,如果你愿意,也可以单独使用BASE64编码的功能,OpenSSL为此也提供了专门的指令,其使用形式跟其他对称加密算法指令是一致的。
- OpenSSL的对称加密算法指令还可以作为使用第三方加密库(通常是硬件加密设备)的应用接口,也就是说,它可以使用第三方的加密库作为完成加密操作的真正设备。这是通过OpenSSL的Engine机制实现的。当然,使用第三方加密库的前提是你已经安装了第三方的加密设备并成功通过Engine机制加载到了OpenSSL中。
- 不过,对OpenSSL的所有指令,包括对称加密算法指令,你不能期望过高,这些指令虽然功能强大,但是并没有支持所有可能的加密算法和模式,只是提供了固定的部分功能。比如对称加密算法指令就不支持76位的RC2加解密或者84位的RC4加解密等功能。如果你想使用这些灵活的加密模式和算法,那么就需要对OpenSSL进行进一步的深入研究,即使用OpenSSL的API。
- 对于大部分块加密对称加密算法,OpenSSL都提供了CBC、CFB、ECB和OFB四种加密模式。需要注意的是,对于使用两个密钥和三个密钥EDE方式的三重DES算法,其ECB模式的指令名称并没有明确标出,很容易跟CBC模式混同,因为块加密算法使用最多的是CBC方式。
- 如果要单独使用BASE64编码而不进行数据的加密和解密,那么只要简单地忽略算法类型参数并加上“a”或者“base64”选项就可以了,当然,你如果不愿意忽略算法类型,也可以输入“-none”选项。下面三种形式是等价的,仅使用BASE64编码的指令:
- 从表还可以看出,对于绝大部分对称加密算法来说,都有enc参数式的指令和单独的指令两种方式,它们都是等价的,至于选择哪一种,主要取决于用户本身的偏好。不过,enc指令可能会更快地支持新的对称加密算法,而单独的对称加密算法指令就不一定能得到及时的更新。这跟enc实现的机制是有关系的,因为enc使用的是OpenSSL内部定义的对称加密算法简称作为类型输入参数,只要是OpenSSL定义的对称加密算法模式,enc程序都能通过接口API自动支持,不需要因为增加了新的对称加密算法而进行enc应用程序的修改。
-
相对于其他指令来说,对称加密算法的指令参数比较少,使用起来也相对容易。对称 加密算法指令的参数形式如下:
- iphername是在表7-1中第二列和第三列中出现的参数值之一。如果你选择第一种指令形式,那么就需要选择表7-1第二列的参数形式;如果你选择的是后一种独立对称加密算法指令方式,那就应该使用表7-1第三列的参数形式。对于第一种对称加密算法指令使用方式来说,如果你不需要进行任何加密或解密处理,那么可以输入none选项替代ciphername,当然,你也可以简单忽略ciphername选项,其效果是一样的。
(2)in和out选项
- 这两个选项分别用于指令输入和输出文件,对于加密操作来说,输入的应该是明文文件,也就是要加密的文件,输出的是密文文件,即经过加密的文件;对于解密操作来说,输入的是经过加密的文件,而输出的是恢复的明文文件。输入和输出文件名本身是没有任何限制的,只要符合习惯的文件名形式即可。需要注意的是,一般不要试图编辑和改变加密后的文件,那样做可能引起文件的部分甚至全部内容不能进行正确的解密!默认的输入和输出文件是标准输入和输出设备,对于Windows来说,就是指令行界面。需要注意的是,如果提供的输出文件名是已经存在的文件,那么程序会首先将该文件内容清空!
(3)口令输入选项pass,k和kfile
- 如果你不愿意输入繁杂的用来加密数据的密钥和初始向量,那么可以使用从口令中提取密钥和初始向量的方法。OpenSSL对称加密算法指令中输入口令的目的正在于此,事实上,OpenSSL中几乎所有输入的口令都是用作提取密钥的材料,而不是直接用作加密的密钥。pass选项提供了最灵活的口令输入方式,输入的源可以是标准输入设备、指令行直接输入、提示输入、文件、环境变量和文件描述符,具体的格式介绍读者可以参考7-4节的应用实例。k选项和kfile选项都是为了兼容以前的版本而保留的,它们的功能目前都可以使用pass选项来实现。k选项后面输入的参数是口令字符。kfile选项后面输入的参数是作为口令的文件名,当然,必要的时候应该也提供路径。OpenSSL的口令文件以第一行作为输入口令。
(4)e和d选项
-
e和d选项分别表示执行加密操作(encryption)和解密操作(decryption),两个参数是互斥的,不能同时出现,但是可以同时不出现,这时候就执行默认的操作,即执行加密操作。这两个选项都不带参数。
(5)base64,a和A选项
-
选项a和base64的作用是相同的,就是将文件进行BASE64的编解码操作。对于加密操作来说,就在数据加密之后进行BASE64编码;对于解密操作来说,就在解密操作之前执行BASE64解码。A选项跟a或者base64选项一起使用才能生效,如果出示了A选项,则程序将努力将所有加密数据作为一行进行BASE64编码,而不是按照文件原有的换行格式进行BASE64编码。需要注意的是,在文件比较大的时候,A选项经常会导致指令执行失败。上述三个选项都不带参数。
(6)K和IV选项
-
如果你使用这两个选项,意味着你不相信OpenSSL从口令提取加密密钥和初始向量的方法,而使用自己直接提供的加密密钥和初始向量,那么这时候你就不再需要使用口令选项。K选项后面的参数是加密密钥,是以十六进制的方式表示,长度不能超过64个字符。IV选项只有在分组加密算法的某些模式才需要,其参数也是以十六进制的方式表示,长度不能超过32个字符。如果输入的参数不是十六进制的字符,那么程序就会报错。上述选项参数输入的长度如果不够,就在后面补零替代。
(7)salt,nosalt和S选项
-
salt选项指明在从口令提取密钥的过程中使用盐值,这可以增强被加密数据的安全性,事实上,即便不出示此选项,默认指令也会使该选项生效。nosalt选项跟salt选项相反,告诉指令在密钥提取的过程中不使用盐值,一般来说,如果不是特别地为了跟OpenSSL一些老版本兼容,不要做这样降低安全性的事情。S选项后面的输入参数是十六进制编码的真正使用的盐值,其长度不能超过16个字符。所有这些选项只有跟口令输入选项一起使用才会生效,如果你使用K和IV选项方式输入加入密钥,那么这些选项将不会产生任何作用。
(8)engine选项
- 该选项的参数是OpenSSL支持的Engine的名称,一般是以字符串表示,比如“cswift”,“nuron”和“pkcs11”等。如果你不知道目前你的OpenSSL支持的Engine特征字符串,可以输入下列指令,其中有效的Engine都会提示出来:
- OpenSSL>engine -t
- 如果你使用了有效的Engine,那么你所执行的加密操作实际上都是在第三方加密设备中执行,而不再是使用OpenSSL密码库的软件算法。
(9)p和P选项
- p选项打印出对称加密算法真正使用的加密密钥和初始向量,输出的格式是十六进制的形式。如果出示了P选项,则程序在打印出加密密钥和初始向量后就立刻退出,而不执行真正的加密或解密操作。
(10)nopad,bufsize和debug选项
- 这几个选项之间其实并没有联系,这里之所以放在一起,只是为了节省篇幅。nopad选项指定不使用默认的PKCS#5标准的补丁方式,如果这样做,那么就要确保在块加密算法中输入的数据是加密块长度的整数倍,比如使用DES算法,就要保证输入的数据是8字节的整数倍。
- bufsize选项的参数指定了读写文件的I/O缓存,指定的数字以字节为单位,也可以在数字后面加“k”表示是以1024字节为单位。比如,下面的格式都是可以被接受的:
- -bufsize 256 或者 -bufsize 8k
- 如果你指定的缓存小于80字节,指令程序会自动将它增加为80字节,这是进行BASE64一行编码所需要的最小长度。
- 使用debug选项后,OpenSSL的对称加密算法指令会将整个执行过程中I/O操作相关的BIO列出来。这主要是为了调试目的而使用,对于一般用户来说,该选项很少使用。
例子
- 本节将给出对称加密算法指令的一些具体实例,在下面的例子中,“pln.txt”表示明文文件,“enc.txt”表示经过加密的密文文件,而“rcv.txt”表示恢复的明文文件。
- 下面指令将文件pln.txt的内容复制到文件enc.txt中:
- 使用的时候 需要指定文件的绝对路径
- OpenSSL对称加密算法加密数据的时候需要使用密钥,对于块加密算法的某些模式,还需要初始向量,既可以直接输入加密密钥和初始向量,也可以通过口令来提取加密密钥和初始向量。
- 就口令输入来说,也有多种不同的方式,本节将给出多种输入口令和密钥的例子。
- 下面是DES算法CBC模式指令直接使用加密密钥和初始向量的例子: