一、 基础知识
Openssl是一个开源的用以实现SSL协议的产品,它主要包括了三个部分:密码算法库、应用程序、SSL协议库。Openssl实现了SSL协议所需要的大多数算法。
OpenSSL一共提供了8种对称加密算法,其中7种是分组加密算法,仅有的一种流加密算法是RC4。这7种分组加密算法分别是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支持电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常用的分组密码加密模式。其中,AES使用的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是128位,其它算法使用的则是64位。事实上,DES算法里面不仅仅是常用的DES算法,还支持三个密钥和两个密钥3DES算法。
下面是使用Openssl进行文件的对称加密操作。
(一)Openssl支持的加密算法有:
-aes-128-cbc -aes-128-cfb -aes-128-cfb1 -aes-128-cfb8 -aes-128-ecb -aes-128-ofb -aes-192-cbc -aes-192-cfb -aes-192-cfb1 -aes-192-cfb8 -aes-192-ecb -aes-192-ofb -aes-256-cbc -aes-256-cfb -aes-256-cfb1 -aes-256-cfb8 -aes-256-ecb -aes-256-ofb -aes128 -aes192 -aes256 -bf -bf-cbc -bf-cfb -bf-ecb -bf-ofb -blowfish -cast -cast-cbc -cast5-cbc -cast5-cfb -cast5-ecb -cast5-ofb -des -des-cbc -des-cfb -des-cfb1 -des-cfb8 -des-ecb -des-ede -des-ede-cbc -des-ede-cfb -des-ede-ofb -des-ede3 -des-ede3-cbc -des-ede3-cfb -des-ede3-ofb -des-ofb -des3 -desx -desx-cbc -rc2 -rc2-40-cbc -rc2-64-cbc -rc2-cbc -rc2-cfb -rc2-ecb -rc2-ofb -rc4 -rc4-40
(二)Openssl加密指令语法
openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e][-d] [-a] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-p][-P] [-bufsize number] [-nopad] [-debug]
说明:
-chipername选项:加密算法,Openssl支持的算法在上面已经列出了,你只需选择其中一种算法即可实现文件加密功能。
-in选项:输入文件,对于加密来说,输入的应该是明文文件;对于解密来说,输入的应该是加密的文件。该选项后面直接跟文件名。
-out选项:输出文件,对于加密来说,输出的应该是加密后的文件名;对于解密来说,输出的应该是明文文件名。
-pass选项:选择输入口令的方式,输入源可以是标准输入设备,命令行输入,文件、变量等。
-e选项:实现加密功能(不使用-d选项的话默认是加密选项)。
-d选项:实现解密功能。
-a和-A选项:对文件进行BASE64编解码操作。
-K选项:手动输入加密密钥(不使用该选项,Openssl会使用口令自动提取加密密钥)。
-IV选项:输入初始变量(不使用该选项,Openssl会使用口令自动提取初始变量)。
-salt选项:是否使用盐值,默认是使用的。
-p选项:打印出加密算法使用的加密密钥。
(三)案例
openssl的对称加密算法指令主要用来对数据进行加密和解密处理,openssl基本上为所有其支持的对称加密算法都提供了指令的方式的应用,这些应用指令的名字基本上都是以对称加密算法本身的名字加上位数、加密模式或者其他属性组合而成。例如DES算法的CBC模式,其对应的指令就是des-cbc。
原来openssl提供了两种方式调用对称加密算法:
一种就是直接调用对称加密指令,例如:
openssl des-cbc -in plain.txt -out encrypt.txt -pass pass:12345678
另外一种是使用enc的方式,即用对称加密指令作为enc指令的参数,例如:.
openssl enc -des-cbc -in plain.txt -out encrypt.txt -pass pass:12345678
上述两条指令完成的功能是一样的,而且其参数也是一样。原来enc是作用是什么呢?简单来说,为了省事……。
openssl提供了N多的对称加密算法指令,enc就是把这些N多的对称的加密算法指令统一集成到enc指令中。当用户使用时,只需使用enc,指定加密算法,就是完成单独的加密算法指令完成的操作。而且,enc中可以指定的对称加密算法指令可能并没有以单独指令的形式存在。所有笔者建议使用enc这种方式。
当然,虽然openssl为我们提供的对称加密算法指令虽然功能强大,但并不完整,例如对称加密算法不支持76位的RC2加解密或者84位的RC4加解密灯功能。如果想灵活的使用这些加密算法和模式,就需要学习openssl提供的API
利用OpenSSL作对称加密需要使用其子命令enc,其用法为:
openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md] [-p] [-P] [-bufsize number] [-nopad] [-debug] [-none] [-engine id]
其中常用的选项为:
-in filename —— 输入文件
-out filename ——输出文件,省略则为标准输出
-pass arg —— 口令设置,用于没有提供密钥时,采用摘要算法从口令中生成一个密钥,如果加密时使用了口令,则解密也要使用口令,arg如下所示:
-pass pass:"123" #密码是123
-pass pass:123 #密码是123
-pass evn:VAR #密码从环境变量VAR中去
-pass file:p.txt #密码从文件p.txt第一行取,不包括换行符,注意DOS格式的^M及回车符。
-pass fd:3 #密码从文件描述符3中读
-pass stdin #标准输入
-e —— 加密,二选一
-d —— 解密,二选一
-a/-base64 —— 加密时设置结果以base64编码,,解密时设置输入为base64
-A ——加密时设置结果以base64编码成一行,解密时设置输入为一行base6
-K key —— 加密秘钥,16进制
-iv IV ——初始向量,16进制
-S salt ——指定16进制盐值
-salt ——带有随机盐值 二选一
-z ——是否压缩,需要编译时选择了zlib库
-md digstname —— 摘要算法,当没有提供密钥时候,用于从口令中生成一个密钥,默认md5
-p ——打印出使用的salt、口令以及初始化向量IV。二选一
-P ——打印出使用的salt、口令以及初始化向量IV。不做加解密,二选一
-bufsize number ——缓冲区大小
-nopad ——无填充
-debug ——打印调试信息
-none ——不执行加 解密
-engine id ——引擎
-cihername ——要使用的加密算法,支持的加密算法如下
-aes-128-cbc -aes-128-cbc-hmac-sha1 -aes-128-cbc-hmac-sha256 -aes-128-ccm -aes-128-cfb -aes-128-cfb1 -aes-128-cfb8 -aes-128-ctr -aes-128-ecb -aes-128-gcm -aes-128-ofb -aes-128-xts -aes-192-cbc -aes-192-ccm -aes-192-cfb -aes-192-cfb1 -aes-192-cfb8 -aes-192-ctr -aes-192-ecb -aes-192-gcm -aes-192-ofb -aes-256-cbc -aes-256-cbc-hmac-sha1 -aes-256-cbc-hmac-sha256 -aes-256-ccm -aes-256-cfb -aes-256-cfb1 -aes-256-cfb8 -aes-256-ctr -aes-256-ecb -aes-256-gcm -aes-256-ofb -aes-256-xts -aes128 -aes192 -aes256 -bf -bf-cbc -bf-cfb -bf-ecb -bf-ofb -blowfish -camellia-128-cbc -camellia-128-cfb -camellia-128-cfb1 -camellia-128-cfb8 -camellia-128-ecb -camellia-128-ofb -camellia-192-cbc -camellia-192-cfb -camellia-192-cfb1 -camellia-192-cfb8 -camellia-192-ecb -camellia-192-ofb -camellia-256-cbc -camellia-256-cfb -camellia-256-cfb1 -camellia-256-cfb8 -camellia-256-ecb -camellia-256-ofb -camellia128 -camellia192 -camellia256 -cast -cast-cbc -cast5-cbc -cast5-cfb -cast5-ecb -cast5-ofb -des -des-cbc -des-cfb -des-cfb1 -des-cfb8 -des-ecb -des-ede -des-ede-cbc -des-ede-cfb -des-ede-ofb -des-ede3 -des-ede3-cbc -des-ede3-cfb -des-ede3-cfb1 -des-ede3-cfb8 -des-ede3-ofb -des-ofb -des3 -desx -desx-cbc -id-aes128-CCM -id-aes128-GCM -id-aes128-wrap -id-aes192-CCM -id-aes192-GCM -id-aes192-wrap -id-aes256-CCM -id-aes256-GCM -id-aes256-wrap -id-smime-alg-CMS3DESwrap -rc2 -rc2-40-cbc -rc2-64-cbc -rc2-cbc -rc2-cfb -rc2-ecb -rc2-ofb -rc4 -rc4-40 -rc4-hmac-md5 -seed -seed-cbc -seed-cfb -seed-ecb -seed-ofb
二、 命令详解
1、des3 desx:不同的加密算法(在密码学课程中会做详细的学习)
例:对文件file.tar.gz进行加密,密码为123456
openssl des3 -salt -k 123456 -in file.tar.gz -out file.tar.gz.des3
对file.tar.gz.des3 解密
openssl enc -des3 -d -in file.tar.gz.des3 -out file.tar.gz
2、rc2:rc2是一种加密算法
rc2-40-cbc:cbc是支持的加密分组链接模式, 40为位数。
rc2-64-cbc:cbc是支持的加密分组链接模式, 64为位数。
rc2-cbc:cbc是支持的加密分组链接模式。
rc2-cfb:cfb是加密反馈模式。
rc2-ecb:ecb是电子密码本模式。
rc2-ofb:ofb是输出反馈模式。
rc4:OpenSSL一共提供了8种对称加密算法,其中7种是分组加密算法,仅有的一种流加密算法是RC4。
rc4-40:40为对应的位数。
补充:Rc2加密算法:
(1).introduction
RC2是一种传统的私钥块加密算法,曾经被考虑作为DES算法的替代品。输入和输出块大小都是64bits。而密钥是可变的,从1byte到128bytes,现在常用的是8字节。
Algorithm description
字:16比特位;‘+’:加;‘&’:表示比特敏感的与操作;‘XOR’:表示比特敏感的与或操作;‘~’:表示换位补码;‘^’:表示取幂运算;
(2).key expansion(密钥扩展)
对于字操作,将规定缓存位置K[0],…,K[63];each K[i] is a 16 bit word
对于比特位操作,将规定缓存位置L[0],…,L[127];each L[i] is an eight-bit字节。
转换公式:K[i] = L[2*i] + 256*L[2*i+1].
密钥扩张的目的就是根据提供的密钥将其扩张成要求的密钥长度。
(3).Encryption algorithm(加密算法)
主要是两个操作,mix和mash操作。’x rol k’表示16比特位左转k位,高位补低位。
3.1 Mix up R[i]
3.2 Mixing round
3.3 Mash R[i]
3.4 Mashing round
3.5 Encryption operation
(4).Decryption algorithm(解密算法)
4.1 R-Mix up R[i]
4.2 R-Mixing round
4.3 R-Mash R[i]
4.4 R-Mashing round
4.5 Decryption operation