Jak*_*lat 5 cryptography rsa go ssh-keys
我有一个rsa.PublicKey由一个模数和一个公共 exponnet 组成的结构体。我想验证一个ssh.Signature用那个密钥签名的,我想如果我有一个ssh.PublicKey我可以Verify在那个接口上调用这个方法。但是,我找不到任何实现ssh.PublicKey和支持从rsa.PublicKey. 我是否需要编写专有方法来执行此操作,或者是否有我找不到的类,或者解决我的问题的更好方法?
就上下文而言,我得到了rsa.PublicKey来自x509.Certificateyubikey 的an ,它证明了其 PIV 插槽中的一个密钥。
NewPublicKeycrypto/ssh 包http://godoc.org/golang.org/x/crypto/ssh#NewPublicKey中的函数可以采用as 参数并返回包含方法 ( )*rsa.PublicKey的接口实例- http:// godoc.org/golang.org/x/crypto/ssh#PublicKey。PublicKeyVerifyVerify(data []byte, sig *Signature) error
下面的程序说明了这一点 - 我们创建一个新的 *rsa.PrivateKey 并用它签署一条消息,然后转换*rsa.PublicKey为ssh.PublicKeyusingNewPublicKey函数并验证签名;还要检查如果原始数据被修改,签名验证是否失败。为了简洁起见,省略了错误检查。
包主
进口 (
“加密货币/兰特”
“加密/RSA”
“FMMT”
“日志”
“golang.org/x/crypto/ssh”
)
函数主() {
数据 := []byte("你好,世界!")
// 创建一个新密钥作为 *rsa.PrivateKey
priv, _ := rsa.GenerateKey(rand.Reader, 512)
签名者, _ := ssh.NewSignerFromKey(priv)
sig, _ := signer.Sign(rand.Reader, 数据)
// 从*rsa.PublicKey中提取ssh.PublicKey来验证签名
pub, _ := ssh.NewPublicKey(&priv.PublicKey)
if err := pub.Verify(data, sig); 错误!=零{
log.Fatalf("publicKey.验证失败: %v", err)
}
fmt.Printf("签名成功\n")
// 修改数据并确保我们得到失败
数据[0]++
if err := pub.Verify(data, sig); 错误==零{
log.Printf("publicKey.Verify 传递了错误的数据/签名,预计会失败")
}
}
输出:
签名确定