参考文章:openssl的安装与使用
安装
首先看一下电脑是否安装了openssl
如果没有安装也可以通过apt或者源码进行安装
sudo apt-get install openssl
sudo apt-get install libssl-dev
加密技术介绍
加密技术包括两个元素:算法和密钥。算法是将普通文本(或者可以理解的信息)与密钥结合,产生不可理解的密文的步骤。在安全保密中,可以通过适当的密钥加密技术和管理机制来保证网络的信息通讯安全。密钥加密技术的密码体制分为:对称和非对称密钥体制两种。
对称加密 | 非对称加密 | |
---|---|---|
特点 | 文件加密和解密使用相同的密钥 | 需要两个密钥:公开密钥和私有密钥 |
优缺点 | 简单快捷,密钥较短 | 密钥较长,保密性较好 |
openssl命令
摘要命令
消息摘要算法的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密,目前可以被解密的逆向的只有CRC32算法,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。
消息摘要的作用:
- 做信息完整性校验
- 保存密码
openssl实现的五种信息摘要算法:MD2、MD5、MDC2、SHA和RIPEMD。
示例如下:
单向加密除了oepnssl dgst工具还有:md5sum,sha1sum,sha224sum,sha256sum ,sha384sum,sha512sum
对称加密命令
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做对称加密需要使用子命令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:指定加密后的文件存放路径
-salt:自动插入一个随机数作为文件内容加密,默认选项
-e:可以指明一种加密算法,若不指的话将使用默认加密算法
-d:解密,解密时也可以指定算法,若不指定则使用默认算法,但一定要与加密时的算法一致
-a/-base64:使用-base64位编码格式
-ciphername:算法名称,des3,des,aes,rc4;
options are
-in <file> 输入文件
-out <file> 输出文件
-pass <arg> 密码
-e encrypt 加密操作
-d decrypt 解密操作
-a/-base64 base64 encode/decode, depending on encryption flag 是否将结果base64编码
-k passphrase is the next argument
-kfile passphrase is the first line of the file argument
-md 指定密钥生成的摘要算法 默认MD5
-S salt in hex is the next argument 用于加盐加密
-K/-iv key/iv in hex is the next argument 加密所需的key和iv向量
-[pP] print the iv/key (then exit if -P) 是否需要在控制台输出生成的 key和iv向量
-bufsize <n> buffer size 读写文件的I/O缓存,一般不需要指定
-nopad disable standard block padding 禁止标准填充
-engine e use engine e, possibly a hardware device 指定三方加密设备
Cipher Types 以下是部分算法,我们可以选择用哪种算法加密
-aes-128-cbc -aes-128-cbc-hmac-sha1 -aes-128-cfb
-aes-128-cfb1 -aes-128-cfb8 -aes-128-ctr
-aes-128-ecb -aes-128-gcm -aes-128-ofb
......
加密的示例如下:
解密示例如下:
对称加密,加密和解密需要用相同的密码,用xxd查看加密后的内容和解密后的内容:
非对称加密命令
OpenSSL实现了四种非对称加密算法:DH、RSA、DSA和椭圆曲线(EC)算法。
DH | RSA | DSA | |
---|---|---|---|
应用 | 一般用户密钥交换 | 密钥交换,数字签名 | 数字签名 |
生成私钥
用openssl命令的子命令genrsa生成私钥,然后使用子命令rsa私钥中提取公钥。
genrsa
功能:
用于生成RSA私钥,不会生成公钥,因为公钥提取自私钥
使用参数:
openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] [numbits]
选项说明:
-out filename :将生成的私钥保存至filename文件,若未指定输出文件,则为标准输出。
-numbits :指定要生成的私钥的长度,默认为1024。该项必须为命令行的最后一项参数。
-des|-des3|-idea :指定加密私钥文件用的算法,这样每次使用私钥文件都将输入密码,太麻烦所以很少使用。
-passout args :加密私钥文件时,传递密码的格式,如果要加密私钥文件时单未指定该项,则提示输入密码。传递密码的args的格式见一下格式。
pass:password :password表示传递的明文密码
env:var :从环境变量var获取密码值
file:filename :filename文件中的第一行为要传递的密码。若filename同时传递给"-passin"和"-passout"选项,则filename的第一行为"-passin"的值,第二行为"-passout"的值
stdin :从标准输入中获取要传递的密码
操作示例:
生成RSA密钥,采用des3对称加密私钥
提取公钥
用rsa子命令从生成的私钥文件中提取公钥。
openssl rsa [-inform PEM|NET|DER]
[-outform PEM|NET|DER] [-in filename] [-passin arg] [-out filename]
[-passout arg] [-sgckey] [-des] [-des3] [-idea] [-text]
[-noout] [-modulus] [-check] [-pubin]
[-pubout] [-RSAPublicKey_in] [-RSAPublicKey_out] [-engine id]
rsa [options] <infile >outfile
where options are
-inform arg 输入文件编码格式,只有pem和der两种
-outform arg 输出文件编码格式,只有pem和der两种
-in arg input file 指明私钥文件的存放路径
-sgckey Use IIS SGC key format
-passin arg 如果输入文件被对称加密过,需要指定输入文件的密码
-out arg output file 指明将公钥的保存路径
-passout arg 如果输出文件也需要被对称加密,需要指定输出文件的密码
-des 对输出结果采用对称加密 des算法
-des3 对输出结果采用对称加密 des3算法
-seed encrypt PEM output with cbc seed
-aes128, -aes192, -aes256
encrypt PEM output with cbc aes
-camellia128, -camellia192, -camellia256
encrypt PEM output with cbc camellia
以上几个都是对称加密算法的指定,生成私钥的时候一般会用到
-text print the key in text 以明文形式输出各个参数值
-noout don't print key out 不输出密钥到任何文件
-modulus 输出模数值
-check 检查输入密钥的正确性和一致性
-pubin 指定输入文件是公钥
-pubout 指定输出文件是公钥
-engine e 指定三方加密库或者硬件
操作示例:
提取公钥
利用公钥加密、私钥解密数据
使用rsautl进行加密和解密操作:
openssl rsautl [-in file] [-out file] [-inkey file] [-pubin] [-certin] [-sign] [-verify]
[-encrypt] [-decrypt] [-pkcs] [-ssl] [-raw] [-hexdump] [-asn1parse]
openssl rsautl -h
Usage: rsautl [options]
-in file input file 输入文件
-out file output file 输出文件
-inkey file input key 指定私有密钥文件,格式是RSA私有密钥文件
-keyform arg private key format - default PEM 指定私钥格式
-pubin input is an RSA public 指定输入的是RSA公钥
-certin input is a certificate carrying an RSA public key 指定输入的是证书文件
-ssl 使用SSLv2的填充方式
-raw 不进行填充
-pkcs 使用V1.5的填充方式(默认)
-oaep 使用OAEP的填充方式
-sign 使用私钥做签名
-verify 使用公钥认证签名
-encrypt 使用公钥加密
-decrypt 使用私钥解密
-hexdump 以16进制打印
-engine e 指定三方库或者硬件设备
-passin arg pass phrase source 传递密码来源
操作示例:
- 使用RSA作为密钥进行加密,实际上使用其中的公钥进行加密
- 使用RSA作为密钥进行解密,实际上使用其中的私钥进行解密
查看加密后的内容
查看解密后的内容
查看原文件的内容
- 使用公钥进行加密
查看加密后的文件
- 私钥进行解密,并查看解密后的文件
数字签名
上面是RSA公钥加密,私钥解密的过程。如果是用私钥进行加密,公钥解密叫做数字签名,因为私钥只有一份,用公钥解密出来验证确认是你用这个私钥做的签名,这就是签名和验证。
先用pkcs8子命令提取出pkcs8格式的私钥,RSA默认生成pkcs1格式的私钥,当然也可以直接使用默认的来做签名和验证,在用Java等一些开发中需要要求私钥是pkcs8格式,pkcs8子命令格式以及参数如下:
openssl pkcs8
[-inform PEM|DER] [-outform PEM|DER] [-in filename] [-passin arg] [-out filename]
[-passout arg] [-topk8] [-noiter] [-nocrypt] [-nooct] [-embed] [-nsdb] [-v2 alg]
[-v1 alg] [-engine id]
参数说明:
-inform PEM|DER :输入文件格式,DER或者PEM格式。DER格式采用ASN1的DER标准格式。一般用的多的都是PEM格式,就是base64编码格式。
-outform DER|PEM :输出文件格式,DER或者PEM格式。
-in filename :输入的密钥文件,默认为标准输入。如果密钥被加密,会提示输入一个密钥口令。
-passin arg :输入文件口令保护来源。
-out filename :输出文件,默认为标准输出。如果任何加密操作已经执行,会提示输入一个密钥值。输出的文件名字不能和输入的文件名一样。
-passout arg :输出文件口令保护来源。
-topk8 :通常的是输入一个pkcs8文件和传统的格式私钥文件将会被写出。设置了此选项后,位置转换过来:输入一个传统格式的私钥文件,输出一个PKCS#8格式的文件。
-noiter :MAC保护计算次数为1。
-nocrypt :PKCS#8密钥产生或输入一般用一个适当地密钥来加密PKCS#8 EncryptedPrivateKeyInfo结构。
#设置了此选项后,一个不加密的PrivateKeyInfo结构将会被输出。这个选项一直不加密私钥文件,在绝对必要的时候才能够使用。某些软件例如一些JAVA代码签名软件使用不加密的私钥文件。
-nooct :这个选项产生的RSA私钥文件是一个坏的格式,一些软件将会使用。特别的是,私钥文件必须附上一个八位组字符串,但是一些软件仅仅包含本身的结构体没有使八位组字符串所环绕。不采用八位组表示私钥。
-embed :这个选项产生的RSA私钥文件是一个坏的格式。在私钥结构体中采用嵌入式DSA参数格式。在这个表单中,八位组字符串包含了ASN1 SEQUENCE中的两种结构:一个SEQUENCE包含了密钥参数,一个ASN1 INTEGER包含私钥值。
-nsdb :这个选项产生的RSA私钥文件是一个坏的格式并兼容了Netscape私钥文件数据库。采用NetscapeDB的DSA格式。
-v2 alg :采用PKCS#5 v2.0,并指定加密算法,默认的是PKCS#8私钥文件被叫做B<pbeWithMD5AndDES-CBC>(该算法用56字节的DES加密但是在PKCS#5 v1.5中有更加强壮的加密算法)的加密算法用口令进行加密。
#用B<-v2>选项,PKCS#5 v2.0相关的算法将会被使用,可以是des3(168字节)和rc2(128字节),推荐des3。
-v1 alg :采用PKCS#5 v1.5或pkcs12,并指定加密算法。
-engine id :指定硬件引擎。
操作示例:
提取PCKS8格式的私钥
使用私钥生成签名
使用公钥对签名进行验证
查看公钥验证签名的解码内容
使用默认的RSA生成的pkcs1格式私钥生成签名
用公钥验证签名,查看解密内容
数字证书
背景:为了确保拿到的服务器公钥是正确的服务器公钥,即有人将其他的服务器公钥给了客户端,使客户端误以为自己是在跟正确的服务器进行交互。(攻击者可以在代理服务器层拦截客户端的请求,再重定向到自己的服务器)
这时候需要一个权威的第三方机构(CA)企业确认这一个公钥是真实的服务器的公钥,服务器将自己的公钥和一些私人信息发送给CA,CA用自己的私钥将这个数据加密智慧也就是数字签名,这样的签名结果成为数字(SSL证书),数字证书遵循X509标准。
当服务器向客户端发送数据的时候,还附上从CA下载到本地的证书,客户端拿到证书以后使用CA的公钥进行解密,确认服务器的公钥无误,最后用服务器的公钥解密。
操作示例:
- 生成私钥
查看私钥信息
- 证书请求:
这个命令会生成一个证书请求,用到了前面生成的密钥private.key
文件,这里将生成一个新的文件cert.csr
,即一个证书请求文件,我们可以拿着这个去数字证书颁发机构CA申请一个数字证书。CA会给你一个新的文件cacert.pem
,那才是包含公钥给对方用的数字证书。
查看证书请求:
如果是自己测试使用,加上X509生成自签名证书:
自签是用自己的私钥给证书签名,有了private.key
和cacert.pem
文件后就可以在自己的程序中使用了,比如做一个加密通讯的服务器。
操作示例:
从证书中提取公钥
创建文件
采用私钥加密
用提取出来的公钥解密
查看原文内容和解密后内容