将 rsa.PublicKey 转换为 ssh.PublicKey

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 插槽中的一个密钥。

dmi*_*ris 4

NewPublicKeycrypto/ssh 包http://godoc.org/golang.org/x/crypto/ssh#NewPublicKey中的函数可以采用as 参数并返回包含方法 ( )*rsa.PublicKey的接口实例- http:// godoc.org/golang.org/x/crypto/ssh#PublicKeyPublicKeyVerifyVerify(data []byte, sig *Signature) error

下面的程序说明了这一点 - 我们创建一个新的 *rsa.PrivateKey 并用它签署一条消息,然后转换*rsa.PublicKeyssh.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 传递了错误的数据/签名,预计会失败")
    }
}

输出:

签名确定