当前位置:   article > 正文

OpenSSL加解密使用_使用openssl,进行数据加密和解密

使用openssl,进行数据加密和解密

本章讲解下openssl相关概念和加解密算法的基本使用

这篇文章讲述以下几点

  • 什么是OpenSSL
  • 基本功能
  • 密钥、证书的编码格式和后缀名
  • 对称加密的基本使用
  • 生成公私钥对
  • 非对称加密的基本使用

1. 什么是OpenSSL

OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。

2. 基本功能

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,这里不写了)

3. 常用加解密算法使用

我们重点讨论如何使用

1.对称加密

我们需要用到 openssl enc 命令,先看下帮助文档

  1. $ openssl enc -h
  2. :<<!
  3. -in <file> 输入文件
  4. -out <file> 输出文件
  5. -pass <arg> 密码
  6. -S 盐,用于加盐加密,请避免人为输入,下面讨论
  7. -e encrypt 加密操作
  8. -d decrypt 解密操作
  9. -a/-base64 base64 encode/decode, depending on encryption flag 是否将结果base64编码
  10. -k 已被-pass参数取代
  11. -kfile 已被-pass参数取代
  12. -md 指定密钥生成的摘要算法 默认MD5
  13. -K/-iv 加密所需的key和iv向量,由输入的-pass生成
  14. -[pP] print the iv/key (then exit if -P) 是否需要在控制台输出生成的 key和iv向量
  15. -bufsize <n> 读写文件的I/O缓存,一般不需要指定
  16. -engine e 指定三方加密设备,没有环境,暂不实验
  17. Cipher Types 以下是部分算法,我们可以选择用哪种算法加密
  18. -aes-128-cbc -aes-128-cbc-hmac-sha1 -aes-128-cfb
  19. -aes-128-cfb1 -aes-128-cfb8 -aes-128-ctr
  20. -aes-128-ecb -aes-128-gcm -aes-128-ofb
  21. …………
  22. !

使用,默认从控制台输入密码,如果不指定加密算法,是不会进行加密的,也不会报错,比如我们不指定算法,只指定base64格式输出,就相当于只做了base64编码而已

  1. /*对文件进行base64编码*/
  2. openssl enc -base64 -in plain.txt -out base64.txt
  3. /*对base64格式文件进行解密*/
  4. openssl enc -base64 -d -in base64.txt -out plain2.txt
  5. /*使用diff命令查看可知解码前后明文一样*/
  6. diff plain.txt plain2.txt

不同输入密码的方式

  1. /*命令行输入,密码123456*/
  2. openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass pass:123456
  3. /*文件输入,密码123456*/
  4. echo 123456 > passwd.txt
  5. openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass file:passwd.txt
  6. /*环境变量输入,密码123456*/
  7. passwd=123456
  8. export passwd
  9. openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass env:passwd
  10. /*从文件描述输入*/
  11. openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass fd:1
  12. /*从标准输入输入*/
  13. 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参数不起作用

  1. /*手动指定key和iv值*/
  2. $ openssl enc -aes-128-cbc -in plain.txt -out encrypt.txt -K 1223 -iv f123 -p
  3. salt=0B00000000000000
  4. key=12230000000000000000000000000000
  5. iv =F1230000000000000000000000000000
  6. /*指定pass密码,不起作用,注意Key和IV值是16进制*/
  7. $ openssl enc -aes-128-cbc -in plain.txt -out encrypt.txt -K 1223 -iv f123 -p -pass pass:123456
  8. salt=F502F4B8DE62E0E5
  9. key=12230000000000000000000000000000
  10. iv =F1230000000000000000000000000000

2.公私钥对的生成(这里演示RSA算法相关)

首先我们需要用到 openssl genrsa 命令,先看下帮助文档,这是一个简易的命令,为了方便我们生成自己的私钥

  1. $ openssl genrsa -h
  2. /*
  3. usage: genrsa [args] [numbits]
  4. -des 生成的私钥采用DES算法加密
  5. -des3 生成的私钥采用DES3算法加密 (168 bit key)
  6. -seed encrypt PEM output with cbc seed
  7. -aes128, -aes192, -aes256
  8. 以上几个都是对称加密算法的指定,因为我们长期会把私钥加密,避免明文存放
  9. -out file 私钥输出位置
  10. -passout arg 输出文件的密码,如果我们指定了对称加密算法,也可以不带此参数,会有命令行提示你输入密码
  11. */

我们生成一个私钥

  1. ~ » openssl genrsa -out my.key -des3
  2. /*
  3. Generating RSA private key, 512 bit long modulus
  4. ...++++++++++++
  5. .++++++++++++
  6. e is 65537 (0x10001)
  7. # 因为指定了des3算法,并且没指定密码,所以会要求我输入密码
  8. Enter pass phrase for my.key:
  9. Verifying - Enter pass phrase for my.key:
  10. ------------------------------------------------------------
  11. */
  12. ~ » cat my.key
  13. /*
  14. -----BEGIN RSA PRIVATE KEY-----
  15. Proc-Type: 4,ENCRYPTED
  16. DEK-Info: DES-EDE3-CBC,21A9C0CD76DFBF27
  17. i1h8ZmZxOZxDHigtXs0tAIWNs7THoN4t00F4xmYP7gDEU8vwWXltZisUqMJ2KHgZ
  18. ME70Tm2XvhEAwu3OLhCaV6Url+DJ/G6sMFpnvkebrW51Ndph87ZCRdhaOrXN2WVg
  19. +/KNRv2dMh4c98zgoJqYiN6qqdY9Sztj0DMtjn2f9k7mU8l2oN5bmlO6dy+mX2ZB
  20. Qaupx9PV2DZH7Yd5tcKLudCa44lJ9cJscnvIyzLhDHcrGytCsTeHNeVMx9gefd0p
  21. DzMBruiNhmXSe8a067OT5mWMi7++4WOYYWfIj2bat/pxsBNo0gOxqcuV0G1RFEDA
  22. uX0vk1ma3+hB01p51bPCjc2HF/nvs2s/YeYgJR/E3zuxQGMvi6G0uxVY10i5xhtb
  23. mIXi1J5RSoVcj2gMXD3GasGANNG3hdTWC+g6hfq+DczmGl8uR9lXwg==
  24. -----END RSA PRIVATE KEY-----
  25. */

我们可以指定私钥长度,命令最后就是指定私钥长度,默认512bit

openssl genrsa -out my.key -des3 1024

另外我们需要用到 openssl rsa 命令,我们会用它生成公钥,先看下帮助文档

  1. $ openssl rsa -h
  2. /*
  3. -inform arg 输入文件编码格式,只有pem和der两种
  4. -outform arg 输出文件编码格式,只有pem和der两种
  5. -in arg input file 输入文件
  6. -sgckey Use IIS SGC key format
  7. -passin arg 如果输入文件被对称加密过,需要指定输入文件的密码
  8. -out arg 输出文件位置
  9. -passout arg 如果输出文件也需要被对称加密,需要指定输出文件的密码
  10. -des 对输出结果采用对称加密 des算法
  11. -des3 对输出结果采用对称加密 des3算法
  12. -seed
  13. -aes128, -aes192, -aes256
  14. 以上几个都是对称加密算法的指定,生成私钥的时候一般会用到,我们不让私钥明文保存
  15. -text 以明文形式输出各个参数值
  16. -noout 不输出密钥到任何文件
  17. -modulus 输出模数值
  18. -check 检查输入密钥的正确性和一致性
  19. -pubin 指定输入文件是公钥
  20. -pubout 指定输出文件是公钥
  21. -engine e 指定三方加密库或者硬件
  22. */

我们利用刚才生成的私钥my.key,以此生成一个公钥

  1. ~ » openssl rsa -in my.key -pubout -out my_pub.key
  2. /*
  3. Enter pass phrase for my.key: # 因为私钥有密码,我们需要输入
  4. writing RSA key
  5. ------------------------------------------------------------
  6. */
  7. ~ » cat my_pub.key
  8. /*
  9. -----BEGIN PUBLIC KEY-----
  10. MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAN4QWx/qPoOllcE8ZcR5zBzrSVFh7NXY
  11. 4SJHB8+IM3Wv2aYi7F3GlZjpt6EP3vdd4x4cJnuPFnZ5mZ5wFPQ8xD0CAwEAAQ==
  12. -----END PUBLIC KEY-----
  13. */

openssl rsa 命令的功能还有很多

  1. rsa 添加 和 去除 密钥的对称加密

  1. /*生成不加密的RSA密钥*/
  2. $ openssl genrsa -out RSA.pem
  3. Generating RSA private key, 512 bit long modulus
  4. ..............++++++++++++
  5. .....++++++++++++
  6. e is 65537 (0x10001)
  7. /*为RSA密钥增加口令保护*/
  8. $ openssl rsa -in RSA.pem -des3 -passout pass:123456 -out E_RSA.pem
  9. /*为RSA密钥去除口令保护*/
  10. $ openssl rsa -in E_RSA.pem -passin pass:123456 -out P_RSA.pem
  11. /*比较原始后的RSA密钥和去除口令后的RSA密钥,是一样*/
  12. $ diff RSA.pem P_RSA.pem

2、修改密钥的保护口令和算法

  1. /*生成RSA密钥*/
  2. $ openssl genrsa -des3 -passout pass:123456 -out RSA.pem
  3. Generating RSA private key, 512 bit long modulus
  4. ..................++++++++++++
  5. ......................++++++++++++
  6. e is 65537 (0x10001)
  7. /*修改加密算法为aes128,口令是123456*/
  8. $ 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、提取密钥中的公钥并打印模数值

  1. /*提取公钥,用pubout参数指定输出为公钥*/
  2. $ openssl rsa -in RSA.pem -passin pass:123456 -pubout -out pub.pem
  3. /*打印公钥中模数值*/
  4. $ openssl rsa -in pub.pem -pubin -modulus -noout
  5. Modulus=C35E0B54041D78466EAE7DE67C1DA4D26575BC1608CE6A199012E11D10ED36E2F7C651D4D8B40D93691D901E2CF4E21687E912B77DCCE069373A7F6585E946EF

5、转换密钥的格式

  1. /*把pem格式转化成der格式,使用outform指定der格式*/
  2. $ openssl rsa -in RSA.pem -passin pass:123456 -des -passout pass:123456 -outform der -out rsa.der
  3. /*把der格式转化成pem格式,使用inform指定der格式*/
  4. $ 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进行加密和解密操作,我们还是先看一下帮助文档

  1. $ openssl rsautl -h
  2. Usage: rsautl [options]
  3. -in file input file //输入文件
  4. -out file output file //输出文件
  5. -inkey file input key //输入的密钥
  6. -keyform arg private key format - default PEM //指定密钥格式
  7. -pubin input is an RSA public //指定输入的是RSA公钥
  8. -certin input is a certificate carrying an RSA public key //指定输入的是证书文件
  9. -ssl use SSL v2 padding //使用SSLv23的填充方式
  10. -raw use no padding //不进行填充
  11. -pkcs use PKCS#1 v1.5 padding (default) //使用V1.5的填充方式
  12. -oaep use PKCS#1 OAEP //使用OAEP的填充方式
  13. -sign sign with private key //使用私钥做签名
  14. -verify verify with public key //使用公钥认证签名
  15. -encrypt encrypt with public key //使用公钥加密
  16. -decrypt decrypt with private key //使用私钥解密
  17. -hexdump hex dump output //16进制dump输出
  18. -engine e use engine e, possibly a hardware device. //指定三方库或者硬件设备
  19. -passin arg pass phrase source //指定输入的密码

openssl rsautl 基本的加解密使用

  1. /*生成RSA密钥*/
  2. $ openssl genrsa -des3 -passout pass:123456 -out RSA.pem
  3. Generating RSA private key, 512 bit long modulus
  4. ............++++++++++++
  5. ...++++++++++++
  6. e is 65537 (0x10001)
  7. /*提取公钥*/
  8. $ openssl rsa -in RSA.pem -passin pass:123456 -pubout -out pub.pem
  9. /*使用RSA作为密钥进行加密,实际上使用其中的公钥进行加密*/
  10. $ openssl rsautl -encrypt -in plain.txt -inkey RSA.pem -passin pass:123456 -out enc.txt
  11. /*使用RSA作为密钥进行解密,实际上使用其中的私钥进行解密*/
  12. $ openssl rsautl -decrypt -in enc.txt -inkey RSA.pem -passin pass:123456 -out replain.txt
  13. /*比较原始文件和解密后文件*/
  14. $ diff plain.txt replain.txt
  15. /*使用公钥进行加密*/
  16. $ openssl rsautl -encrypt -in plain.txt -inkey pub.pem -pubin -out enc1.txt
  17. /*私钥进行解密*/
  18. $ openssl rsautl -decrypt -in enc1.txt -inkey RSA.pem -passin pass:123456 -out replain1.txt
  19. /*比较原始文件和解密后文件*/
  20. $ diff plain.txt replain1.txt

签名与验证操作

  1. /*提取PCKS8格式的私钥*/
  2. $ openssl pkcs8 -topk8 -in RSA.pem -passin pass:123456 -out pri.pem -nocrypt
  3. /*使用RSA密钥进行签名,实际上使用私钥进行加密*/
  4. $ openssl rsautl -sign -in plain.txt -inkey RSA.pem -passin pass:123456 -out sign.txt
  5. /*使用RSA密钥进行验证,实际上使用公钥进行解密*/
  6. $ openssl rsautl -verify -in sign.txt -inkey RSA.pem -passin pass:123456 -out replain.txt
  7. /*对比原始文件和签名解密后的文件*/
  8. $ diff plain.txt replain.txt
  9. /*使用私钥进行签名*/
  10. $ openssl rsautl -sign -in plain.txt -inkey pri.pem -out sign1.txt
  11. /*使用公钥进行验证*/
  12. $ openssl rsautl -verify -in sign1.txt -inkey pub.pem -pubin -out replain1.txt
  13. /*对比原始文件和签名解密后的文件*/
  14. $ cat plain replain1.txt



作者:感觉被掏空
链接:https://www.jianshu.com/p/15b1d935a44b
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

参考链接:

OpenSSL Commands Cheat Sheet - SSLHOW

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/308420
推荐阅读
相关标签
  

闽ICP备14008679号