【问题标题】: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

    【讨论】:

      猜你喜欢
      • 2017-01-17
      • 2021-03-02
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      • 1970-01-01
      • 2014-07-20
      相关资源
      最近更新 更多