为什么id_rsa和id_rsa.pub文件的内容都是字母?
Why the content of id_rsa and id_rsa.pub files are letters?
我正在尝试实施 RSA
算法,根据算法 public 密钥和私钥基于非常大的数字和结果,private
密钥和 public key
也是一个数字。
例如生成私钥和public密钥
让我们选择
p = 7
q = 19
n = p * q = 133
m = (p-1) * (q-1) = 108
e = 5
d = (1 + i * m) /e
for i = 0, 1, 2 .. n
d = 65
我们得到了
Public 密钥对 (n, e) = (133, 5)
私钥对 (n, d) = (133,65)
加密:p^e%n
解密:c^d%n
但是。据我所知,ssh-keygen
命令生成的 public key
和 private key
是 id_rsa
和 id_rsa.pub
.
在检查 id_rsa
和 id_rsa.pub
时,我发现了字母而不是非常大的数字。
论文 id_rsa
和 id_rsa.pub
如何用于加密数据。
如评论中所述,这些文件以 base64 格式编码。但是如果你问,什么 是用 base64 编码的,那就是事情开始变得杂乱无章的地方。文件的主要目的是存储一些在 RSA 计算中使用的数字。它们不适合人类阅读,因为它 space 不友好。它们旨在供机器快速处理,因此必须以机器可以轻松加载和开始使用的格式编写。
如果您查看名为 JWK 或 JSON Web Key 的标准,您将了解密钥是如何在应用程序之间传递的。例如:
私钥
{
"kty": "EC",
"d": "u5uui9SeGmkorTrbXtOGWAaov1cLCZXt3kleSxzH8T0",
"use": "sig",
"crv": "P-256",
"x": "a3JvmNVFxue8gyAdtH_Pca87CKjh82j7mMRzHhS3_IA",
"y": "JdEC03zi2IatFVjrp1o4ear32gBe4E0xiFf_EDt8unM",
"alg": "ES256"
}
和一个public键:
{
"kty": "EC",
"use": "sig",
"crv": "P-256",
"x": "a3JvmNVFxue8gyAdtH_Pca87CKjh82j7mMRzHhS3_IA",
"y": "JdEC03zi2IatFVjrp1o4ear32gBe4E0xiFf_EDt8unM",
"alg": "ES256"
}
这些可能是一种更易读的形式,但如果您观察,它们是序列化的字符串格式。他们将不得不从字符串到 JSON 再到字段提取,然后将它们转换为可以使用的对象。
openssl和openssh生成的文件格式更接近机器喜欢的格式。我建议使用 openssl 和 openssh 一起玩,因为它们的传播范围更广。有一个规范,x509
,全世界都使用它来进行密码学共享密钥。 Openssh 建立在有点不同的规范上,它们生成的密钥以不同的格式编写。
如果你想看到大数字,有两种方法:
但首先,让我们生成一个密钥来试用。我们将生成一个 512 位密钥,只是为了保持它的小。
openssl genrsa -out key.pem 512
- 简单的方法,请工具帮忙:如果你有上面的文件,你可以让 openssl 解析它并为你转储信息。
$ openssl rsa -in key.pem -noout -text
RSA Private-Key: (512 bit, 2 primes)
modulus:
00:a9:...
publicExponent: 65537 (0x10001)
privateExponent:
00:8c:...
prime1:
00:da:...
prime2:
00:c6:...
exponent1:
4e:0d:...
exponent2:
76:66:...
coefficient:
00:92:...
数字被省略只是为了保持较小。
另一种看待这个问题的方法是:
$ openssl asn1parse -in key.pem -inform PEM
您将看到包含您期望的大量数字的输出。
- 困难的方法:这些数字以称为
ASN1
的格式打包。如果您以编码格式读取二进制文件,您也将能够看到二进制文件中的数字。
但首先,需要将openssh密钥转换成需要的格式,称为PEM格式。
ssh-keygen -f id_rsa.pub -e -m pem > pubkey.pem
现在,我们可以做一个 openssl asn1parse -in pubkey.pem -inform PEM
并查看详细信息。
$ ssh-keygen -f id_rsa.pub -e -m pem | openssl asn1parse -inform PEM
0:d=0 hl=4 l= 266 cons: SEQUENCE
4:d=1 hl=4 l= 257 prim: INTEGER :EB3F998DBAE8F8AFF59FE51F2A1BCE36D76F71D0DD76FD92B77CB2FFADAF9B7F3EA77FEA40590D7C1BFEEB7DA7F72E780D79784A778761980DA7FE4C320BA513A4849929F92A2185305C379A125080C7CAFA37C53D38AD447A895EC5E3BEC77F323CB818D90F5F8071566A7618ADEA94A4FF472E21BDF782197A07DADB6DEFD6FE27D759775BEC3AFEAF973F861FD5F3A8CB1177304206A79DAFC961F7E4792E76732589BD219742F73630364C3724D5FCE3B0DC1EDD3E498549EE74ED17157E333883FAC498C8EE75F69700E2385A510BF705DE4DD5599806F47F2DDD6EA71CD0ADF50C9B943A30E2A8B6C086699A59413195CC4CA846B40460F767F4D40AE3
265:d=1 hl=2 l= 3 prim: INTEGER :010001
请阅读此答案以了解如何将这些数字编码为 PEM 格式:
我正在尝试实施 RSA
算法,根据算法 public 密钥和私钥基于非常大的数字和结果,private
密钥和 public key
也是一个数字。
例如生成私钥和public密钥
让我们选择
p = 7
q = 19
n = p * q = 133
m = (p-1) * (q-1) = 108
e = 5
d = (1 + i * m) /e
for i = 0, 1, 2 .. n
d = 65
我们得到了
Public 密钥对 (n, e) = (133, 5)
私钥对 (n, d) = (133,65)
加密:p^e%n
解密:c^d%n
但是。据我所知,ssh-keygen
命令生成的 public key
和 private key
是 id_rsa
和 id_rsa.pub
.
在检查 id_rsa
和 id_rsa.pub
时,我发现了字母而不是非常大的数字。
论文 id_rsa
和 id_rsa.pub
如何用于加密数据。
如评论中所述,这些文件以 base64 格式编码。但是如果你问,什么 是用 base64 编码的,那就是事情开始变得杂乱无章的地方。文件的主要目的是存储一些在 RSA 计算中使用的数字。它们不适合人类阅读,因为它 space 不友好。它们旨在供机器快速处理,因此必须以机器可以轻松加载和开始使用的格式编写。
如果您查看名为 JWK 或 JSON Web Key 的标准,您将了解密钥是如何在应用程序之间传递的。例如: 私钥
{
"kty": "EC",
"d": "u5uui9SeGmkorTrbXtOGWAaov1cLCZXt3kleSxzH8T0",
"use": "sig",
"crv": "P-256",
"x": "a3JvmNVFxue8gyAdtH_Pca87CKjh82j7mMRzHhS3_IA",
"y": "JdEC03zi2IatFVjrp1o4ear32gBe4E0xiFf_EDt8unM",
"alg": "ES256"
}
和一个public键:
{
"kty": "EC",
"use": "sig",
"crv": "P-256",
"x": "a3JvmNVFxue8gyAdtH_Pca87CKjh82j7mMRzHhS3_IA",
"y": "JdEC03zi2IatFVjrp1o4ear32gBe4E0xiFf_EDt8unM",
"alg": "ES256"
}
这些可能是一种更易读的形式,但如果您观察,它们是序列化的字符串格式。他们将不得不从字符串到 JSON 再到字段提取,然后将它们转换为可以使用的对象。
openssl和openssh生成的文件格式更接近机器喜欢的格式。我建议使用 openssl 和 openssh 一起玩,因为它们的传播范围更广。有一个规范,x509
,全世界都使用它来进行密码学共享密钥。 Openssh 建立在有点不同的规范上,它们生成的密钥以不同的格式编写。
如果你想看到大数字,有两种方法:
但首先,让我们生成一个密钥来试用。我们将生成一个 512 位密钥,只是为了保持它的小。
openssl genrsa -out key.pem 512
- 简单的方法,请工具帮忙:如果你有上面的文件,你可以让 openssl 解析它并为你转储信息。
$ openssl rsa -in key.pem -noout -text
RSA Private-Key: (512 bit, 2 primes)
modulus:
00:a9:...
publicExponent: 65537 (0x10001)
privateExponent:
00:8c:...
prime1:
00:da:...
prime2:
00:c6:...
exponent1:
4e:0d:...
exponent2:
76:66:...
coefficient:
00:92:...
数字被省略只是为了保持较小。 另一种看待这个问题的方法是:
$ openssl asn1parse -in key.pem -inform PEM
您将看到包含您期望的大量数字的输出。
- 困难的方法:这些数字以称为
ASN1
的格式打包。如果您以编码格式读取二进制文件,您也将能够看到二进制文件中的数字。
但首先,需要将openssh密钥转换成需要的格式,称为PEM格式。
ssh-keygen -f id_rsa.pub -e -m pem > pubkey.pem
现在,我们可以做一个 openssl asn1parse -in pubkey.pem -inform PEM
并查看详细信息。
$ ssh-keygen -f id_rsa.pub -e -m pem | openssl asn1parse -inform PEM
0:d=0 hl=4 l= 266 cons: SEQUENCE
4:d=1 hl=4 l= 257 prim: INTEGER :EB3F998DBAE8F8AFF59FE51F2A1BCE36D76F71D0DD76FD92B77CB2FFADAF9B7F3EA77FEA40590D7C1BFEEB7DA7F72E780D79784A778761980DA7FE4C320BA513A4849929F92A2185305C379A125080C7CAFA37C53D38AD447A895EC5E3BEC77F323CB818D90F5F8071566A7618ADEA94A4FF472E21BDF782197A07DADB6DEFD6FE27D759775BEC3AFEAF973F861FD5F3A8CB1177304206A79DAFC961F7E4792E76732589BD219742F73630364C3724D5FCE3B0DC1EDD3E498549EE74ED17157E333883FAC498C8EE75F69700E2385A510BF705DE4DD5599806F47F2DDD6EA71CD0ADF50C9B943A30E2A8B6C086699A59413195CC4CA846B40460F767F4D40AE3
265:d=1 hl=2 l= 3 prim: INTEGER :010001
请阅读此答案以了解如何将这些数字编码为 PEM 格式: