我的私钥( ~/.ssh/id_rsa )是一个1766字节的文件,但是我的公钥( ~/.ssh/id_rsa.pub )只有396个字节。 为什么巨大的差异? 是否因为私钥使用AESencryption? AES密文通常与明文长度相同吗?
你的私钥有比你的公钥更多的信息。 尽pipe公钥只传递encryption指数(e)和模数(n),但私钥还包括解密指数(d)和模数的两个素数因子(p和q)。 私钥本质上有一个公钥。
[encryption:ciphertext = message ^ e(mod n); 解密:message = ciphertext ^ d(mod n)]
要查看私钥文件中的所有数据,请执行以下操作:
$ openssl rsa -in id_rsa -text -noout
编辑:私钥文件显然没有encryption指数,但它有指数d_1和d_2,其中d_1 = d(mod p-1)和d_2 = d(mod q-1)。 这些用来加速解密 – 你可以将解密指数分成更小的并行指数调用,对于大d和大n,结果比一个大m = c ^ d(mod n)快。
不幸的是,你没有指定密钥存储的格式。 我想你是指OpenSSH密钥编码。 在这种格式中,密钥存储在base64编码的数据块中。 根据encryption时的编码,encryption数据时通常会涉及某种填充。 所以得到的数据是encryption块大小的倍数。
OpenSSH密钥还可以包含一些注释和附加属性之间插入---- BEGIN SSH2 [PUBLIC|PRIVATE] KEY ----和-----END RSA [PUBLIC|PRIVATE] KEY-----标记。 请参阅RFC4716 。
而且,对于公钥,保存模数和公开指数,对于私钥保存私用指数。 有关math基础的详细信息,请参阅Wikipedia上的RSA密钥生成 。 网上有很多地方描述这些键之间的math联系。 不知道这里是否需要这些解释的副本。
从理论上讲,可以从公钥信息中计算私钥,但这样做在math上比其他方式困难得多。 只要将私钥作为计算结果包含所有variables和公钥的“源”即可。 如果你知道所有的variables但只知道结果就很难得到所有的源variables,那么一遍又一遍地执行计算是很容易的。 这也是为什么您将私钥保存在安全的地方足够了。 您始终可以使用私钥重新计算公钥。 但不是相反的 – 理论上你可以做到这一点,但取决于关键的长度,这可能需要很多年的时间)。