怎么验证公钥和私钥是一对

这篇具有很好参考价值的文章主要介绍了怎么验证公钥和私钥是一对。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

公钥和私钥都是一串字符,长得也没有什么关联性,那么当拿到一个公钥和一个私钥后怎么验证它们两个是一对呢?先说说为什么会有这个疑问,最近在对接一些SDK时经常需要做签名和验证签名的工作,双方要相互提供公钥来完成后续的身份验证,测试过程中生成了多个密钥对,当时就在想如果我用错了怎样才能发现呢?有没有什么方法可以验证公钥和私钥是一对呢?再寻找方法的过程中发现 ssh-keygenopenssl 生成的密钥对差别居然这么大,但后来又发现他们居然还有联系,所以本文将刚刚提到的问题都总结一下,方便日后查阅。

解决这个问题的思路我么可以从密钥使用的方式入手,私钥加密公钥解密可以验证身份,公钥加密私钥解密可以秘密传递数据,也就是说公钥和私钥是配合工作的,如果我们用私钥加密一个数据,公钥可以解开就说明他们两个是一对的的。

其实还有一个更简单的办法,公钥是可以从私钥中提取出来的,反之则不行。在公钥密码学中,私钥和公钥之间的关系是一种数学上的单向函数。这种函数的特性使得从私钥生成公钥是可行的,而从公钥还原私钥是非常困难的,这被称为一个单向函数或单向映射,因此被认为是安全的。

有了这个前提我们就可以这样做,从私钥中提取出公钥,然后和要比对的公钥进行比较,如果一致就说明原来的公钥和私钥是一对啦。

ssh-keygen 和 openssl

ssh-keygenopenssl 是两个不同的工具,它们分别用于生成和处理不同类型的密钥和证书。以下是它们的一些主要区别:

  1. 功能和用途:

    • ssh-keygen:主要用于生成和管理SSH密钥对,包括RSA、DSA、ECDSA和Ed25519密钥。
    • openssl:是一个通用的密码学工具,可以用于生成和管理多种密码学对象,包括SSL/TLS证书、密钥、摘要和数字签名等。
  2. 支持的算法:

    • ssh-keygen:专注于SSH密钥生成,支持多种SSH密钥算法。
    • openssl:支持广泛的密码学算法,包括RSA、DSA、ECDSA、Diffie-Hellman、AES、SHA等,用于生成和操作各种密码学对象。
  3. 密钥格式:

    • ssh-keygen:生成的SSH密钥通常以OpenSSH格式存储。
    • openssl:支持多种密钥格式,例如PEM、DER等,可以处理不同类型的密钥和证书。
  4. 具体应用场景:

    • ssh-keygen:主要用于SSH连接,生成用于身份验证的密钥对。
    • openssl:更广泛地用于TLS/SSL证书、数字签名、加密和其他与通用密码学相关的应用。
  5. 具体命令和用法:

    • ssh-keygen:用于生成SSH密钥对的常见命令包括:
      ssh-keygen -t rsa -b 2048 -f myid_rsa
      
    • openssl:用于生成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 demo@demo-ThinkPad-X390
The key's randomart image is:
+---[RSA 2048]----+
|         +o =*   |
|          =.= . .|
|           B = + |
|       o  . o.=.+|
|      . S ...=.BE|
|       o.o .+ + B|
|        Bo.  . .*|
|       o *o    +.|
|        .o=o     |
+----[SHA256]-----+
# demo @ demo-ThinkPad-X390 in ~/tmp/rsa [19:22:03]
$ cat myid_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn
NhAAAAAwEAAQAAAQEAr7gEjCdhA4at0tx0efpLunEOEGvK3ejJCh/dBwLfsvVJelwTeJjK
zI2nFvYGkJgndhWLuvwy6+ODnvASeNvXSvZZzXvvXjTF4JP3TRbATayFvS9mZgzOnxh/rU
z4P7ecLBfqZZkem+VBrMlv37yaIWf7co59dtrJJuAfZJFXyW//LQhNoEaqbZ/gvZls5pOX
r2foMnYg2HV0ayPlvz8cmVF8LIOqaGOc28nMQakVwO+nZhbSv1bGprIGcy4czc7UOp/m+o
t6mWJflpq3NBGiImyfaT2kxp1+pIdd6ISqoZqa9C2JzH7ZXVGjevbHuqup871yjUGapxDx
lDk9HjdSLwAAA9AlxLUDJcS1AwAAAAdzc2gtcnNhAAABAQCvuASMJ2EDhq3S3HR5+ku6cQ
4Qa8rd6MkKH90HAt+y9Ul6XBN4mMrMjacW9gaQmCd2FYu6/DLr44Oe8BJ429dK9lnNe+9e
NMXgk/dNFsBNrIW9L2ZmDM6fGH+tTPg/t5wsF+plmR6b5UGsyW/fvJohZ/tyjn122skm4B
9kkVfJb/8tCE2gRqptn+C9mWzmk5evZ+gydiDYdXRrI+W/PxyZUXwsg6poY5zbycxBqRXA
76dmFtK/VsamsgZzLhzNztQ6n+b6i3qZYl+Wmrc0EaIibJ9pPaTGnX6kh13ohKqhmpr0LY
nMftldUaN69se6q6nzvXKNQZqnEPGUOT0eN1IvAAAAAwEAAQAAAP8nH9HjYuE258XMLUnB
3vj9ii6XeWiyACLDHlUYOouUTQkPNXEgaOS+psuNUTok97vRjvqNp5mu6/liahGy10AYcM
GN/wpM73MfjdKCV455vPAKL4OdNTzML6g97eVYSol7R9foxy8JhwIYdsFyD4xB4+UYnKFS
1WP0Q/K5caMaNnazPF0X7JDSenEwBwl1bDAN5OKwZNzSzUpR/96fl1DAgnG9yp1/634WGt
IfjXLm13OSMrSHfwazNHoqAPkD0SQVJrm38ppvqArU0tBVfh/kvBkv7CCAE9mzhxusiKju
B0c/jrsRDu45AJX5wuqIWcZdfppATJjK10S20MgN5dkAAACBALYym7mpDVQJ2gedSjv/Pv
a+O/5b/20jawc3RFZdJAUWSGJTe9UqyHBHPlYj3/bHJVWIQ9S7s5AxpBtAEOsjeQf0VGFa
FALQwcUghx5r1uM5sAL06CT/5t3Ze8lcJozNW7yjbVZKjJK13GTDMrnPYTfPOc+I/6N3R+
SV2iKOwUQPAAAAgQDp9/2WvHOX2GKXan2BvMaexj6GYIQa8xEsqhtQGY9zxQ2d+9Z7YgDf
XnNanxv8XJ61komeP9KmhS+2TCt0trj8sXtQobDsDGjFcDx0jjBobU6zKvO4htoZP3lb8w
ZARgQoEANxqNOo8R61CsDQW4eM0ReAitKZ0GCcXbqNYCRTGwAAAIEAwEPdhAH4iH6V7IJn
Qs3pgf9AG9UubDe9mAwVNIircWTFO2EFaBpwP7UKgpNmmZjoD2lWEcr2Zxv6x8ILBlJqea
vCpGfLo0hwt2XZHgLRsTx8RmsbmYI2l8qnkMWyz5Lh3XAhNMZM4s9OvSJM6JPWYcedG5KY
G1/zbarjwkq+Gn0AAAAVc2h6QHNoei1UaGlua1BhZC1YMzkwAQIDBAUG
-----END OPENSSH PRIVATE KEY-----
# demo @ demo-ThinkPad-X390 in ~/tmp/rsa [19:22:10]
$ cat myid_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCvuASMJ2EDhq3S3HR5+ku6cQ4Qa8rd6MkKH90HAt+y9Ul6XBN4mMrMjacW9gaQmCd2FYu6/DLr44Oe8BJ429dK9lnNe+9eNMXgk/dNFsBNrIW9L2ZmDM6fGH+tTPg/t5wsF+plmR6b5UGsyW/fvJohZ/tyjn122skm4B9kkVfJb/8tCE2gRqptn+C9mWzmk5evZ+gydiDYdXRrI+W/PxyZUXwsg6poY5zbycxBqRXA76dmFtK/VsamsgZzLhzNztQ6n+b6i3qZYl+Wmrc0EaIibJ9pPaTGnX6kh13ohKqhmpr0LYnMftldUaN69se6q6nzvXKNQZqnEPGUOT0eN1Iv demo@demo-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
xk7Ujdvj7efUjbLhzAcbfHNRZqzqif1rlTS4jz+tIDZBX9/HJkDcoz1dIolp/53S
CJtz+qBrkHMzsi6dcqd5jXUfT3Ts/FMTVsAKIkwafnw2Gbi2DGQx8WQ8Sn5+LlUP
FSCJa+2MTc21taiMP7CtF7iG6jFeGna3xeRTWAjMMS2xk9Zk37KMz8weU4ShdQ9q
mX7yuKHuZzUiWHmjbW/bi6abur3dfi/1jRSnFQF+r/gJoH1UXT4st/+fW425nWqO
ohSV+xw61a09fjECfjVDkMXtwiPCbbGNjD8WjLbilOJK3uBx5e7GIN1jZjVBqlH9
NqEk12HVAgMBAAECggEAIlcf8DwRGDDB+psGnaN5yMbA0lo+4y5Yz/sWg+pgHciK
TeMkHMN0TUzzAS5MVgFdfCachONFJpckm1sy3OynrTANPnkZ8CEuQPRj+UGIloaA
nATTVXPQV5pEbf+4yrHZlXIYs8JjifDAYFLGIhIEsce1QTVPYT3lDGPsLWM36ED6
XVnvJYsr00wpLlYy4uWikt4Q8ruKDnWSS8xeE7pj0bBaqYd8Gz4jfrJ94IgNIROQ
xnXb8aMG/o441ImrF6YXKn8jR/gjZXT1L4ZsD7fGTvLKBxxImBXL2eIoZ8usmTtX
eLEfYaJlzyXOcnYKKVtMQxRI+4ANJWWnMDgM8NTBTQKBgQD0hboW//hXGVcng3Pu
NfD7hUPHQKWWUHbchjRfxvxy/4itqGaWHtUrmc4PTXUxW71YaVA6qm2gvfV+jn83
o5k009vVbXYVvztNQq9wC0Fj2OYwQkxHMgAY9JdhZr6ghuEZ0+hNd5Jea9K3w62C
cY0mHqlvo55szhWmhuvzFtSUXwKBgQDudTFUjf7+qPsfYEX14udsKtfowrjepFLf
nQAbxj16PxpRBSV7S77gdlW1shKEreIPbm083bhU3ypCRs7ktR0Wki/uoQGYekHr
b8Nljh+rM9DxY83+HfLHAC/RjP8ZFrWJFgo6Whfr3jhlb8j3a4siLvqMj0d35BRv
M+HtsEhWSwKBgQC7M746aZG5LP9akvsofkeWaHpxi366S7QUNPLX+MHBUP1U5j5T
5BsTnFbzxDtapH+btlTj9SKlE4llcLbY4/khRqlhBsKG97bw+YLS5usTBDWG8Nrx
DsigUnGq8jwzLdAcM+3/kPGQNEBIzBiEa2bCrmrNu5hIeKZ+rYDqxKnPRQKBgQCh
MZuNOwfbAkPvq9bfJuml1zho4eiyqIZVHv6Jx/KbBrk1d7Mkq8l2VsgNsTiPdDPS
lqVFdeQ7izg34UHOnRfywBOizjgT6OFS1BRUPETwKHDgHMWNOJV7LIcmspdnUFCb
QMjdNTXifi/FclF537sH+pXoGpsHUqj1my7ozDe6DQKBgQDY9tJvXx5DRPVH2t60
0rl1df3PogoAhwjvK+Q/Y5vLyrL470JxMNPtW546aWXRL6INTg+OvsUqLJXEMlxl
HdHIe16orIGBrGcqHNGfkQPfddJVOo0eQCCk4jaLL9EP7+euA83vp6cP38rqgsL7
0+gt34iMPCP9dEKaJyjZPv+vFQ==
-----END PRIVATE KEY-----
# demo @ demo-ThinkPad-X390 in ~/tmp/rsa [19:26:21]
$ cat public-key.pem
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA48RDPcqci29H08ZO1I3b
4+3n1I2y4cwHG3xzUWas6on9a5U0uI8/rSA2QV/fxyZA3KM9XSKJaf+d0gibc/qg
a5BzM7IunXKneY11H0907PxTE1bACiJMGn58Nhm4tgxkMfFkPEp+fi5VDxUgiWvt
jE3NtbWojD+wrRe4huoxXhp2t8XkU1gIzDEtsZPWZN+yjM/MHlOEoXUPapl+8rih
7mc1Ilh5o21v24umm7q93X4v9Y0UpxUBfq/4CaB9VF0+LLf/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-keygenopenssl两个命令及生成的密钥区别,现在讲讲两种密钥的联系,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-keygenopenssl 是两个不同的工具,前者用于管理SSH密钥更具体,后者使用范围更广更灵活

==>> 反爬链接,请勿点击,原地爆炸,概不负责!<<==

事情一件件去办就好了,『没什么大不了的』,希望你长大后还可以经常乐观的说这句话,一副俾睨天下的姿态文章来源地址https://www.toymoban.com/news/detail-759284.html

到了这里,关于怎么验证公钥和私钥是一对的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用RSA生成公钥和私钥

    可以用keytool工具直接生成,需要openssl工具Binaries - OpenSSLWiki设置到环境变量里 生成的authkey放到gateway下,生成的auth.jks放到auth认证服务下 网关结合鉴权,需要配置如下配置文件                 认证服务配置Bean 接口AuthToolController RSAUtil 依赖 访问localhost:6080/generate/do

    2024年02月12日
    浏览(35)
  • 【Android】查看keystore的公钥和私钥

            查看前准备好.keystore文件,安装并配置openssl、keytool。文件路径中不要有中文。 1.从keystore中获取MD5证书 2.导出公钥文件   输入完成后回车,会提示输入一次密码,输入密码后回车,就能生成cer文件了。 3.转换成pem证书 4.查看公钥 输入指令,回车后输入密码,再回

    2024年01月24日
    浏览(37)
  • 区块链知识习题测试:公钥和私钥、公有链、元宇宙

    1、比特币水龙头是什么? • A、是一个水龙头的品牌名称 • B、是一个民间组织 • C、是一个网站 • D、是一个黑客的代号 正确答案:C 答案解析:在刚诞生那几年,比特币很2113便宜,并5261且非常容易获得。2010年年底,为了让更4102多人知道并尝试使用比特1653币,程序员加

    2024年02月05日
    浏览(30)
  • jdk 中的 keytool 的使用,以及提取 jks 文件中的公钥和私钥

    这里暂时只需要知道如何使用就可以了。 首先是生成一个密钥, 解释一下这里的选项, -alias 密钥对的名称 -keypass 密钥密码 -validity 有效期,这里是以天为单位 -storepass 存储库的密码 -keystore 指定生成的密钥文件存放的位置,这里的  fanyfull.jks  表示的是当前目录下的  fan

    2024年02月08日
    浏览(44)
  • C语言实现:从sm2 PEM文件中提取公钥和私钥因子

    快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】: 密码学实践强化训练–【目录】 👈👈👈 我们知道使用openssl命令行从国密sm2的pem中提公钥私钥因子的命令行如下: openssl ec -in sm2_test_priv.pem -text -noout 从私钥pem提取私钥 openssl

    2024年02月11日
    浏览(33)
  • RSA双向加解密(公钥加密-私钥解密;私钥加密-公钥解密)

            非对称加密算法中,提供一个公钥一个私钥。一般情况下,采用公钥加密、私钥解密的方式。         假设有这样一个场景:服务A与服务B需要通信,通信内容为了安全需要进行加密传输,并且服务A与服务B不能互相持有对方的钥匙。         我首先想到的是

    2024年02月11日
    浏览(42)
  • WebAPi接口安全之公钥私钥加密

    随着各种设备的兴起,WebApi作为服务也越来越流行。而在无任何保护措施的情况下接口完全暴露在外面,将导致被恶意请求。最近项目的项目中由于提供给APP的接口未对接口进行时间防范导致短信接口被怒对造成一定的损失,临时的措施导致PC和app的防止措施不一样导致后来

    2024年02月04日
    浏览(36)
  • 私钥和公钥到底是谁来加密、谁来解密?

    1.  应用场景 场景1(第一种用法):用于信息加解密,此时使用公钥加密,私钥解密。 场景2(第二种用法):用于数字签名,此时使用私钥签名,公钥验签。 有点混乱,不要去硬记,你只要这样想即可: - 既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解

    2023年04月15日
    浏览(57)
  • 国密sm2公钥加密 私钥解密java代码实现

    目录 一、引入jar包 二、生成秘钥对,加解密工具类

    2024年02月11日
    浏览(46)
  • C#.NET Framework RSA 公钥加密 私钥解密 ver:20230609

    C#.NET Framework RSA 公钥加密 私钥解密 ver:20230609   环境说明: .NET Framework 4.6 的控制台程序 。   .NET Framework 对于RSA的支持: 1. .NET Framework 内置只支持XML格式的私钥/公钥。如果要用PKCS1,PKCS8格式的,要用到三方库BouncyCastle。 2. .NET 中默认加密算法为“RSA/ECB/PKCS1Padding” ,要和

    2024年02月08日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包