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

文章目录

  • 前言
  • ssh-keygen 和 openssl
    • 两种证书的内容对比
  • 从私钥提取公钥
  • OPENSSH和PEM两种密钥格式相互转化
    • OpenSSH 格式私钥转换成 OpenSSL PEM 格式私钥
    • OpenSSL PEM 格式私钥转换成 OpenSSH 格式私钥
    • OpenSSH 格式公钥生成 OpenSSL PEM 格式公钥
    • OpenSSL PEM 格式公钥生成 OpenSSH 格式公钥
  • 公钥和私钥的匹配使用
    • 加密和解密
    • 签名和验证
  • 总结

前言

公钥和私钥都是一串字符,长得也没有什么关联性,那么当拿到一个公钥和一个私钥后怎么验证它们两个是一对呢?先说说为什么会有这个疑问,最近在对接一些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密钥更具体,后者使用范围更广更灵活

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

事情一件件去办就好了,『没什么大不了的』,希望你长大后还可以经常乐观的说这句话,一副俾睨天下的姿态

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/201143.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Azure 架构师学习笔记】- Azure Databricks (2) -集群

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (1) - 环境搭建 前言 在上文中提到了ADB 的其中一个核心就是集群&#xff0c;所以这里专门研究一下ADB 的集群。 ADB 集群 首先了解一下ADB…

《SpringBoot项目实战》第六篇—接口防抖(防重复提交)的一些方式

系列文章导航 第一篇—接口参数的一些弯弯绕绕 第二篇—接口用户上下文的设计与实现 第三篇—留下用户调用接口的痕迹 第四篇—接口的权限控制 第五篇—接口发生异常如何统一处理 第六篇—接口防抖(防重复提交)的一些方式 本文参考项目源码地址&#xff1a;summo-springboot-i…

SpringBoot基础知识

SpringBoot简介 回顾什么是Spring Spring是一个开源框架&#xff0c;2003 年兴起的一个轻量级的Java 开发框架&#xff0c;作者&#xff1a;Rod Johnson 。 Spring是为了解决企业级应用开发的复杂性而创建的&#xff0c;简化开发。 Spring是如何简化Java开发的 为了降低Ja…

记录:Unity脚本的编写9.0

目录 射线一些准备工作编写代码 突然发现好像没有写过关于射线的内容&#xff0c;我就说怎么总感觉好像少了什么东西&#xff08;心虚 那就在这里写一下关于射线的内容吧&#xff0c;将在这里实现射线检测鼠标点击的功能 射线 射线是一种在Unity中检测碰撞器或触发器的方法&am…

22、pytest多个参数化的组合

官方实例 # content of test_multi_parametrie.py import pytestpytest.mark.parametrize("x",[0,1]) pytest.mark.parametrize("y",[2,3]) def test_foo(x,y):print("{}-{}".format(x,y))pass解读与实操 要获得多个参数化参数的所有组合&…

什么是HTTP/2?它与HTTP/1.x相比有什么改进?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

《论文阅读》使用条件变分自动编码器学习神经对话模型的语篇水平多样性 2017 ACL

《论文阅读》使用条件变分自动编码器学习神经对话模型的语篇水平多样性 2017 ACL 前言简介相关知识Stochastic Gradient Variational BayesMultivariate Gaussian DistributionIsotropic Gaussian DistributionReparameterization Trickprior network & posterior network …

简述Blender

前言 Blender是一款免费开源的3D计算机图形软件&#xff0c;功能强大&#xff0c;包括建模、动画、渲染、视频剪辑等多个方面。下面我分别为你介绍Blender的基础、提升、优势和应用领域。 介绍 Blender是由Blender基金会开发的开源项目&#xff0c;最初设计为一个内部工具&a…

C++ 函数详解

目录 函数概述 函数的分类 函数的参数 函数的调用 函数的嵌套调用 函数的链式访问 函数声明和定义 函数递归 函数概述 函数——具有某种功能的代码块。 一个程序中我们经常会用到某种功能&#xff0c;如两数相加&#xff0c;如果每次都在需要用到时实现&#xff0c;那…

第4章 互联网

文章目录 4.1 计算机网络基础 94 4.1.1 计算机网络的基本概念 94 4.1.2 局域网的基本原理 96 4.1.3 局域网协议与应用 98 4.2 Internet 100 4.2.1 TCP/IP 101 4.2.2 TCP/IP应用 106 4.2.3 网络操作系统的功能 112 4.2.4 网络安全的概念 116 4.3 计算机软件编程基础 …

唯创知音WTR096A-16S语音芯片:引领喊话器声音还原新时代

随着科技的不断发展&#xff0c;声音在各种场景中扮演着至关重要的角色。在喊话器领域&#xff0c;唯创知音的WTR096A-16S语音芯片以其卓越的性能和声音还原度的提高&#xff0c;为喊话器应用带来了全新的体验。 1. 声音还原度的升级 WTR096A-16S语音芯片采用16位数模转换器&…

机器学习---线性回归算法

1、什么是回归&#xff1f; 从大量的函数结果和自变量反推回函数表达式的过程就是回归。线性回归是利用数理统计中回归分析来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。 2、一元线性回归 3、多元线性回归 如果回归分析中包括两个或两个以上的自变量&a…

VIM光标移动和翻页快捷键-包含vim帮助文档截图

光标移动到行首(行首没有空格)&#xff1a; ^ 光标移动到行首(行首有空格)&#xff1a; 数字0 光标移动到行尾&#xff1a; $ 移动到指定行&#xff1a;7G(数字加一个大G&#xff09; 光标移动到文件开始&#xff1a;gg(两个小g) 光标移动到文件末尾&#xff1a;G(一个大G&…

二叉树的实现(纯C语言版)

目录 1.实现的接口1.1通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树 1.2 二叉树销毁1.3二叉树节点个数1.4二叉树第k层节点个数1.5 二叉树查找值为x的节点1.6二叉树前序遍历1.7二叉树中序遍历1.8二叉树后序遍历1.9层序遍历1.10判断二叉树是否是完全二叉树1.11 二叉…

AI:大语言模型训练方法 - 机器学习

Transformer Transformer是一种深度学习的模型架构&#xff0c;特别适用于自然语言处理任务。Transformer 模型的核心创新在于其 "自注意力"&#xff08;Self-Attention&#xff09;机制&#xff0c;这种机制使得模型可以有效地捕捉输入数据中的长距离依赖关系。 T…

【python】pip install 国内源

背景 python很多库都需要用国内镜像才能比较快&#xff0c;常用的有临时换源或长久换源。 临时换源 pip install [库] -i [源]国内源常用的有以下几种。 阿里云 http://mirrors.aliyun.com/pypi/simple/ 豆瓣(douban) http://pypi.douban.com/simple/ 清华大学 https://pyp…

数据结构 | 查漏补缺之DFS、BFS、二次探测再散列法、完全二叉树、深度计算

目录 DFS&BFS 哈希表-二次探测再散列法 完全二叉树&深度计算 排序 快速排序-挖坑法 插入、选择、冒泡、区别 DFS&BFS 哈希表-二次探测再散列法 完全二叉树&深度计算 排序 快速排序-挖坑法 插入、选择、冒泡、区别 插入从第一个元素开始&#xff0c…

利用yolov5输出提示框,segment-anything生成掩膜实现图像的自动标注

文章目录 一. 创建环境二. 下载模型文件三. 编辑代码 一. 创建环境 anaconda下新建一个环境 conda create -n yolo-sam python3.8激活新建的环境 conda activate yolo-sam更换conda镜像源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/fre…

el-input-number设置step、stepStrictly后,数据精度丢失的问题

el-input-number的配置 <el-input-numberv-else-if"colInputType(column, row) number"v-model"row[column.key]":placeholder"${$t(documentation.pleaseInput)}":controls"false":min"minFn(column, row)":max"…

企业CIO为何选择SD-WAN技术进行组网?

在这个信息技术快速发展的时代&#xff0c;网络已经成为企业的中枢神经系统&#xff0c;它不仅连接了分布在全球各地的办公室和员工&#xff0c;还提供了无缝的数据交流和协作环境。随着企业规模的扩大和数字化转型的加速&#xff0c;企业需要高效、安全、可靠的网络连接来应对…