做网站 网上接单,汽车网站开发流程,建设我们的网站 教案,贵州省建设网站文章目录 前言ssh-keygen 和 openssl两种证书的内容对比 从私钥提取公钥OPENSSH和PEM两种密钥格式相互转化OpenSSH 格式私钥转换成 OpenSSL PEM 格式私钥OpenSSL PEM 格式私钥转换成 OpenSSH 格式私钥OpenSSH 格式公钥生成 OpenSSL PEM 格式公钥OpenSSL PEM 格式公钥生成 OpenS… 文章目录 前言ssh-keygen 和 openssl两种证书的内容对比 从私钥提取公钥OPENSSH和PEM两种密钥格式相互转化OpenSSH 格式私钥转换成 OpenSSL PEM 格式私钥OpenSSL PEM 格式私钥转换成 OpenSSH 格式私钥OpenSSH 格式公钥生成 OpenSSL PEM 格式公钥OpenSSL PEM 格式公钥生成 OpenSSH 格式公钥 公钥和私钥的匹配使用加密和解密签名和验证 总结 前言
公钥和私钥都是一串字符长得也没有什么关联性那么当拿到一个公钥和一个私钥后怎么验证它们两个是一对呢先说说为什么会有这个疑问最近在对接一些SDK时经常需要做签名和验证签名的工作双方要相互提供公钥来完成后续的身份验证测试过程中生成了多个密钥对当时就在想如果我用错了怎样才能发现呢有没有什么方法可以验证公钥和私钥是一对呢再寻找方法的过程中发现 ssh-keygen 和 openssl 生成的密钥对差别居然这么大但后来又发现他们居然还有联系所以本文将刚刚提到的问题都总结一下方便日后查阅。 解决这个问题的思路我么可以从密钥使用的方式入手私钥加密公钥解密可以验证身份公钥加密私钥解密可以秘密传递数据也就是说公钥和私钥是配合工作的如果我们用私钥加密一个数据公钥可以解开就说明他们两个是一对的的。
其实还有一个更简单的办法公钥是可以从私钥中提取出来的反之则不行。在公钥密码学中私钥和公钥之间的关系是一种数学上的单向函数。这种函数的特性使得从私钥生成公钥是可行的而从公钥还原私钥是非常困难的这被称为一个单向函数或单向映射因此被认为是安全的。
有了这个前提我们就可以这样做从私钥中提取出公钥然后和要比对的公钥进行比较如果一致就说明原来的公钥和私钥是一对啦。
ssh-keygen 和 openssl
ssh-keygen 和 openssl 是两个不同的工具它们分别用于生成和处理不同类型的密钥和证书。以下是它们的一些主要区别 功能和用途 ssh-keygen主要用于生成和管理SSH密钥对包括RSA、DSA、ECDSA和Ed25519密钥。openssl是一个通用的密码学工具可以用于生成和管理多种密码学对象包括SSL/TLS证书、密钥、摘要和数字签名等。 支持的算法 ssh-keygen专注于SSH密钥生成支持多种SSH密钥算法。openssl支持广泛的密码学算法包括RSA、DSA、ECDSA、Diffie-Hellman、AES、SHA等用于生成和操作各种密码学对象。 密钥格式 ssh-keygen生成的SSH密钥通常以OpenSSH格式存储。openssl支持多种密钥格式例如PEM、DER等可以处理不同类型的密钥和证书。 具体应用场景 ssh-keygen主要用于SSH连接生成用于身份验证的密钥对。openssl更广泛地用于TLS/SSL证书、数字签名、加密和其他与通用密码学相关的应用。 具体命令和用法 ssh-keygen用于生成SSH密钥对的常见命令包括ssh-keygen -t rsa -b 2048 -f myid_rsaopenssl用于生成RSA密钥对的常见命令包括openssl genpkey -algorithm RSA -out private-key.pem
openssl rsa -pubout -in private-key.pem -out public-key.pem以上的ChatGPT提供的内容还是对比的挺全面的从 openssl 生成密钥对的过程可以看出确实可以从私钥中提取出公钥。
ssh-keygen 是我接触的最多的生成密钥对的命令不管是github还是gitlab或者一些其他的托管平台都会提到SSH Keys所以每次我都会用 ssh-keygen 来生成它是用于生成SSH连接密钥对最直接的选择如果是想要使用更广泛的密码学操作包括证书生成、签名和加密等那么 openssl 提供了更大的灵活性。
两种证书的内容对比
前面说了两种命令生成的证书、格式、算法和用途都有区别我们来看看利用上面的命令生成的证书内容有什么不同先看 ssh-keygen 生成的私钥 myid_rsa 和公钥 myid_rsa.pub
# demo demo-ThinkPad-X390 in ~/tmp/rsa [17:58:47]
$ ssh-keygen -t rsa -b 2048 -f myid_rsa
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in myid_rsa
Your public key has been saved in myid_rsa.pub
The key fingerprint is:
SHA256:eLzG9lryO/AOdd05cDkixvBNCPFZRLRu0wp3bxZ7Vnk demodemo-ThinkPad-X390
The keys randomart image is:
---[RSA 2048]----
| o * |
| . . .|
| B |
| o . o..|
| . S ....BE|
| o.o . B|
| Bo. . .*|
| o *o .|
| .oo |
----[SHA256]-----# demo demo-ThinkPad-X390 in ~/tmp/rsa [19:22:03]
$ cat myid_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn
NhAAAAAwEAAQAAAQEAr7gEjCdhA4at0tx0efpLunEOEGvK3ejJCh/dBwLfsvVJelwTeJjK
zI2nFvYGkJgndhWLuvwy6ODnvASeNvXSvZZzXvvXjTF4JP3TRbATayFvS9mZgzOnxh/rU
z4P7ecLBfqZZkemVBrMlv37yaIWf7co59dtrJJuAfZJFXyW//LQhNoEaqbZ/gvZls5pOX
r2foMnYg2HV0ayPlvz8cmVF8LIOqaGOc28nMQakVwOnZhbSv1bGprIGcy4czc7UOp/mo
t6mWJflpq3NBGiImyfaT2kxp1pIdd6ISqoZqa9C2JzH7ZXVGjevbHuqup871yjUGapxDx
lDk9HjdSLwAAA9AlxLUDJcS1AwAAAAdzc2gtcnNhAAABAQCvuASMJ2EDhq3S3HR5ku6cQ
4Qa8rd6MkKH90HAty9Ul6XBN4mMrMjacW9gaQmCd2FYu6/DLr44Oe8BJ429dK9lnNe9e
NMXgk/dNFsBNrIW9L2ZmDM6fGHtTPg/t5wsFplmR6b5UGsyW/fvJohZ/tyjn122skm4B
9kkVfJb/8tCE2gRqptnC9mWzmk5evZgydiDYdXRrIW/PxyZUXwsg6poY5zbycxBqRXA
76dmFtK/VsamsgZzLhzNztQ6nb6i3qZYlWmrc0EaIibJ9pPaTGnX6kh13ohKqhmpr0LY
nMftldUaN69se6q6nzvXKNQZqnEPGUOT0eN1IvAAAAAwEAAQAAAP8nH9HjYuE258XMLUnB
3vj9ii6XeWiyACLDHlUYOouUTQkPNXEgaOSpsuNUTok97vRjvqNp5mu6/liahGy10AYcM
GN/wpM73MfjdKCV455vPAKL4OdNTzML6g97eVYSol7R9foxy8JhwIYdsFyD4xB4UYnKFS
1WP0Q/K5caMaNnazPF0X7JDSenEwBwl1bDAN5OKwZNzSzUpR/96fl1DAgnG9yp1/634WGt
IfjXLm13OSMrSHfwazNHoqAPkD0SQVJrm38ppvqArU0tBVfh/kvBkv7CCAE9mzhxusiKju
B0c/jrsRDu45AJX5wuqIWcZdfppATJjK10S20MgN5dkAAACBALYym7mpDVQJ2gedSjv/Pv
aO/5b/20jawc3RFZdJAUWSGJTe9UqyHBHPlYj3/bHJVWIQ9S7s5AxpBtAEOsjeQf0VGFa
FALQwcUghx5r1uM5sAL06CT/5t3Ze8lcJozNW7yjbVZKjJK13GTDMrnPYTfPOcI/6N3R
SV2iKOwUQPAAAAgQDp9/2WvHOX2GKXan2BvMaexj6GYIQa8xEsqhtQGY9zxQ2d9Z7YgDf
XnNanxv8XJ61komeP9KmhS2TCt0trj8sXtQobDsDGjFcDx0jjBobU6zKvO4htoZP3lb8w
ZARgQoEANxqNOo8R61CsDQW4eM0ReAitKZ0GCcXbqNYCRTGwAAAIEAwEPdhAH4iH6V7IJn
Qs3pgf9AG9UubDe9mAwVNIircWTFO2EFaBpwP7UKgpNmmZjoD2lWEcr2Zxv6x8ILBlJqea
vCpGfLo0hwt2XZHgLRsTx8RmsbmYI2l8qnkMWyz5Lh3XAhNMZM4s9OvSJM6JPWYcedG5KY
G1/zbarjwkqGn0AAAAVc2h6QHNoei1UaGlua1BhZC1YMzkwAQIDBAUG
-----END OPENSSH PRIVATE KEY-----# demo demo-ThinkPad-X390 in ~/tmp/rsa [19:22:10]
$ cat myid_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCvuASMJ2EDhq3S3HR5ku6cQ4Qa8rd6MkKH90HAty9Ul6XBN4mMrMjacW9gaQmCd2FYu6/DLr44Oe8BJ429dK9lnNe9eNMXgk/dNFsBNrIW9L2ZmDM6fGHtTPg/t5wsFplmR6b5UGsyW/fvJohZ/tyjn122skm4B9kkVfJb/8tCE2gRqptnC9mWzmk5evZgydiDYdXRrIW/PxyZUXwsg6poY5zbycxBqRXA76dmFtK/VsamsgZzLhzNztQ6nb6i3qZYlWmrc0EaIibJ9pPaTGnX6kh13ohKqhmpr0LYnMftldUaN69se6q6nzvXKNQZqnEPGUOT0eN1Iv demodemo-ThinkPad-X390接着看看 openssl 生成的私钥 private-key.pem 和公钥 public-key.pem
# demo demo-ThinkPad-X390 in ~/tmp/rsa [19:23:01]
$ openssl genpkey -algorithm RSA -out private-key.pem
......................................................................
..................# demo demo-ThinkPad-X390 in ~/tmp/rsa [19:25:04]
$ openssl rsa -pubout -in private-key.pem -out public-key.pem
writing RSA key# demo demo-ThinkPad-X390 in ~/tmp/rsa [19:26:18]
$ cat private-key.pem
-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDjxEM9ypyLb0fT
xk7Ujdvj7efUjbLhzAcbfHNRZqzqif1rlTS4jztIDZBX9/HJkDcoz1dIolp/53S
CJtzqBrkHMzsi6dcqd5jXUfT3Ts/FMTVsAKIkwafnw2Gbi2DGQx8WQ8Sn5LlUP
FSCJa2MTc21taiMP7CtF7iG6jFeGna3xeRTWAjMMS2xk9Zk37KMz8weU4ShdQ9q
mX7yuKHuZzUiWHmjbW/bi6abur3dfi/1jRSnFQFr/gJoH1UXT4st/fW425nWqO
ohSVxw61a09fjECfjVDkMXtwiPCbbGNjD8WjLbilOJK3uBx5e7GIN1jZjVBqlH9
NqEk12HVAgMBAAECggEAIlcf8DwRGDDBpsGnaN5yMbA0lo4y5Yz/sWgpgHciK
TeMkHMN0TUzzAS5MVgFdfCachONFJpckm1sy3OynrTANPnkZ8CEuQPRjUGIloaA
nATTVXPQV5pEbf4yrHZlXIYs8JjifDAYFLGIhIEsce1QTVPYT3lDGPsLWM36ED6
XVnvJYsr00wpLlYy4uWikt4Q8ruKDnWSS8xeE7pj0bBaqYd8Gz4jfrJ94IgNIROQ
xnXb8aMG/o441ImrF6YXKn8jR/gjZXT1L4ZsD7fGTvLKBxxImBXL2eIoZ8usmTtX
eLEfYaJlzyXOcnYKKVtMQxRI4ANJWWnMDgM8NTBTQKBgQD0hboW//hXGVcng3Pu
NfD7hUPHQKWWUHbchjRfxvxy/4itqGaWHtUrmc4PTXUxW71YaVA6qm2gvfVjn83
o5k009vVbXYVvztNQq9wC0Fj2OYwQkxHMgAY9JdhZr6ghuEZ0hNd5Jea9K3w62C
cY0mHqlvo55szhWmhuvzFtSUXwKBgQDudTFUjf7qPsfYEX14udsKtfowrjepFLf
nQAbxj16PxpRBSV7S77gdlW1shKEreIPbm083bhU3ypCRs7ktR0Wki/uoQGYekHr
b8NljhrM9DxY83HfLHAC/RjP8ZFrWJFgo6Whfr3jhlb8j3a4siLvqMj0d35BRv
MHtsEhWSwKBgQC7M746aZG5LP9akvsofkeWaHpxi366S7QUNPLXMHBUP1U5j5T
5BsTnFbzxDtapHbtlTj9SKlE4llcLbY4/khRqlhBsKG97bwYLS5usTBDWG8Nrx
DsigUnGq8jwzLdAcM3/kPGQNEBIzBiEa2bCrmrNu5hIeKZrYDqxKnPRQKBgQCh
MZuNOwfbAkPvq9bfJuml1zho4eiyqIZVHv6Jx/KbBrk1d7Mkq8l2VsgNsTiPdDPS
lqVFdeQ7izg34UHOnRfywBOizjgT6OFS1BRUPETwKHDgHMWNOJV7LIcmspdnUFCb
QMjdNTXifi/FclF537sHpXoGpsHUqj1my7ozDe6DQKBgQDY9tJvXx5DRPVH2t60
0rl1df3PogoAhwjvKQ/Y5vLyrL470JxMNPtW546aWXRL6INTgOvsUqLJXEMlxl
HdHIe16orIGBrGcqHNGfkQPfddJVOo0eQCCk4jaLL9EP7euA83vp6cP38rqgsL7
0gt34iMPCP9dEKaJyjZPvvFQ
-----END PRIVATE KEY-----# demo demo-ThinkPad-X390 in ~/tmp/rsa [19:26:21]
$ cat public-key.pem
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA48RDPcqci29H08ZO1I3b
43n1I2y4cwHG3xzUWas6on9a5U0uI8/rSA2QV/fxyZA3KM9XSKJafd0gibc/qg
a5BzM7IunXKneY11H0907PxTE1bACiJMGn58Nhm4tgxkMfFkPEpfi5VDxUgiWvt
jE3NtbWojDwrRe4huoxXhp2t8XkU1gIzDEtsZPWZNyjM/MHlOEoXUPapl8rih
7mc1Ilh5o21v24umm7q93X4v9Y0UpxUBfq/4CaB9VF0LLf/n1uNuZ1qjqIUlfsc
OtWtPX4xAn41Q5DF7cIjwm2xjYw/Foy24pTiSt7gceXuxiDdY2Y1QapR/TahJNdh
1QIDAQAB
-----END PUBLIC KEY-----从私钥提取公钥
使用 openssl 命令从私钥提取公钥上面已经展示过程了它的公钥就是这样生成的
openssl rsa -pubout -in private-key.pem -out public-key.pem使用 ssh-keygen 命令从私钥提取公钥可以这样做
ssh-keygen -y -f myid_rsa compare_myid_rsa.pub结果文件 compare_myid_rsa.pub 和 myid_rsa.pub 的内容一模一样所以从私钥提取公钥可以作为检验密钥是否匹配的方法
OPENSSH和PEM两种密钥格式相互转化
之前说了ssh-keygen 和 openssl两个命令及生成的密钥区别现在讲讲两种密钥的联系OpenSSH 和 OpenSSL 使用的密钥对虽然有一些格式上的差异但可以相互转换。OpenSSH 使用自己的私钥和公钥格式, 而 OpenSSL 通常使用 PEM 格式可以通过下列命令转化
OpenSSH 格式私钥转换成 OpenSSL PEM 格式私钥
ssh-keygen -p -N -f myid_rsa -m PEM$ file myid_rsa myid_rsa: PEM RSA private key OpenSSL PEM 格式私钥转换成 OpenSSH 格式私钥
ssh-keygen -p -N -f myid_rsa$ file myid_rsa myid_rsa: OpenSSH private key OpenSSH 格式公钥生成 OpenSSL PEM 格式公钥
ssh-keygen -e -m PEM -f myid_rsa.pub new-public-key.pem$ file new-public-key.pem new-public-key.pem: ASCII text OpenSSL PEM 格式公钥生成 OpenSSH 格式公钥
ssh-keygen -i -m PKCS8 -f new-public-key.pem compare_myid_rsa.pub$ file compare_myid_rsa.pub compare_myid_rsa.pub: OpenSSH RSA public key 公钥和私钥的匹配使用
匹配使用公钥和私钥之前先准备一个测试文件
echo Hello World data.txt加密和解密
使用公钥加密
openssl rsautl -in data.txt -out data_enc.txt -inkey public-key.pem -pubin -encrypt使用私钥解密
openssl rsautl -in data_enc.txt -out data_dec.txt -inkey private-key.pem -decrypt两个命令执行后都没有任何控制台输出文件 data_enc.txt 中是加密后的内容文件 data_dec.txt 是解密后的内容成功解密后内容与 data.txt 文件内容一样
签名和验证
使用私钥签名
openssl dgst -sha256 -sign private-key.pem -out signature.bin data.txt使用公钥验证签名
openssl dgst -sha256 -verify public-key.pem -signature signature.bin data.txt验证通过后会在命令行输出 “Verified OK” 字样若不通过则输出 “Verification Failure” 字样
总结
验证公钥私钥是否匹配的最便捷的方法是通过私钥提取公钥来和原公钥进行对比公钥加密私钥解密私钥签名公钥验证签名需要把公钥发给别人私钥自己要保留好公钥和私钥常用的有OpenSSH和PEM两种格式这两种格式的密钥可以相互转化ssh-keygen 和 openssl 是两个不同的工具前者用于管理SSH密钥更具体后者使用范围更广更灵活 反爬链接请勿点击原地爆炸概不负责 事情一件件去办就好了『没什么大不了的』希望你长大后还可以经常乐观的说这句话一副俾睨天下的姿态