前言

OpenSSL 是使用非常广泛的 SSL 的开源实现。由于其中实现了为 SSL 所用的各种加密算法,因此 OpenSSL 也是被广泛使用的加密函数库。下面介绍一下 OpenSSL 的一些常用命令。

image

对称加密指令enc

OpenSSL的加密算法库提供了丰富的对称加密算法,我们可以通过OpenSSL提供的对称加密算法指令的方式使用,也可以通过调用OpenSSL提供的API的方式使用。

OpenSSL应用指令的名字基本上都是以对称加密算法本身的名字加上位数、加密模式或者其他属性组合而成。例如DES算法的CBC模式,其对应的指令就是des-cbc。可以通过命令 openssl enc help 查看当前版本的openssl支持的对称加密算法。

-in <file> 输入文件路径 -out <file> 输出文件路径 -pass <arg> 传入密码(如:-pass pass:123456 / -pass file:pass.txt)详细请自行查阅资料 -e 加密(默认) -d 解密 -a/-base64 base64编解码 -md 指定密钥生成的摘要算法,用户输入的口令不能直接作为文件加密的密钥,而是经过摘要算法做转换,此参数指定摘要算法,默认md5 -S 为了增强安全性,在把用户密码转换成加密密钥的时候需要使用盐值,默认盐值随机生成。使用该参数,则盐值由用户指定。也可指用-nosalt指定不使用盐值,但降低了安全性,不推荐使用。 -K/-iv 默认文件的加密密钥的Key和IV值是有用户输入的密码经过转化生成的,但也可以由用户自己指定Key/IV值,此时pass参数不起作用 -[pP] 加上p参数会打印文件密钥Key和IV值,加上P参数也会打印文件密钥Key和IV值,但不进行真正的加解密操作 

对文件进行对称加解密

echo openssltest > test.txt openssl enc -des-cbc -in test.txt -out test1.txt -pass pass:123456 -p openssl enc -d -des-cbc -in test1.txt -out test2.txt -pass pass:123456 

image

解密使用错误的算法或者密码均会解密失败。使用-p参数可以打印出salt、key、iv值。

也可以使用密码文件进行加解密。

echo 123456 > pass.txt openssl enc -des-cbc -in test.txt -out test1.txt -pass file:pass.txt -p openssl enc -d -des-cbc -in test1.txt -out test2.txt -pass file:pass.txt 

我们可以将test.txt和text2.txt中的内容进行对比,里面的内容应该是相同的。

对文件进行base64编解码

echo base64test > base64.txt openssl enc -base64 -in base64.txt -out a.txt openssl enc -base64 -d -in a.txt -out b.txt 

查看base64.txt和b.txt中的内容,可知解码后的内容和原文相同。

非对称加密指令(仅介绍RSA算法相关指令)

目前常用的非对称加密算法有RSA, DH和DSA三种,但并非都可以用于密钥交换和数字签名。而是RSA可用于数字签名和密钥交换,DH算法可用于密钥交换,而DSA算法专门用户数字签名。

OpenSSL支持以上三种算法,并为三种算法提供了丰富的指令集,本文主要介绍RSA算法及相关指令,其它算法请读者自行查阅资料。

genrsa指令

genrsa主要用于生成RSA密钥对,其用法如下:

openssl genrsa [args] [numbits] 密钥长度建议1024位及以上

以下是常用参数:

 -des //生成的密钥使用des方式进行加密 -des3 //生成的密钥使用des3方式进行加密 -seed //生成的密钥使用seed方式进行加密 -aes128, -aes192, -aes256 //生成的密钥使用aes方式进行加密 -camellia128, -camellia192, –camellia256 //生成的密钥使用camellia方式进行加密 -out file //生成的密钥文件路径,可从中提取公钥 -passout arg //指定密钥文件的加密口令,可从文件、环境变量、终端等输入 

产生RSA密钥对

我们可以尝试产生一个1024位的RSA密钥对(后缀名也可以为.key)

openssl genrsa -out rsa.pem 1024

image

该密钥文件中包含公私钥对,查看rsa.pem文件时仅显示私钥

image

可以用如下指令导出公钥文件

openssl rsa -in rsa.pem -pubout -out pub.pem

image

未加密的密钥文件会产生安全问题,在生成密钥文件时,我们可以对密钥文件进行加密处理

openssl genrsa -out rsa1.pem -des -passout pass:123456 1024

image

rsa指令

rsa指令主要对密钥文件进行管理,其用法如下:

 -inform arg //输入文件格式,默认pem格式(DER NET PEM) -outform arg //输出文件格式,默认pem格式(DER NET PEM) -in arg //输入文件 -passin arg //指定输入文件的加密口令,可来自文件、终端、环境变量等 -out arg //输出文件 -passout arg //指定输出文件的加密口令,可来自文件、终端、环境变量等 -des //使用des加密输出的文件 -des3 //使用des3加密输出的文件 -seed //使用seed加密输出的文件 -aes128, -aes192, -aes256 //使用aes加密输出的文件 -camellia128, -camellia192, -camellia256 //使用camellia加密输出的文件 -text //以明文形式输出各个参数值 -noout //不输出密钥到任何文件 -check //检查输入密钥的正确性和一致性 -pubin //指定输入文件是公钥 -pubout //指定输出文件是公钥 

修改密钥文件的保护口令、导出公钥

对于没有保护口令的密钥文件rsa.pem,我们可以为其增加保护口令

openssl rsa -in rsa.pem -des3 -passout pass:123456 -out e_rsa.pem

image

去除e_rsa.pem的保护口令

openssl rsa -in e_rsa.pem -passin pass:123456 -out p_rsa.pem

经过比较rsa.pem和p_rsa.pem两个密钥文件是一样的

导出rsa.pem的公钥

openssl rsa -in rsa.pem -pubout -out pub.pem

image

rsautl指令

rsautl用于加解密操作和数字签名,其用法如下:

-in file //输入文件 -out file //输出文件 -inkey file //输入的密钥 -keyform arg //指定密钥格式 -pubin //指定输入的是RSA公钥 -certin //指定输入的是证书文件 -sign //使用私钥做签名 -verify //使用公钥认证签名 -encrypt //使用公钥加密 -decrypt //使用私钥解密 -passin arg //指定输入的密码 

加解密操作

我们可以新建一个文件用于进行加解密操作

echo rsautltest > plain.txt

使用之前产生的密钥文件rsa.pem进行加密,实际上使用的是文件中的公钥

openssl rsautl -encrypt -in plain.txt -inkey rsa.pem -passin pass:123456 -out enc.txt

使用之前产生的密钥文件rsa.pem进行解密,实际上使用的是文件中的私钥

openssl rsatul -decrypt -in enc.txt -inkey rsa.pem -passin pass:123456 -out replain.txt

通过比较可以发现plain.txt和replain.txt文件是相同的。

注:每次RSA加密时会根据填充模式填充随机数,故每次加密结果是不同的。

数字签名

数字签名过程与非对称加密相反,使用私钥进行签名,使用公钥进行验签。请注意rsautl命令的签名验签本质上是加解密操作,没有增加摘要操作,故对于较大文件来说,无法进行签名。

使用之前产生的密钥文件rsa.pem进行签名,实际上使用的是文件中的私钥

openssl rsautl -sign -in plain.txt -inkey rsa.pem -passin pass:123456 -out sign.txt

使用之前产生的密钥文件rsa.pem进行验签,实际上使用的是文件中的公钥

openssl rsautl -verify -in sign.txt -inkey rsa.pem -passin pass:123456 -out verify.txt

通过比较可以发现plain.txt和verify.txt文件是相同的。