Encryption 为什么id_rsa和id_rsa.pub文件的内容是字母?

Encryption 为什么id_rsa和id_rsa.pub文件的内容是字母?,encryption,cryptography,rsa,ssh-keys,ssh-keygen,Encryption,Cryptography,Rsa,Ssh Keys,Ssh Keygen,我正在尝试实现RSA算法,根据该算法,公钥和私钥基于非常大的数字,因此,privatekey和public key也是一个数字 例如,生成私钥和公钥 让我们选择 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 我们到了 公钥对(n,e)=(133,5) 私钥对(n,d)=(133,65) 加密:p^e%n 解密:c^d

我正在尝试实现RSA算法,根据该算法,公钥和私钥基于非常大的数字,因此,
private
key和
public key
也是一个数字

例如,生成私钥和公钥

让我们选择

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
我们到了 公钥对(n,e)=
(133,5)
私钥对(n,d)=
(133,65)

加密:
p^e%n
解密:
c^d%n

但是。据我所知,通过
ssh-keygen
命令生成的
public-key
id\u-rsa.pub

在检查
id\u rsa
id\u rsa.pub
时,我发现字母不是一个很大的数字


如何使用这些
id\u rsa
id\u rsa.pub
对数据进行加密。

如注释中所述,这些文件是按格式编码的。但是如果你问,base64中编码的是什么,这就是杂草中开始出现的东西。文件的主要目的是存储RSA计算中使用的一些数字。它们不适合人类阅读,因为它对太空不友好。它们意味着机器可以快速处理,因此必须以机器可以轻松加载和开始使用的格式编写

如果您查看一个名为orjsonwebkey的标准,您将看到这些密钥是如何在应用程序之间传递的。如: 私钥

{
    "kty": "EC",
    "d": "u5uui9SeGmkorTrbXtOGWAaov1cLCZXt3kleSxzH8T0",
    "use": "sig",
    "crv": "P-256",
    "x": "a3JvmNVFxue8gyAdtH_Pca87CKjh82j7mMRzHhS3_IA",
    "y": "JdEC03zi2IatFVjrp1o4ear32gBe4E0xiFf_EDt8unM",
    "alg": "ES256"
}
和公钥:

{
    "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 asn1parse -in key.pem -inform PEM 
    
    您将看到输出,其中包含您期望的大量数据

  • 难的是:这些数字以ASN1的格式打包。如果您以编码的格式读取二进制文件,您也将能够看到二进制文件中的数字
  • 但首先,需要将openssh密钥转换为所需的格式,称为PEM格式

    ssh-keygen -f id_rsa.pub -e -m pem > pubkey.pem
    
    现在,我们可以在pubkey.pem中执行一个
    openssl asn1parse-通知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格式的:

    关于这些关键格式,您需要了解两件事。第一个相对简单:二进制数据是base64编码的。这就是那些字母和数字。因此,您必须对它们进行base64解码,以获取字节,并开始理解它们。第二件也是更难的事情是各种组件是如何按字节顺序排列的。不同的系统有不同的标准。搜索有关ssh私钥和公钥格式的信息。@JamesReinstateMonicaPolk最好将此作为一个答案,除了指出您在上面指出的信息之外,我们无法对这个问题做更多的处理。您是否检查过有问题的ssh文件以查看此答案是否相关?例如,只有当数据是ASN.1对象的编码时,asn1parse才有意义。是的,这就是为什么我提到以下文本“但是首先,需要将openssh密钥转换为所需的格式,称为PEM格式”。整个答案是直接使用openssl,而不是使用openssh,因为openssl以更广泛的格式生成密钥。
    $ 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