为了账号安全,请及时绑定邮箱和手机立即绑定

我无法按顺序从她的私钥生成 ECDSA 公钥

我无法按顺序从她的私钥生成 ECDSA 公钥

Go
慕虎7371278 2022-11-28 10:43:27
我无法按顺序生成公钥。输出 :./keysgo.go:33:33: 不能使用 PrivateKey(类型 []byte)作为 Public 参数中的类型字符串非常感谢你的帮助保留这部分很重要:func Public(PrivateKey string) (publicKey string) {    var e ecdsa.PrivateKey    e.D, _ = new(big.Int).SetString(PrivateKey, 16)    e.PublicKey.Curve = secp256k1.S256()    e.PublicKey.X, e.PublicKey.Y = e.PublicKey.Curve.ScalarBaseMult(e.D.Bytes())    return fmt.Sprintf("%x", elliptic.MarshalCompressed(secp256k1.S256(), e.X, e.Y))我试过了package main import (    "crypto/ecdsa"    "crypto/elliptic"    "fmt"    "math/big"    "github.com/ethereum/go-ethereum/crypto/secp256k1"           )func Public(PrivateKey string) (publicKey string) {    var e ecdsa.PrivateKey    e.D, _ = new(big.Int).SetString(PrivateKey, 16)    e.PublicKey.Curve = secp256k1.S256()    e.PublicKey.X, e.PublicKey.Y = e.PublicKey.Curve.ScalarBaseMult(e.D.Bytes())    return fmt.Sprintf("%x", elliptic.MarshalCompressed(secp256k1.S256(), e.X, e.Y))}func main() {        count, one := big.NewInt(1), big.NewInt(1)    count.SetString("9404625697166532776746648320380374280100293470930272690489102837043110636674",10)        PrivateKey := make([]byte, 32)   for {        count.Add(count, one)        copy(PrivateKey[32-len(count.Bytes()):], count.Bytes())                fmt.Printf("%x\n",Public(PrivateKey))            }       }   }
查看完整描述

4 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

非常感谢 Wesley 先生,我正在寻找的是这样的东西, https://go.dev/play/p/ws2c_bIc4M5 但我无法按顺序生成密钥(私人和公共)谢谢你的好意



查看完整回答
反对 回复 2022-11-28
?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

非常感谢您的回复


我试过了 Public(string(PrivateKey))


程序的响应


panic: runtime error: invalid memory address or nil pointer dereference

[signal SIGSEGV: segmentation violation code=0x1 addr=0x10 pc=0x4b47f9]


goroutine 1 [running]:

math/big.(*Int).Bytes(...)

        /usr/local/go/src/math/big/int.go:453


main.Public({0xc00001e1a0, 0x20})

        /root/Desktop/tuttogoprova/adressgoprova.go:17 +0x99

main.main()

        /root/Desktop/tuttogoprova/adressgoprova.go:37 +0xd3

exit status 2


查看完整回答
反对 回复 2022-11-28
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

您定义PrivateKey为字节片:

PrivateKey := make([]byte, 32)

该函数Public被定义为将字符串作为其参数:

func Public(PrivateKey string) (publicKey string) {...}

因此Public(PrivateKey)无法工作,因为privateKey类型错误。

我不太确定代码试图做什么,但也许Public(string(PrivateKey))是你需要的?


查看完整回答
反对 回复 2022-11-28
?
holdtom

TA贡献1805条经验 获得超10个赞

正如jochen 的回答所述,您需要先将PrivateKey字节切片转换为字符串,然后再将其发送给Public函数。

一旦完成,就会发生指针取消引用错误,因为您为私有构建的字符串不是有效的bigint.

我通过复制count.String()PrivateKey而不是count.Bytes()

有关存储密钥对的更好方法,请参阅此答案。

这是一些演示所有这些的工作代码。它确实需要cgo,因为原始代码使用它,所以它不会在操场上运行。


查看完整回答
反对 回复 2022-11-28
  • 4 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号