本章解说下openssl相干概念和加解密算法的根本应用
这篇文章讲述以下几点
什么是OpenSSL
基本功能
密钥、证书的编码格局和后缀名
对称加密的根本应用
生成公私钥对
非对称加密的根本应用
- 什么是OpenSSL
OpenSSL 是一个安全套接字层明码库,囊括次要的明码算法、罕用的密钥和证书封装治理性能及SSL协定,并提供丰盛的应用程序供测试或其它目标应用。 - 基本功能
openssl是一个开源程序的套件、这个套件有三个局部组成:一是libcryto,这是一个具备通用性能的加密库,外面实现了泛滥的加密库;二是libssl,这个是实现ssl机制的,它是用于实现TLS/SSL的性能;三是openssl,是个多功能命令行工具,它能够实现加密解密,甚至还能够当CA来用,能够让你创立证书、撤消证书。
为了做个更简略的辨别,我分成上面3种,可能你看着会亲切一些
加解密库(本章只探讨加解密)
SSL协定实现
一些通过封装,不便你应用加解密和SSL的工具
**密钥、证书的编码格局和后缀名
目前有以下两种编码格局.
PEM - Privacy Enhanced Mail
关上看文本格式,以"-----BEGIN-----"结尾, "-----END-----"结尾,内容是Base64编码,查看PEM格局的信息能够用命令
openssl rsa -in my.pem -text -noout
Unix服务器偏差于应用这种编码格局.
DER - Distinguished Encoding Rules
关上看是二进制格局,不可读,查看DER格局的信息能够用命令
openssl rsa -in my.der -inform der -text -noout
Java和Windows服务器偏差于应用这种编码格局.
咱们平时见到的多种后缀名,都是语义化的后缀,在生成密钥的时候,比方咱们私钥的后缀名能够写.pem .key,都是能够的,以下几种为罕用后缀
CRT - CRT应该是certificate的三个字母,其实还是证书的意思,常见于Unix零碎,有可能是PEM编码,也有可能是DER编码,大多数应该是PEM编码,置信你曾经晓得怎么分别.
CER - 还是certificate,还是证书,常见于Windows零碎,同样的,可能是PEM编码,也可能是DER编码,大多数应该是DER编码.
KEY - 通常用来寄存一个公钥或者私钥,并非X.509证书,编码同样的,可能是PEM,也可能是DER.
查看KEY的方法:
openssl rsa -in mykey.key -text -noout
如果是DER格局的话,同理应该这样了:
openssl rsa -in mykey.key -text -noout -inform der
CSR - Certificate Signing Request,即证书签名申请,这个并不是证书,而是向权威证书颁发机构取得签名证书的申请,其核心内容是一个公钥(当然还附带了一些别的信息),在生成这个申请的时候,同时也会生成一个私钥,私钥要本人保存好,查看的方法:
openssl req -noout -text -in my.csr
(如果是DER格局的话依旧加上-inform der,这里不写了)
- 罕用加解密算法应用
咱们重点探讨如何应用
1.对称加密
咱们须要用到 openssl enc 命令,先看下帮忙文档
$ openssl enc -h
:<<!
-in <file> 输出文件
-out <file> 输入文件
-pass <arg> 明码
-S 盐,用于加盐加密,请防止人为输出,上面探讨
-e encrypt 加密操作
-d decrypt 解密操作
-a/-base64 base64 encode/decode, depending on encryption flag 是否将后果base64编码
-k 已被-pass参数取代
-kfile 已被-pass参数取代
-md 指定密钥生成的摘要算法 默认MD5
-K/-iv 加密所需的key和iv向量,由输出的-pass生成
-[pP] print the iv/key (then exit if -P) 是否须要在控制台输入生成的 key和iv向量
-bufsize <n> 读写文件的I/O缓存,个别不须要指定
-engine e 指定三方加密设施,没有环境,暂不试验
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
…………
!
应用,默认从控制台输出明码,如果不指定加密算法,是不会进行加密的,也不会报错,比方咱们不指定算法,只指定base64格局输入,就相当于只做了base64编码而已
/对文件进行base64编码/
openssl enc -base64 -in plain.txt -out base64.txt
/对base64格式文件进行解密/
openssl enc -base64 -d -in base64.txt -out plain2.txt
/应用diff命令查看可知解码前后明文一样/
diff plain.txt plain2.txt
不同输出明码的形式
/命令行输出,明码123456/
openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass pass:123456
/文件输出,明码123456/
echo 123456 > passwd.txt
openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass file:passwd.txt
/环境变量输出,明码123456/
passwd=123456
export passwd
openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass env:passwd
/从文件形容输出/
openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass fd:1
/从规范输出输出/
openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass stdin
对称加密的应用中,尽管咱们输出了-pass,指定了明码,然而实质是采纳key和iv向量进行加密的,咱们输出的-pass,会转换成key和iv
为了加强安全性,在把用户明码转换成 key / iv 的时候须要应用盐值,默认盐值随机生成。应用-S参数,则盐值由用户指定。也可指用-nosalt指定不应用盐值,但升高了安全性,不举荐应用。
因为实质是采纳 key / iv 加密,所以咱们能够间接用 key / iv 解密或者加密
手动指定Key和IV值,指定key / iv 后,-pass参数不起作用
/手动指定key和iv值/
$ openssl enc -aes-128-cbc -in plain.txt -out encrypt.txt -K 1223 -iv f123 -p
salt=0B00000000000000
key=12230000000000000000000000000000
iv =F1230000000000000000000000000000
/指定pass明码,不起作用,留神Key和IV值是16进制/
$ openssl enc -aes-128-cbc -in plain.txt -out encrypt.txt -K 1223 -iv f123 -p -pass pass:123456
salt=F502F4B8DE62E0E5
key=12230000000000000000000000000000
iv =F1230000000000000000000000000000
2.公私钥对的生成(这里演示RSA算法相干)
首先咱们须要用到 openssl genrsa 命令,先看下帮忙文档,这是一个繁难的命令,为了不便咱们生成本人的私钥
$ openssl genrsa -h
/*
usage: genrsa [args] [numbits]
-des 生成的私钥采纳DES算法加密
-des3 生成的私钥采纳DES3算法加密 (168 bit key)
-seed encrypt PEM output with cbc seed
-aes128, -aes192, -aes256
以上几个都是对称加密算法的指定,因为咱们长期会把私钥加密,防止明文寄存
-out file 私钥输入地位
-passout arg 输入文件的明码,如果咱们指定了对称加密算法,也能够不带此参数,会有命令行提醒你输出明码
*/
咱们生成一个私钥
~ » openssl genrsa -out my.key -des3
/*
Generating RSA private key, 512 bit long modulus
...++++++++++++
.++++++++++++
e is 65537 (0x10001)
因为指定了des3算法,并且没指定明码,所以会要求我输出明码
Enter pass phrase for my.key:
Verifying - Enter pass phrase for my.key:
*/
~ » cat my.key
/*
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,21A9C0CD76DFBF27
i1h8ZmZxOZxDHigtXs0tAIWNs7THoN4t00F4xmYP7gDEU8vwWXltZisUqMJ2KHgZ
ME70Tm2XvhEAwu3OLhCaV6Url+DJ/G6sMFpnvkebrW51Ndph87ZCRdhaOrXN2WVg
+/KNRv2dMh4c98zgoJqYiN6qqdY9Sztj0DMtjn2f9k7mU8l2oN5bmlO6dy+mX2ZB
Qaupx9PV2DZH7Yd5tcKLudCa44lJ9cJscnvIyzLhDHcrGytCsTeHNeVMx9gefd0p
DzMBruiNhmXSe8a067OT5mWMi7++4WOYYWfIj2bat/pxsBNo0gOxqcuV0G1RFEDA
uX0vk1ma3+hB01p51bPCjc2HF/nvs2s/YeYgJR/E3zuxQGMvi6G0uxVY10i5xhtb
mIXi1J5RSoVcj2gMXD3GasGANNG3hdTWC+g6hfq+DczmGl8uR9lXwg==
-----END RSA PRIVATE KEY-----
*/
咱们能够指定私钥长度,命令最初就是指定私钥长度,默认512bit
openssl genrsa -out my.key -des3 1024
另外咱们须要用到 openssl rsa 命令,咱们会用它生成公钥,先看下帮忙文档
$ openssl rsa -h
/*
-inform arg 输出文件编码格局,只有pem和der两种
-outform arg 输入文件编码格局,只有pem和der两种
-in arg input file 输出文件
-sgckey Use IIS SGC key format
-passin arg 如果输出文件被对称加密过,须要指定输出文件的明码
-out arg 输入文件地位
-passout arg 如果输入文件也须要被对称加密,须要指定输入文件的明码
-des 对输入后果采纳对称加密 des算法
-des3 对输入后果采纳对称加密 des3算法
-seed
-aes128, -aes192, -aes256
以上几个都是对称加密算法的指定,生成私钥的时候个别会用到,咱们不让私钥明文保留
-text 以明文模式输入各个参数值
-noout 不输入密钥到任何文件
-modulus 输入模数值
-check 查看输出密钥的正确性和一致性
-pubin 指定输出文件是公钥
-pubout 指定输入文件是公钥
-engine e 指定三方加密库或者硬件
*/
咱们利用方才生成的私钥my.key,以此生成一个公钥
~ » openssl rsa -in my.key -pubout -out my_pub.key
/*
Enter pass phrase for my.key: # 因为私钥有明码,咱们须要输出
writing RSA key
*/
~ » cat my_pub.key
/*
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAN4QWx/qPoOllcE8ZcR5zBzrSVFh7NXY
4SJHB8+IM3Wv2aYi7F3GlZjpt6EP3vdd4x4cJnuPFnZ5mZ5wFPQ8xD0CAwEAAQ==
-----END PUBLIC KEY-----
*/
openssl rsa 命令的性能还有很多
rsa 增加 和 去除 密钥的对称加密
/生成不加密的RSA密钥/
$ openssl genrsa -out RSA.pem
Generating RSA private key, 512 bit long modulus
..............++++++++++++
.....++++++++++++
e is 65537 (0x10001)
/为RSA密钥减少口令爱护/
$ openssl rsa -in RSA.pem -des3 -passout pass:123456 -out E_RSA.pem
/为RSA密钥去除口令爱护/
$ openssl rsa -in E_RSA.pem -passin pass:123456 -out P_RSA.pem
/比拟原始后的RSA密钥和去除口令后的RSA密钥,是一样/
$ diff RSA.pem P_RSA.pem
2、批改密钥的爱护口令和算法
/生成RSA密钥/
$ openssl genrsa -des3 -passout pass:123456 -out RSA.pem
Generating RSA private key, 512 bit long modulus
..................++++++++++++
......................++++++++++++
e is 65537 (0x10001)
/批改加密算法为aes128,口令是123456/
$ openssl rsa -in RSA.pem -passin pass:123456 -aes128 -passout pass:123456 -out E_RSA.pem
3、查看密钥对中的各个参数
$ openssl rsa -in RSA.pem -des -passin pass:123456 -text -noout
4、提取密钥中的公钥并打印模数值
/提取公钥,用pubout参数指定输入为公钥/
$ openssl rsa -in RSA.pem -passin pass:123456 -pubout -out pub.pem
/打印公钥中模数值/
$ openssl rsa -in pub.pem -pubin -modulus -noout
Modulus=C35E0B54041D78466EAE7DE67C1DA4D26575BC1608CE6A199012E11D10ED36E2F7C651D4D8B40D93691D901E2CF4E21687E912B77DCCE069373A7F6585E946EF
5、转换密钥的格局
/把pem格局转化成der格局,应用outform指定der格局/
$ openssl rsa -in RSA.pem -passin pass:123456 -des -passout pass:123456 -outform der -out rsa.der
/把der格局转化成pem格局,应用inform指定der格局/
$ openssl rsa -in rsa.der -inform der -passin pass:123456 -out rsa.pem
3.利用已有的公私钥对 ,进行非对称加解密
咱们这里须要用到 openssl rsautl 命令
留神:无论是应用公钥加密还是私钥加密,RSA每次可能加密的数据长度不能超过RSA密钥长度,并且依据具体的补齐形式不同输出的加密数据最大长度也不一样,而输入长度则总是跟RSA密钥长度相等。RSA不同的补齐办法对应的输出输出长度如下表
数据补齐形式 输出数据长度 输入数据长度 参数字符串
PKCS#1 v1.5 少于(密钥长度-11)字节 同密钥长度 -pkcs
PKCS#1 OAEP 少于(密钥长度-11)字节 同密钥长度 -oaep
PKCS#1 for SSLv23 少于(密钥长度-11)字节 同密钥长度 -ssl
不应用补齐 同密钥长度 同密钥长度 -raw
应用rsautl进行加密和解密操作,咱们还是先看一下帮忙文档
$ openssl rsautl -h
Usage: rsautl [options]
-in file input file //输出文件
-out file output file //输入文件
-inkey file input key //输出的密钥
-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 use SSL v2 padding //应用SSLv23的填充形式
-raw use no padding //不进行填充
-pkcs use PKCS#1 v1.5 padding (default) //应用V1.5的填充形式
-oaep use PKCS#1 OAEP //应用OAEP的填充形式
-sign sign with private key //应用私钥做签名
-verify verify with public key //应用公钥认证签名
-encrypt encrypt with public key //应用公钥加密
-decrypt decrypt with private key //应用私钥解密
-hexdump hex dump output //以16进制dump输入
-engine e use engine e, possibly a hardware device. //指定三方库或者硬件设施
-passin arg pass phrase source //指定输出的明码
openssl rsautl 根本的加解密应用
/生成RSA密钥/
$ openssl genrsa -des3 -passout pass:123456 -out RSA.pem
Generating RSA private key, 512 bit long modulus
............++++++++++++
...++++++++++++
e is 65537 (0x10001)
/提取公钥/
$ openssl rsa -in RSA.pem -passin pass:123456 -pubout -out pub.pem
/应用RSA作为密钥进行加密,实际上应用其中的公钥进行加密/
$ openssl rsautl -encrypt -in plain.txt -inkey RSA.pem -passin pass:123456 -out enc.txt
/应用RSA作为密钥进行解密,实际上应用其中的私钥进行解密/
$ openssl rsautl -decrypt -in enc.txt -inkey RSA.pem -passin pass:123456 -out replain.txt
/比拟原始文件和解密后文件/
$ diff plain.txt replain.txt
/应用公钥进行加密/
$ openssl rsautl -encrypt -in plain.txt -inkey pub.pem -pubin -out enc1.txt
/私钥进行解密/
$ openssl rsautl -decrypt -in enc1.txt -inkey RSA.pem -passin pass:123456 -out replain1.txt
/比拟原始文件和解密后文件/
$ diff plain.txt replain1.txt
签名与验证操作
/提取PCKS8格局的私钥/
$ openssl pkcs8 -topk8 -in RSA.pem -passin pass:123456 -out pri.pem -nocrypt
/应用RSA密钥进行签名,实际上应用私钥进行加密/
$ openssl rsautl -sign -in plain.txt -inkey RSA.pem -passin pass:123456 -out sign.txt
/应用RSA密钥进行验证,实际上应用公钥进行解密/
$ openssl rsautl -verify -in sign.txt -inkey RSA.pem -passin pass:123456 -out replain.txt
/比照原始文件和签名解密后的文件/
$ diff plain.txt replain.txt
/应用私钥进行签名/
$ openssl rsautl -sign -in plain.txt -inkey pri.pem -out sign1.txt
/应用公钥进行验证/
$ openssl rsautl -verify -in sign1.txt -inkey pub.pem -pubin -out replain1.txt
/比照原始文件和签名解密后的文件/
$ cat plain replain1.txt
参考链接:
https://sslhow.com/openssl-co...