ssh-Keygen与密钥格式

未完成状态的post

ssh-keygen是用于生成ssh密钥对的程序,可以生成多种非对称加密(如RSA、ECC等)的密钥对,用于SSH登录认证或者其他需要使用签名的场合等等(如Github登录或仓库Actions的运行等)。

openssl&ssh-keygen

两种生成密钥对的方法

使用ssh-keygen 加对应的选项参数即可生成相关的密钥对,生成一个默认的密钥对只需要运行ssh-keygen按照提示操作(默认目录是在家目录的.ssh目录中),以下是使用参数生成的密钥对,并指定目录

1
ssh-keygen -t rsa -b 1024 -C ""

生成RSA密钥对(1024bits)

1
openssl genrsa -out test.key 1024

openssl读取私钥

使用openssl读取私钥

1
openssl rsa -in test.key -text

私钥结构

RSA私钥

一个RSA私钥的结构中包含了如下的几个部分。

  1. $\text{n}$模数
  2. $\text{e}$公共指数,默认为65537
  3. $\text{d}$私钥
  4. $\text{p(q)}$第一个大质数
  5. $\text{q(p)}$第二个大质数
  6. $\text{dp}:d\pmod{p-1}$dp
  7. $\text{dq}:d\pmod{q-1}$dq
  8. $\text{coefficient}:q^{-1}\pmod{p}$

使用Python读取RSA私钥

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from Crypto.PublicKey import RSA
from Crypto.Util.number import *
with open("test.key","rb") as f:
    content = f.read()
key = RSA.import_key(content)
assert isPrime(key.q) and isPrime(key.p) and key.p*key.q==key.n

print(key.e)
print(key.n)
print(key.q)
print(key.p)

密钥格式

输入的命令不同,生成的私钥内容也是有去别的,如果使用默认的ssh-keygen生成的私钥文件是无法通过Openssl直接读取的,如果想要通过Openssl命令读取rsa私钥文件,需要在生成的时候使用openssl命令。

这两种文件格式的开头和结尾也有区别,如果使用ssh-keygen命令直接创建,开头和结尾为:-----BEGIN OPENSSH PRIVATE KEY----------END OPENSSH PRIVATE KEY-----此时生成的是ssh的密钥;如果使用Openssl命令并指定的加密算法创建密钥对,生成的密钥对的开头和结尾是:-----BEGIN PRIVATE KEY----------END PRIVATE KEY-----,这两种密钥对形式有相似,但是并不是一样的密钥类型,无法使用openssl rsa .....命令读取ssh-keygen生成的ssh密钥,所以使用openssl命令读取ssh-keygen的私钥的时候无法成功。

Reference

OpenSSL - wiki

OpenSSL - Toolkit

ssh-keygen - wiki

ssh-keygen manual

What are the differences between ssh generated keys(ssh-keygen) and OpenSSL keys (PEM)and what is more secure for ssh remote login?

[For valid PEM I get unable to load private key by openssh](https://superuser.com/questions/1679344/for-valid-pem-i-get-unable-to-load-private-key-by-openssh)

RECOVERING A FULL PEM PRIVATE KEY WHEN HALF OF IT IS REDACTED

PyCryptodome - readthedocs

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy