gpt4 book ai didi

go - 在函数 ecdsa.Verify 上键入断言

转载 作者:行者123 更新时间:2023-12-01 21:17:25 25 4
gpt4 key购买 nike

这是代码:

    package main

import (
"crypto/ecdsa"
"crypto/elliptic"
"crypto/rand"
"fmt"
)

func main() {
msg := "Any random message"
curve := elliptic.P224()
key, err := ecdsa.GenerateKey(curve, rand.Reader)
if err != nil {
fmt.Println(err)
}
r, s, err := ecdsa.Sign(rand.Reader, key, []byte(msg))
if err != nil {
fmt.Println(err)
}
// fmt.Println("r: ", r)
// fmt.Println("s: ", s)

publicKey := key.Public()
isVerified := ecdsa.Verify(publicKey.(*ecdsa.PublicKey), []byte(msg), r, s)
fmt.Println("isVerified: ", isVerified)
fmt.Println("key.PublicKey: ", key.PublicKey)
fmt.Println("key.D: ", key.D)

fmt.Println("key.Public() : ", publicKey)
fmt.Printf("Type of publicKey: %T\n", publicKey)//*ecdsa.PublicKey
}
为什么调用 ecdsa.Verify() 时需要类型断言在 publicKey ?
当我打印 publicKey 的类型时,它清楚地表明它是类型 *ecdsa.PublicKey , 相应函数参数所需的类型,但它被解释为类型 crypto.PublicKey .
这是错误消息:
./main.go:25:28: cannot use publicKey (type crypto.PublicKey) as type *ecdsa.PublicKey in argument to ecdsa.Verify: need type assertion

最佳答案

正如您在文档中注意到的那样:

  • ecdsa.PrivateKey.Public返回 crypto.PublicKey
  • ecdsa.Verify想要一个ecdsa.PublicKey

  • 这两种类型完全不同:
  • crypto.PublicKey是一个接口(interface):它包含一个具体的值和一个动态类型。在编译时,类型可以是任何东西,因此必须在运行时检查(类型切换、类型断言)
  • ecdsa.PublicKey是具体类型

  • 接口(interface)的全部意义在于接受 任何类型实现接口(interface)。在您的情况下, publicKey可以有动态类型 ecdsa.PublicKey , 或 rsa.PublicKey , 甚至 nil .编译器允许所有这些。
    当调用需要特定类型的函数或方法时,编译器现在将需要请求的实际类型。这可以使用 type assertion 来完成。或 type switch .
    您可能会发现在您的简单示例中没有必要,但考虑在 key 生成和验证之间添加一些中介(例如允许不同类型的 key ),您最终可能会得到不同的 key 基础类型(一个是 ecdsa.PublicKey,另一个是是 rsa.PublicKey )。 crypto.PublicKey接口(interface)允许轻松传递此 key ,但在实际使用它时, 你必须检查动态类型 .
    最后:你看到的原因 *ecdsa.PublicKey使用 %T 打印时动词是 print calls reflect.TypeOf .根据 docs ,这是传入接口(interface)的动态类型(或 nil )。

    关于go - 在函数 ecdsa.Verify 上键入断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63370048/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com