我(用于测试)只是通过在Vim中打开并更改几个字节来随机更改了RSA私钥。它是用于在远程系统上登录的SSH密钥对的私有部分。令人费解的是,它仍然允许我登录。私有指数$发生了变化(只有一点点变化)。是否有可能因此使用其他缓存的值来解密从服务器发送的值,以便仍然允许我登录?由于ASN.1中的其他整数仍然相同,因此仍可以(如预期的那样)导出公钥。以上是可能的。我发现当我在Vim中大量修改密钥时,它会按预期拒绝我。谢谢。

评论

在不更改其他参数的情况下更改d私有指数,您将失去整个密钥对的原始属性。检查d参数是如何生成的。无论如何,这个话题很有趣。您可以共享密钥(或创建类似密钥)来重现案件吗?

您确定使用了此密钥吗?检查ssh -v主机。难道也没有DSA密钥吗?

绝对是RSA密钥。

#1 楼

ASN.1编码的SSH私钥按顺序包含以下整数:


公共模数$ n $和指数$ e $;
私有指数$ d $ ;
$ n $的主要因子$ p $和$ q $;
“减少的”私有指数$ d_p = d \ bmod(p-1)$和$ d_q = d \ bmod( q-1)$;
“ CRT系数” $ q _ {\ text {inv}} = q ^ {-1} \ bmod p $。

观察值这样的键中的$ d $可能是不相关的,这是由于以下原因:为了将$ n $模的乘幂速度提高约$ 4 $,可以使用中国剩余定理来计算$ p $和$ q模的结果。分别使用$和随后将它们组合以获得以$ n $为模的“真实”结果。通过这种优化,不需要$ n $,$ e $和$ d $的值,因此,只要$ p $,$ q $,$ d_p $,$ d_q $和$ q _ {\ text, {inv}} $可用*。这就是为什么在键的中间更改某些字符并不一定要销毁它的原因,这取决于您更改了哪些组件。

*)至少对于OpenSSH而言,它们不必存在:设置$ p = q = 1 $和$ d_p = d_q = q _ {\ text {inv}} = 0 $会使实现使用$ n $和$ d $。

可视化在单个组件中,我从一个典型的4096位RSA私钥文件创建了以下图形: (编码将要跟随序列的事实,等等),然后是构成键的整数,如上所述。与每个组件关联的ASN.1标头数据(主要是长度字段)的颜色比表示整数本身的数据的颜色略亮。请注意,上图所示的细分并非100%准确,因为一个Base64字符编码的原始字节大约为$ 3/4 $,因此某些边界实际上应严格在单个字符内运行。

评论


$ \ begingroup $
相关问题:crypto.stackexchange.com/questions/6593/…(以前与我的答案相关,因此我删除了该答案,否则就多余了)。
$ \ endgroup $
–伊尔马里·卡洛宁(Ilmari Karonen)
16年1月9日在21:24

$ \ begingroup $
@yyyyyyy:Meta问题:我喜欢你的颜色。您使用什么程序?
$ \ endgroup $
– StackzOfZtuff
16年1月11日在8:37

$ \ begingroup $
@StackzOfZtuff谢谢!不幸的是,我不知道有什么方便的程序可用于这样的事情:我的“工具链”由OpenSSL,Python,LaTeX和GIMP的可怕混合物以及大量的手工工作组成。
$ \ endgroup $
– yyyyyyy
16年1月11日在12:12



$ \ begingroup $
Blimey!我仅对着色问题给出了答案:) [不必说这对所有RSA新手来说都是非常有用的答案,我已经在我的收藏夹中保存了一个链接]。
$ \ endgroup $
–tum_
16年6月24日在7:39



$ \ begingroup $
Re:“至少对于OpenSSH,它们不必存在:设置$ p = q = 1 $和$ d_p = d_q = q _ {\ text {inv}} = 0 $会使实现使用$ n $和$ d $。”对于OpenSSL,这似乎也适用:我刚刚针对Node.js的crypto.privateDecrypt测试了使用这些参数构造的证书,并且该证书没有错误。
$ \ endgroup $
– Stuart P. Bentley
17年5月10日在5:56