首页 > 其他分享 >OpenSSL 介绍(4)--非对称加密

OpenSSL 介绍(4)--非对称加密

时间:2023-02-26 10:23:23浏览次数:43  
标签:私钥 file -- OpenSSL openssl 密钥 key test 非对称

本文主要介绍如何使用 OpenSSL 来进行非对称加解密,使用的算法为 RSA,DSA 算法的使用方法类似;文中所使用到的软件版本:OpenSSL 1.1.1s、CentOS 7.9.2009。

1、非对称加密算法

非对称加密算法需要两个密钥:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。 非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将公钥公开,需要向甲方发送信息的其他角色(乙方)使用该密钥(甲方的公钥)对机密信息进行加密后再发送给甲方;甲方再用自己私钥对加密后的信息进行解密。甲方想要回复乙方时正好相反,使用乙方的公钥对数据进行加密,同理,乙方使用自己的私钥来进行解密。

另一方面,甲方可以使用自己的私钥对机密信息进行签名后再发送给乙方;乙方再用甲方的公钥对甲方发送回来的数据进行验签。

甲方只能用其私钥解密由其公钥加密后的任何信息。 非对称加密算法的保密性比较好,它消除了最终用户交换密钥的需要。

非对称密码体制的特点:算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快。对称密码体制中只有一种密钥,并且是非公开的,如果要解密就得让对方知道密钥。所以保证其安全性就是保证密钥的安全,而非对称密钥体制有两种密钥,其中一个是公开的,这样就可以不需要像对称密码那样传输对方的密钥了。这样安全性就大了很多。

非对称加密算法主要有:RSA、DSA、DH(Diffie-Hellman密钥交换算法) 和 ECC(椭圆曲线加密算法)。

2、用法

2.1、生成 RSA 私钥

通过 openssl genrsa -help 命令查看用法:

shell> /home/mongo/soft/openssl-1.1.1s/bin/openssl genrsa -help
Usage: genrsa [options]
Valid options are:
 -help               Display this summary
 -3                  Use 3 for the E value
 -F4                 Use F4 (0x10001) for the E value
 -f4                 Use F4 (0x10001) for the E value
 -out outfile        Output the key to specified file
 -rand val           Load the file(s) into the random number generator
 -writerand outfile  Write random data to the specified file
 -passout val        Output file pass phrase source
 -*                  Encrypt the output with any supported cipher
 -engine val         Use engine, possibly a hardware device
 -primes +int        Specify number of primes

参数说明:

参数 说明
-out outfile 指定私钥输出文件
-* 指定对私钥进行加密的对称加密算法

2.2、RSA 密钥操作

OpenSSL 中可以通过 openssl rsa 命令进行密钥的相关操作,包括从公钥提取私钥;通过 openssl rsa -help 命令查看用法:

shell> /home/mongo/soft/openssl-1.1.1s/bin/openssl rsa -help
Usage: rsa [options]
Valid options are:
 -help              Display this summary
 -inform format     Input format, one of DER PEM
 -outform format    Output format, one of DER PEM PVK
 -in val            Input file
 -out outfile       Output file
 -pubin             Expect a public key in input file
 -pubout            Output a public key
 -passout val       Output file pass phrase source
 -passin val        Input file pass phrase source
 -RSAPublicKey_in   Input is an RSAPublicKey
 -RSAPublicKey_out  Output is an RSAPublicKey
 -noout             Don't print key out
 -text              Print the key in text
 -modulus           Print the RSA key modulus
 -check             Verify key consistency
 -*                 Any supported cipher
 -pvk-strong        Enable 'Strong' PVK encoding level (default)
 -pvk-weak          Enable 'Weak' PVK encoding level
 -pvk-none          Don't enforce PVK encoding
 -engine val        Use engine, possibly a hardware device

参数说明:

参数 说明
-inform format 指定输入格式:DER,PEM
-outform format 指定输出格式:DER,PEM,PVK
-in val 指定密钥输入文件
-out outfile 指定密钥输出文件
-pubout 输出公钥
-noout 不输出私钥信息
-text 以文本格式打印私钥信息
-* 对私钥进行加密的对称加密算法

2.3、RSA 加解操作

通过 openssl genrsa -help 命令查看用法:

shell> /home/mongo/soft/openssl-1.1.1s/bin/openssl rsautl -help
Usage: rsautl [options]
Valid options are:
 -help                    Display this summary
 -in infile               Input file
 -out outfile             Output file
 -inkey val               Input key
 -keyform PEM|DER|ENGINE  Private key format - default PEM
 -pubin                   Input is an RSA public
 -certin                  Input is a cert carrying an RSA public key
 -ssl                     Use SSL v2 padding
 -raw                     Use no padding
 -pkcs                    Use PKCS#1 v1.5 padding (default)
 -oaep                    Use PKCS#1 OAEP
 -sign                    Sign with private key
 -verify                  Verify with public key
 -asn1parse               Run output through asn1parse; useful with -verify
 -hexdump                 Hex dump output
 -x931                    Use ANSI X9.31 padding
 -rev                     Reverse the order of the input buffer
 -encrypt                 Encrypt with public key
 -decrypt                 Decrypt with private key
 -passin val              Input file pass phrase source
 -rand val                Load the file(s) into the random number generator
 -writerand outfile       Write random data to the specified file
 -engine val              Use engine, possibly a hardware device

参数说明:

参数 说明
-in infile 指定待加解密的文件
-out outfile 指定输出文件
-inkey val 指定密钥输入文件
-pubin 输入密钥为公钥
-encrypt 使用公钥加密
-decrypt 使用私钥解密

3、具体使用

3.1、生成私钥

shell> /home/mongo/soft/openssl-1.1.1s/bin/openssl genrsa -out test.key 2048

生成一个 2048 位的私钥并保存到 test.key 文件中,文件内容如下:

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAwyPpByJekg7LbQge8qORTPl72llYxlpMvXqCGO7VN2xuOdxw
zXTQ9/B/3MOTmS7rOVU0IpcYTt6C0SMTzoKjRCR1FdM81YFecL8litilC85GIktp
dWralQawIvMkZ4pv3sGth4PHiYqsTMlx984/TDOFXQ5vgT9VceXJ3KXZ8mVzyptw
egIRN/OzBjY9KgrbIf7qgyuzjX1zXQMqgBl9LmUdWaETBYfDfSzuxBooeOYRXTYz
vqm7GJzmnWGBskc3pytai1G7TopRNjuWBroIQqP11nUPyMVpGJ5U5WYGZg95rqw6
zsNaAmauN6xqiEmvCENdvAixW6j8P36h0MIfNwIDAQABAoIBAFlsC00Jouyreuzr
28K00dDEQs08REIg/ymVCikCyRIszhYVvltoPJphyzYPKYP4zDHpqYpwUuNRdAEC
YgEwPEDts/ncYvQz5GMmNL37qSZP0DPG+vyjiqbf+bcKVJReDAW4Gx0OdlHBClPl
vCQijz8MHQEXrGE99JnNA0PpfIZmyLvbq3mj+npDvMWq3aDPy0swdbjMUDJnCdUJ
3X/RajtPgZYSQuJDflfh6GbYk6fUSMP+FDF+SbH7MwNZe86A92poSFc8HzaGPwwU
66UmFYr6EXAMKZ816IpYNIRhgLPKPLJ/3PboES0D8PuB+VUfAvxCEelC4UJCs6k5
gHuPs4ECgYEA/am2cOhOBJyWCpmeFRTCQDp9aJbwwTpUtPKesnmFcLXgkqTqWH90
YCY8OC9ola5kJXH1nPFRy3s3u/eXyvJbRZVmhTrTBXWt5fwcGfCAnT2P2HlJBXka
fZhSaLNcSOurDFrz/8AOLLhLMv2XiS3kwjNcUm3EPL6115oTR8pRABMCgYEAxPAq
oUemPS0LFVFjWKyPSYYGV21fSRQWFzzOsX+zMiRIjsAATT0Nynz9h/96HEQ78xOz
foda+kAzV6sAI8q5S5RLbLWFM7XmMPg2vb1ryliNHwz/FhR6tX1KKMfggffGn0XW
YIGjyWkGFeU5HkILy3T6kC/yzk/+RschnpXIsM0CgYA4b6rkofrBsej8AMOYIx84
1QqT24lDJGw2Ogiu4rSaqAyH8+Mjv2+v+LHLOlkFfGBRqHIh8drl78stqd9+yr8d
0yiVGcpbW5xOH/JMnyKuWUUIv6tMaW5IZTxoiQdOPgi3XgENdLhyoKoydRNi9PAB
eRXgTQWtEi05A9GoVk4BOwKBgQClBCCUVzcCV7XLvRCjgqPllXnG1AxdbYk9G2SN
8lSylRh/FH6sOZZOrwC5beZhvQMGoOFsCfq/agAbW1uYogs1OyMgCdF9DNO/AJzN
y+R//kbxV7B+TdasMDlthl2mSXmSh7Aj2TzmTSweOJ3trqW3a2NwYdzv5rNHlx+i
hBtPmQKBgQCbFZQs2DSyULaoh9HJTh+xsU9MZkoTD8J0JAR026IjcltgFHGXI7QH
CtHttO6POMYK+krOcsc5JPfiB6yfDjWnCqQ+bw/kMH5C/2CuhYC4aZRdmJJ4d0ds
r0BsH5zhRzPRP2OyMuOUNK+YLwfHfTv2yEJM5KBPguKyfHrr4SjHfw==
-----END RSA PRIVATE KEY-----

3.2、打印私钥

/home/mongo/soft/openssl-1.1.1s/bin/openssl rsa -in test.key -noout -text

3.3、根据私钥生成公钥

shell> /home/mongo/soft/openssl-1.1.1s/bin/openssl rsa -in test.key -pubout -out test.pem

生成的公钥保存到 test.pem 文件中,文件内容如下:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwyPpByJekg7LbQge8qOR
TPl72llYxlpMvXqCGO7VN2xuOdxwzXTQ9/B/3MOTmS7rOVU0IpcYTt6C0SMTzoKj
RCR1FdM81YFecL8litilC85GIktpdWralQawIvMkZ4pv3sGth4PHiYqsTMlx984/
TDOFXQ5vgT9VceXJ3KXZ8mVzyptwegIRN/OzBjY9KgrbIf7qgyuzjX1zXQMqgBl9
LmUdWaETBYfDfSzuxBooeOYRXTYzvqm7GJzmnWGBskc3pytai1G7TopRNjuWBroI
QqP11nUPyMVpGJ5U5WYGZg95rqw6zsNaAmauN6xqiEmvCENdvAixW6j8P36h0MIf
NwIDAQAB
-----END PUBLIC KEY-----

3.4、使用公钥加密

A、通过管道符指定输入

echo -n 123456 | /home/mongo/soft/openssl-1.1.1s/bin/openssl rsautl -encrypt -inkey test.pem -pubin -out test.encrypt

使用公钥加密 "123456",结果保存到 test.encrypt 文件中。

B、输入为文件

新建文件 a.txt,在文件中输入内容:

123456

使用 a.txt 作为输入:

/home/mongo/soft/openssl-1.1.1s/bin/openssl rsautl -encrypt -inkey test.pem -pubin -in a.txt -out test.encrypt

 

注:标准输入(结束方法:先输入回车,然后输入 ctrl+D)会把换行符也带入计算;使用文件输入时,也会在文件内容最后增加换行作为 OpenSSL 的计算输入;这会导致加密的结果用其他加密工具(如:Java)解密后会多出一个换行,所以使用 echo -n 来去除换行。

3.5、使用私钥解密

/home/mongo/soft/openssl-1.1.1s/bin/openssl rsautl -decrypt -inkey test.key -in test.encrypt

3.5、私钥转为 PKCS8 格式

OpenSSL 生成的私钥默认为 PKCS1 格式,如果需要使用 Java 来加解密,则需要转成 PKCS8 格式;使用 openssl pkcs8 命令来进行转换:

/home/mongo/soft/openssl-1.1.1s/bin/openssl pkcs8 -topk8 -in test.key -nocrypt -out test_pkcs8.key

转换后的结果保存到 test_pkcs8.key 中。

 

标签:私钥,file,--,OpenSSL,openssl,密钥,key,test,非对称
From: https://www.cnblogs.com/wuyongyin/p/17036104.html

相关文章

  • 密码常识测试
    对以下观点进行评论,分别论述你认为这个观点是正确还是错误的(1分)?为什么(2分)?你的参考资料或判断的信息来源是什么?(2分)很多企业和技术人文都有下面这样的想法∶由公司或自己开......
  • strcmp 和 level4 write up
    作业题两题strcmpida打开找到主函数如果答案这么简单就好了尝试在start函数找线索,发现其中的init函数非常可疑该函数访问了地址off_200DF0到funcs_889于是查看了o......
  • CDC设计实例-02
    CDC设计实例加速器假设要处理一项业务比如图像处理,有两种方向,第一种选择一些通用的处理器CPU\GPU\DSP等通用的处理器,第二种是将算法映射成IP,直接使用IP进行处理图像处理......
  • Android Studio LinearLayout & RelativeLayout
    1、LinearLayout线性布局主要分为两部分内容第一部分是进行线性布局的方向设置即水平方向和竖直方向用orientation属性值进行设置当它为horizontal的时候表示水平方......
  • DevOps是什么?DevOps能够给我们带来什么?
    一、DevOps是什么?DevOps是Development和Operations的组合词。它是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟......
  • maven一键构建概念与maven的安装
    maven一键构建概念1.项目的一键构建我们的项目,往往都要经历编译、测试、运行、打包、安装,部署等一系列过程。什么是构建?......
  • 字体3
    <html> <head> <title>字体</title> <str/> </head> <style> .newh1{ font-size:36px; font-family:"楷体"; { .newh3{ font-size:14px; font-fa......
  • 图像处理
    图像处理(ImageProcess)对输入的图像作某种变换,输出仍然是图像,不涉及或者很少涉及图像内容的分析。例如:图像增强、图像去噪、图像压缩、图像恢复、二值图像处理,以及基于阈......
  • HTML
    <!dortypehtml><html><head><title>字体</title></head><body><style>.fonth1{font-family:"草书";}.fonth3{ font-family:"甲骨文";}.fontp{......
  • span&不同字体
    <html> <style> .p1{ color:red; font-size:28px; } .p2{ font-weight:bold; } .p3{ font-style:italic; } </style> <body> <h2>那些人,那些事</......