【问题标题】:Converting rsa.PublicKey to ssh.PublicKey将 rsa.PublicKey 转换为 ssh.PublicKey
【发布时间】:2016-11-29 12:25:16
【问题描述】:
我有一个rsa.PublicKey,它由一个模数和一个结构中的公共指数组成。我想验证一个用该密钥签名的ssh.Signature,我想如果我有一个ssh.PublicKey,我可以在该接口上调用Verify 方法。但是,我找不到任何实现ssh.PublicKey 并支持从rsa.PublicKey 转换的类。我是否需要编写专有方法来执行此操作,或者是否有一些我找不到的类,或者解决我的问题的更好方法?
就上下文而言,我从一个 x509.Certificate 中得到了 rsa.PublicKey,它来自一个 yubikey 证明其 PIV 插槽中的一个密钥。
【问题讨论】:
标签:
go
cryptography
rsa
ssh-keys
【解决方案1】:
crypto/ssh 包http://godoc.org/golang.org/x/crypto/ssh#NewPublicKey 中的NewPublicKey 函数可以将*rsa.PublicKey 作为参数并返回包含Verify 方法的PublicKey 接口的实例(Verify(data []byte, sig *Signature) error) - @987654322 @。
下面的程序说明了它 - 我们创建一个新的 *rsa.PrivateKey 并用它签署一条消息,然后使用 NewPublicKey 函数将*rsa.PublicKey 转换为ssh.PublicKey 并验证签名;如果原始数据被修改,还要检查签名验证是否失败。为简洁起见,省略了错误检查。
包主
进口 (
“加密货币/兰特”
“加密/rsa”
“fmt”
“日志”
“golang.org/x/crypto/ssh”
)
功能主要(){
数据 := []byte("你好,世界!")
// 创建一个新密钥作为 *rsa.PrivateKey
priv, _ := rsa.GenerateKey(rand.Reader, 512)
签名者,_ := ssh.NewSignerFromKey(priv)
sig, _ := signer.Sign(rand.Reader, data)
// 从 *rsa.PublicKey 中提取 ssh.PublicKey 以验证签名
酒吧,_ := ssh.NewPublicKey(&priv.PublicKey)
if err := pub.Verify(data, sig);错误!=无{
log.Fatalf("publicKey.Verify failed: %v", err)
}
fmt.Printf("签名正常\n")
// 修改数据并确保失败
数据[0]++
if err := pub.Verify(data, sig);错误 == 无 {
log.Printf("publicKey.Verify 传递了错误的数据/签名,预计失败")
}
}
输出:
签名OK