文章
问答
讲堂
百科图谱
线下集训
更多
提问
发表文章
专栏
活动
文档
工作
集市
发现
Toggle navigation
文章
问答
讲堂
线下集训
专栏
活动
工作
文档
集市
搜索
登录/注册
求大神,如何从一笔交易的签名中还原出公钥?
如何从一笔交易的签名中还原出公钥,我尝试好几次最后还是没成功,求大神指教
如何从一笔交易的签名中还原出公钥,我尝试好几次最后还是没成功,求大神指教
0 条评论
请先
登录
后评论
默认排序
时间排序
2 个回答
枫叶?
- 开发工程师
2024-02-14 15:39
是想从编程角度还是从密码学角度?编程的话是eth还是其他的代币?如果是eth的话,调用下库就行了。 ``` javascript const ethers = require('ethers'); async function recoverPublicKey() { // 创建一个随机钱包 const wallet = ethers.Wallet.createRandom(); // 签名消息 const message = "Hello, world!"; const signature = await wallet.signMessage(message); // 从签名中恢复公钥 const publicKey = ethers.utils.recoverPublicKey(signature, ethers.utils.hashMessage(message)); console.log('Recovered public key:', publicKey); console.log('Original public key:', wallet.publicKey); } recoverPublicKey();
请先
登录
后评论
xiaoyangguang
2024-02-15 16:33
``` package main import ( "bytes" "crypto/ecdsa" "fmt" "log" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/crypto" ) func main() { privateKey, err := crypto.HexToECDSA("fad9c8855b740a0b7ed4c221dbad0f33a83a49cad6b3fe8d5817ac83d38b6a19") if err != nil { log.Fatal(err) } publicKey := privateKey.Public() publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey) if !ok { log.Fatal("cannot assert type: publicKey is not of type *ecdsa.PublicKey") } publicKeyBytes := crypto.FromECDSAPub(publicKeyECDSA) data := []byte("hello") hash := crypto.Keccak256Hash(data) fmt.Println(hash.Hex()) // 0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8 signature, err := crypto.Sign(hash.Bytes(), privateKey) if err != nil { log.Fatal(err) } fmt.Println(hexutil.Encode(signature)) // 0x789a80053e4927d0a898db8e065e948f5cf086e32f9ccaa54c1908e22ac430c62621578113ddbb62d509bf6049b8fb544ab06d36f916685a2eb8e57ffadde02301 sigPublicKey, err := crypto.Ecrecover(hash.Bytes(), signature) if err != nil { log.Fatal(err) } matches := bytes.Equal(sigPublicKey, publicKeyBytes) fmt.Println(matches) // true sigPublicKeyECDSA, err := crypto.SigToPub(hash.Bytes(), signature) if err != nil { log.Fatal(err) } sigPublicKeyBytes := crypto.FromECDSAPub(sigPublicKeyECDSA) matches = bytes.Equal(sigPublicKeyBytes, publicKeyBytes) fmt.Println(matches) // true signatureNoRecoverID := signature[:len(signature)-1] // remove recovery id verified := crypto.VerifySignature(publicKeyBytes, hash.Bytes(), signatureNoRecoverID) fmt.Println(verified) // true } ```
请先
登录
后评论
您需要登录后才可以回答问题,
登录
关注
2
关注
收藏
0
收藏,
1337
浏览
我是一棵水
提出于 2024-02-14 14:39
×
发送私信
请将文档链接发给晓娜,我们会尽快安排上架,感谢您的推荐!
发给:
内容:
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因: