我的私钥 ( ~/.ssh/id_rsa
) 是一个 1766 字节的文件,但我的公钥 ( ~/.ssh/id_rsa.pub
) 长度只有 396 字节。为什么差别这么大?是因为私钥是使用 AES 加密的吗?AES 密文的长度通常不是与明文大致相同吗?
答案1
您的私钥比公钥包含更多信息。公钥仅传达加密指数 (e) 和模数 (n),而私钥还包含解密指数 (d) 和模数的两个素因数 (p 和 q)。私钥本质上包含一个公钥。
[加密:密文 = 消息^e (mod n);解密:消息 = 密文^d (mod n)]
要查看私钥文件中的所有数据:
$ openssl rsa -in id_rsa -text -noout
编辑:私钥文件显然没有加密指数,但它有指数 d_1 和 d_2,其中 d_1 = d (mod p-1) 和 d_2 = d (mod q-1)。这些用于加速解密 - 您可以将解密指数分解为较小的并行指数调用,最终比大 d 和大 n 的一个大 m=c^d (mod n) 更快。
答案2
不幸的是,您没有指定密钥的存储格式。我猜您指的是 OpenSSH 密钥编码。在这种格式中,密钥存储在 base64 编码的数据块中。根据加密时的编码,加密数据时通常会涉及某种填充。因此,生成的数据是加密块大小的倍数。
---- BEGIN SSH2 [PUBLIC|PRIVATE] KEY ----
OpenSSH 密钥还可以包括插入在和标记之间的某种注释和附加属性-----END RSA [PUBLIC|PRIVATE] KEY-----
。请参阅RFC4716。
此外,对于公钥,模数和公共指数被保存,而对于私钥,则保存私有指数。参见维基百科上的 RSA 密钥生成有关数学基础的详细信息。网上有很多地方描述了这些键之间的数学联系。不确定你是否需要这些解释的副本。
理论上,可以通过公钥信息计算出私钥,但从数学上讲,这样做比反过来要困难得多。只需将私钥视为包含所有变量的“源”,将公钥视为计算的结果。如果您知道所有变量,则很容易一遍又一遍地执行计算,但只知道结果,很难获得所有源变量。这也是为什么将私钥保存在安全的地方就足够了的原因。您始终可以使用私钥重新计算公钥。但不能反过来 - 好吧,理论上您可以这样做,但根据密钥长度,这可能需要很多年 ;)。