• OpenSSL的基本使用(一)


    前言

    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文件是相同的。

  • 相关阅读:
    vi
    head
    uniq
    sort
    所谓静态绑定
    债务
    不确
    tar
    VMWare虚拟系统上网设置 及 三种模式详解
    awk
  • 原文地址:https://www.cnblogs.com/werr370/p/16385010.html
Copyright © 2020-2023  润新知