【发布时间】:2015-07-23 16:41:13
【问题描述】:
我正在尝试获取一个 SSH 公钥(x.crypto.ssh.PublicKey,通过解析 authorized_keys 生成)并从中提取一个普通的旧 crypto.rsa.PublicKey(我知道密钥的类型为 ssh-rsa )。这意味着,在 ssh-land 中,密钥是(未导出的)类型 rsaPublicKey。
通过使用reflect.Interface() 或普通的旧fmt.Sprintf("%v"),我可以获得如下所示的值:
&{133141753607255377833524803712241410600224583899447743985716492314976605735038858392516407436607315136967439536840885454950028631410155683051419836325912444338003188332463816050354540934271243064035037856360864190161298769948076508355604915775510460445701536855931828420791030023079646791573156484306628882221 35}
我知道,通过阅读 ssh 包源,ssh.rsaPublickey 实际上被定义为我想要的类型:
type rsaPublicKey rsa.PublicKey
因此这个值已经是我想要的了。 (事实上,我可以使用"%+v",甚至看到它的字段(当然)被命名为N 和E。)
我的问题是,我没有更好的方法让 Go 相信这实际上是一个 rsa.PublicKey,而不是使用 fmt.Sscan 将这些数字中的每一个提取到字符串中,然后转换为 big.Int 和int,然后使用我刚刚得到的这两个值作为模数和指数来创建一个新的rsa.PublicKey。
这行得通,但看起来非常讨厌。我明白了,因为它没有导出,可能没有直接路径,但肯定有比重新转换它们的可打印表示更好的方法来获取字段。
ssh.PublicKey 确实有一个Marshal() 函数,但这给了我有线格式的表示,如果我通过那里,好吧,我想它可以避免滥用类型系统,但我只是最终写我自己的 byte-stream-to-big-Int-to-RSA 转换器在那里,这似乎并没有真正帮助。那时我还不如从authorized_keys 文件开始并自己解析它,这似乎也很愚蠢。
这样做的正确方法是什么?
【问题讨论】:
标签: reflection ssh go type-conversion rsa