1、非对称加密算法概述

非对称加密算法也称公开密钥算法,其解决了对称加密算法密钥分配的问题,非对称加密算法基本特点如下:

1、加密密钥和解密密钥不同

2、密钥对中的一个密钥可以公开

3、根据公开密钥很难推算出私人密钥

根据非对称加密算法的特点,可用户数字签名、密钥交换、数据加密。但是由于非对称加密算法较对称加密算法加密速度慢很多,故最常用的用途是数字签名和密钥交换。

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

openssl支持以上三种算法,并为三种算法提供了丰富的指令集,本章主要介绍RSA算法及相关指令

2、RSA算法相关指令及用法

RSA虽然可以数字签名、密钥交换和数据加密,但是RSA加密数据速度慢,通常不使用RSA加密数据。所以最常用的功能就是数字签名和密钥交换,抛开数字签名和密钥交换的概念,实质上就是使用公钥加密还是使用私钥加密的区别。所以我们只要记住一句话:“公钥加密,私钥签名”。

公钥加密:用途是密钥交换,用户A使用用户B的公钥将少量数据加密发送给B,B用自己的私钥解密数据

私钥签名:用途是数字签名,用户A使用自己的私钥将数据的摘要信息加密一并发送给B,B用A的公钥解密摘要信息并验证

opessl中RSA算法指令主要有三个,其他指令虽有涉及,但此处不再详述。

指令 功能
genrsa 生成并输入一个RSA私钥
rsa 处理RSA密钥的格式转换等问题
rsautl 使用RSA密钥进行加密、解密、签名和验证等运算

2.1 genrsa指令说明

genrsa用于生成密钥对,其用法如下

xlzh@cmos:~$ openssl genrsa -
usage: genrsa [args] [numbits] //密钥位数,建议1024及以上
-des encrypt the generated key with DES in cbc mode //生成的密钥使用des方式进行加密
-des3 encrypt the generated key with DES in ede cbc mode ( bit key) //生成的密钥使用des3方式进行加密
-seed
encrypt PEM output with cbc seed //生成的密钥还是要seed方式进行
-aes128, -aes192, -aes256
encrypt PEM output with cbc aes //生成的密钥使用aes方式进行加密
-camellia128, -camellia192, –camellia256
encrypt PEM output with cbc camellia //生成的密钥使用camellia方式进行加密
-out file output the key to 'file //生成的密钥文件,可从中提取公钥
-passout arg output file pass phrase source //指定密钥文件的加密口令,可从文件、环境变量、终端等输入
-f4 use F4 (0x10001) for the E value //选择指数e的值,默认指定该项,e值为65537 - use for the E value //选择指数e的值,默认值为65537,使用该选项则指数指定为3
-engine e use engine e, possibly a hardware device. //指定三方加密库或者硬件
-rand file:file:...
load the file (or the files in the directory) into //产生随机数的种子文件
the random number generator

可以看到genrsa指令使用较为简单,常用的也就有指定加密算法、输出密钥文件、加密口令。我们仅举一个例子来说明

/*
* 指定密钥文件rsa.pem
* 指定加密算法aes128
* 指定加密密钥123456
* 指定密钥长度1024
**/
xlzh@cmos:~$ openssl genrsa -out rsa.pem -aes128 -passout pass:
Generating RSA private key, bit long modulus
...............................................................++++++
.................................++++++
e is (0x10001) // 默认模式65537
/*加密后的密钥文件有加密算法等信息*/
xlzh@cmos:~$ cat rsa.pem
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: ,ENCRYPTED
DEK-Info: AES--CBC,4C23682B0D34D339ED7E44819A70B4F9 c9uHqqWbkcw3hjdQ/6fGuJcOFchd4+KfVZoJnnISnJBAhv3CelFAksKb2RKa5GoC
4Eq6SykCCSH8OboPoPBjd1ZdAsDl1Pio0vIJfAoQ4NmaRJ61+6onJ/HAx2NFTDjN
yrmsGOWejB6A3MT4KiXrvICnkKMsUY1Qp6ln2qOeVynmxeWAWiVZnjfm0OkScL1K
RGSuL32vecN5b1S8fZTYJTS3PQxjmyaw65zLX+8mUObanL9WhSLTz2eo/6xTzRbD
iOGMolfP/3ObqIAS3007qV48CtwWrlAa+RpbMVIiESN7BforOaNbh0s5NVuUnXYs
hx90iZj2M1L4i5SP8jKBunXPK6CHQtUQXpMH06nhoMNyZPtRQegFgZlwVOpOfoS5
khGAjJPnEXI7ah8oCNYO21JV6SlMFxK1lUeS3xCvM8Cd/zVBSzD7jg+axBJr+LpO
rhpmEFkStXHtFo3OK3BoyQHIzYEYH4S59xWO+dfrb2zUvkKsQKkV+TFMSZpr7b7U
iegUcK3NrbcWDApfTYmf/edublJBv816to+hYQLhXKfuzP5iMJmjnubhrXrA6S47
7XN6nil9DGWzUEMPnH6Brc8mj7JwFtxdpWDN2pY+VcJ04O98fO08c+4eSS3u0Y9f
TyxYy1C9nIWxF+t2Dulq94N4AQ2uyTXoVNhrmDYrJ9BUCugg6zx6xtU24aSGFvtn
ikgAU8JCX0GkcwU60tTLSxPNAWhNxJSJ5n7BXaV6QQ1GOiiKQlJAcRv2PMxNqVgK
poVq742+awsichrwqE5VIFW9AdSMyIT7w06IogyUrS++FmFS6qPtT3ZbFZakzkd
-----END RSA PRIVATE KEY-----
xlzh@cmos:~$

2.2 rsa指令说明

rsa指令用户管理生成的密钥,其用法如下

xlzh@cmos:~$ openssl rsa -
unknown option -
rsa [options] <infile >outfile
where options are
-inform arg input format - one of DER NET PEM //输入文件格式,默认pem格式
-outform arg output format - one of DER NET PEM //输入文件格式,默认pem格式
-in arg input file //输入文件
-sgckey Use IIS SGC key format //指定SGC编码格式,兼容老版本,不应再使用
-passin arg input file pass phrase source //指定输入文件的加密口令,可来自文件、终端、环境变量等
-out arg output file //输出文件
-passout arg output file pass phrase source //指定输出文件的加密口令,可来自文件、终端、环境变量等
-des encrypt PEM output with cbc des //使用des加密输出的文件
-des3 encrypt PEM output with ede cbc des using bit key //使用des3加密输出的文件
-seed encrypt PEM output with cbc seed //使用seed加密输出的文件
-aes128, -aes192, -aes256
encrypt PEM output with cbc aes //使用aes加密输出的文件
-camellia128, -camellia192, -camellia256
encrypt PEM output with cbc camellia //使用camellia加密输出的文件呢
-text print the key in text //以明文形式输出各个参数值
-noout don't print key out //不输出密钥到任何文件
-modulus print the RSA key modulus //输出模数指
-check verify key consistency //检查输入密钥的正确性和一致性
-pubin expect a public key in input file //指定输入文件是公钥
-pubout output a public key //指定输出文件是公钥
-engine e use engine e, possibly a hardware device. //指定三方加密库或者硬件
xlzh@cmos:~$

rsa指令操作示例如下

1、rsa添加和去除密钥的保护口令

/*生成不加密的RSA密钥*/
xlzh@cmos:~/test$ openssl genrsa -out RSA.pem
Generating RSA private key, bit long modulus
..............++++++++++++
.....++++++++++++
e is (0x10001)
/*为RSA密钥增加口令保护*/
xlzh@cmos:~/test$ openssl rsa -in RSA.pem -des3 -passout pass: -out E_RSA.pem
writing RSA key
/*为RSA密钥去除口令保护*/
xlzh@cmos:~/test$ openssl rsa -in E_RSA.pem -passin pass: -out P_RSA.pem
writing RSA key
/*比较原始后的RSA密钥和去除口令后的RSA密钥,是一样*/
xlzh@cmos:~/test$ diff RSA.pem P_RSA.pem

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

/*生成RSA密钥*/
xlzh@cmos:~/test$ openssl genrsa -des3 -passout pass: -out RSA.pem
Generating RSA private key, bit long modulus
..................++++++++++++
......................++++++++++++
e is (0x10001)
/*修改加密算法为aes128,口令是123456*/
xlzh@cmos:~/test$ openssl rsa -in RSA.pem -passin pass: -aes128 -passout pass: -out E_RSA.pem
writing RSA key

3、查看密钥对中的各个参数

xlzh@cmos:~/test$ openssl rsa -in RSA.pem -des -passin pass: -text -noout

4、提取密钥中的公钥并打印模数值

/*提取公钥,用pubout参数指定输出为公钥*/
xlzh@cmos:~/test$ openssl rsa -in RSA.pem -passin pass: -pubout -out pub.pem
writing RSA key
/*打印公钥中模数值*/
xlzh@cmos:~/test$ openssl rsa -in pub.pem -pubin -modulus -noout
Modulus=C35E0B54041D78466EAE7DE67C1DA4D26575BC1608CE6A199012E11D10ED36E2F7C651D4D8B40D93691D901E2CF4E21687E912B77DCCE069373A7F6585E946EF

5、转换密钥的格式

/*把pem格式转化成der格式,使用outform指定der格式*/
xlzh@cmos:~/test$ openssl rsa -in RSA.pem -passin pass: -des -passout pass: -outform der -out rsa.der
writing RSA key
/*把der格式转化成pem格式,使用inform指定der格式*/
xlzh@cmos:~/test$ openssl rsa -in rsa.der -inform der -passin pass: -out rsa.pem

2.3 rsautl指令说明

上述两个指令是密钥的生成及管理作用,rsautl则是真正用于密钥交换和数字签名。实质上就是使用RSA公钥或者私钥加密。

而无论是使用公钥加密还是私钥加密,RSA每次能够加密的数据长度不能超过RSA密钥长度,并且根据具体的补齐方式不同输入的加密数据最大长度也不一样,而输出长度则总是跟RSA密钥长度相等。RSA不同的补齐方法对应的输入输入长度如下表

数据补齐方式 输入数据长度 输出数据长度 参数字符串
PKCS#1 v1.5 少于(密钥长度-11)字节 同密钥长度 -pkcs
PKCS#1 OAEP 少于(密钥长度-11)字节 同密钥长度 -oaep
PKCS#1 for SSLv23 少于(密钥长度-11)字节 同密钥长度 -ssl
不使用补齐 同密钥长度 同密钥长度 -raw

rsautl指令用法如下

xlzh@cmos:~$ openssl rsautl -
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# v1. padding (default) //使用V1.5的填充方式
-oaep use PKCS# 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 //指定输入的密码

rsautl操作示例如下:

1、使用rsautl进行加密和解密操作

/*生成RSA密钥*/
xlzh@cmos:~/test$ openssl genrsa -des3 -passout pass: -out RSA.pem
Generating RSA private key, bit long modulus
............++++++++++++
...++++++++++++
e is (0x10001)
/*提取公钥*/
xlzh@cmos:~/test$ openssl rsa -in RSA.pem -passin pass: -pubout -out pub.pem
writing RSA key
/*使用RSA作为密钥进行加密,实际上使用其中的公钥进行加密*/
xlzh@cmos:~/test$ openssl rsautl -encrypt -in plain.txt -inkey RSA.pem -passin pass: -out enc.txt
/*使用RSA作为密钥进行解密,实际上使用其中的私钥进行解密*/
xlzh@cmos:~/test$ openssl rsautl -decrypt -in enc.txt -inkey RSA.pem -passin pass: -out replain.txt
/*比较原始文件和解密后文件*/
xlzh@cmos:~/test$ diff plain.txt replain.txt
/*使用公钥进行加密*/
xlzh@cmos:~/test$ openssl rsautl -encrypt -in plain.txt -inkey pub.pem -pubin -out enc1.txt
/*使用RSA作为密钥进行解密,实际上使用其中的私钥进行解密*/
xlzh@cmos:~/test$ openssl rsautl -decrypt -in enc1.txt -inkey RSA.pem -passin pass: -out replain1.txt
/*比较原始文件和解密后文件*/
xlzh@cmos:~/test$ diff plain.txt replain1.txt

在进行这个实验的时候有个疑惑,为什么相同的明文,使用密钥加密和公钥加密后的密文结果不一样?在网上查询了下,是因为rsa公钥加密的时候根据填充模式填充随机数,导致每次加密结果不同。

2、使用rsautl进行签名和验证操作

/*提取PCKS8格式的私钥*/
xlzh@cmos:~/test$ openssl pkcs8 -topk8 -in RSA.pem -passin pass: -out pri.pem -nocrypt
/*使用RSA密钥进行签名,实际上使用私钥进行加密*/
xlzh@cmos:~/test$ openssl rsautl -sign -in plain.txt -inkey RSA.pem -passin pass: -out sign.txt
/*使用RSA密钥进行验证,实际上使用公钥进行解密*/
xlzh@cmos:~/test$ openssl rsautl -verify -in sign.txt -inkey RSA.pem -passin pass: -out replain.txt
/*对比原始文件和签名解密后的文件*/
xlzh@cmos:~/test$ diff plain.txt replain.txt
/*使用私钥进行签名*/
xlzh@cmos:~/test$ openssl rsautl -sign -in plain.txt -inkey pri.pem -out sign1.txt
/*使用公钥进行验证*/
xlzh@cmos:~/test$ openssl rsautl -verify -in sign1.txt -inkey pub.pem -pubin -out replain1.txt
/*对比原始文件和签名解密后的文件*/
xlzh@cmos:~/test$ cat plain replain1.txt

要注意这里的签名和验证过程其本质上是加解密操作,不是标准意义上的签名和验证。标准意义上签名和验证是需要增加摘要操作的,后续文章再详细阐述。

3、小结

我们可以看到上述指令的参数中有涉及到证书相关的内容,等到后期我们介绍CA相关内容的时候在进行补充。

openssl 非对称加密算法RSA命令详解的更多相关文章

  1. openssl 非对称加密算法DSA命令详解

    1.DSA算法概述 DSA算法是美国的国家标准数字签名算法,它只能用户数字签名,而不能用户数据加密和密钥交换. DSA与RSA的生成方式不同,RSA是使用openssl提供的指令一次性的生成密钥(包括 ...

  2. openssl 对称加密算法enc命令详解

    1.对称加密算法概述 openssl的加密算法库提供了丰富的对称加密算法,我们可以通过openssl提供的对称加密算法指令的方式使用,也可以通过调用openssl提供的API的方式使用. openss ...

  3. 非对称加密算法RSA 学习

    非对称加密算法RSA 学习 RSA加密算法是一种非对称加密算法.RSA是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Ad ...

  4. AES 加密算法的原理详解

    AES 加密算法的原理详解 本教程摘选自 https://blog.csdn.net/qq_28205153/article/details/55798628 的原理部分. AES简介 高级加密标准( ...

  5. Git的使用以及常用命令(详解)

    一. 版本控制工具 什么是版本控制系统? 版本控制系统(Version Control System):是一种记录一个或若干文件内容变化,以便将来查阅特定版 本修订情况的系统.版本控制系统不仅可以应用 ...

  6. CentOS下rpm命令详解

    CentOS下rpm命令详解 rpm,Redhat Package Manager,即为红帽公司为RHEL开发的专用包管理器,后来更改为RPM Package Manager,类似于GNU项目,使用递 ...

  7. SSH命令详解2

    ssh命令详解     目录         前言     一.ssh命令         1.Ssh参数解释         2.如何连接远程主机         3.利用Xstart 在windo ...

  8. JAVA的非对称加密算法RSA——加密和解密

    原文转载至:https://www.cnblogs.com/OnlyCT/p/6586856.html 第一部分:RSA算法原理与加密解密 一.RSA加密过程简述 A和B进行加密通信时,B首先要生成一 ...

  9. ssh scp命令详解

    --查看版本 $ ssh -V OpenSSH_3.9p1, OpenSSL 0.9.7a Feb 19 2003 --用SSH登录到远程主机 localhost$ ssh -l jsmith(用户名 ...

随机推荐

  1. Combo( 自定义下拉框) 组件

    本节课重点了解 EasyUI 中 Combo(自定义下拉框)组件的使用方法,这个组件依赖于ValidateBox(验证框)组件 一. 加载方式自定义下拉框不能通过标签的方式进行创建.<input ...

  2. Java 二维码生成工具类

    /** * 二维码 工具 * * @author Rubekid * */ public class QRcodeUtils { /** * 默认version */ public static fi ...

  3. NodeJs获取不到POST参数

    NodeJs报错,从网页端获取不到POST参数,提示错误类似如下 TypeError: Cannot read property 'username' of undefined     at C:\U ...

  4. 《第一行代码》学习笔记34-服务Service(1)

    1.服务是Android中实现程序后台运行的解决方案,适用于执行不需要和用户交互而且要长期运行的任务. 2.服务的运行不依赖于任何用户界面,或切到后台,或用户打开了另外一个应用程序,服务能够保持正常运 ...

  5. C# 解析嵌套的json文件.

    概述 今天我同学问我如何转换json文件,没处理过,网上搜了一下,json转excel的很少,反过来倒是有许多人写了工具. json文件的结构大致是这样的: {, , }, , "type& ...

  6. 【干货】国外程序员整理的 C++ 资源大全【转】

    来自 https://github.com/fffaraz/awesome-cpp A curated list of awesome C/C++ frameworks, libraries, res ...

  7. php时间戳与时间转换

    PHP时间大的来分有两种,一是时间戳类型(1228348800),二是正常日期格式(2008-12-4) 所以存到数据库也有两种形式了(真正不止,我的应用就两种),时间戳类型我是保存为字符串的,这个是 ...

  8. VNC配置连接远程服务器桌面-linux\windows

    一.VNC配置连接远程服务器桌面 1.服务器安装VNC-server # yum -y install vnc-server 2.配置VNC连接登陆密码 # vncpasswd 回车 3.配置VNC- ...

  9. 网站UV,与IP、PV

    什么是网站UV,与IP.PV在概念上的区别? UV(独立访客):即Unique Visitor,访问您网站的一台电脑客户端为一个访客.00:00-24:00内相同的客户端只被计算一次. PV(访问量) ...

  10. MapDB:专为Java设计的高性能的数据库

    MapDB是一个快速.易用的嵌入式Java数据库引擎,它提供了基于磁盘或者堆外(off-heap允许Java直接操作内存空间, 类似于C的malloc和free)存储的并发的Maps.Sets.Que ...