首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用geth的ecRecover来验证TREZOR的签名消息?

如何使用geth的ecRecover来验证TREZOR的签名消息?
EN

Ethereum用户
提问于 2018-02-09 22:03:46
回答 1查看 1.6K关注 0票数 1

我不能让它起作用。我从了解到,TREZOR在签名之前添加了消息的神奇消息和十六进制消息长度(而不是ASCII长度)。

在发送到geth进行验证之前,是否不可能通过预先处理相同的数据来操作给定的明文消息?

EN

回答 1

Ethereum用户

回答已采纳

发布于 2018-02-09 23:42:33

我怀疑您不能使用geth的web3.personal.ecRecover函数来完成这个任务,因为它会自动添加前缀的样式。但只要添加正确的前缀TREZOR样式,就可以使用ecrecover的任何底层实现,比如web3.js中的实现。下面的代码使用web3.js和空灵验证签名:

代码语言:javascript
复制
const Web3 = require('web3');

const web3 = new Web3(null);

const message = '3fehlpNqurkHvsEGXYVvDvh5xlxRHQMe';
const signerAddress = '0x3278312c573f9c0ced9b3c381b428f1821de29a4';
const signedMessage = '0x6b673ad119bfba39788be3ea8ada062b74c15806a5d0520e3294817a87884a776b835dd5177f64449bd2a9445fa763ef3c3530000f317e15be54fd02480385921b';

// NOTE: Proper varint encoding is necessary for larger lengths.
const prefix = '\x19Ethereum Signed Message:\n' +
               String.fromCharCode(message.length);
const stringToSign = prefix + message;

const recovered = web3.eth.accounts.recover(web3.utils.keccak256(stringToSign),
    signedMessage);

if (recovered.toLowerCase() == signerAddress.toLowerCase()) {
    console.log('Address recovered successfully via web3.js.');
}

const ethUtil = require('ethereumjs-util');

const sig = ethUtil.fromRpcSig(signedMessage);

const publicKey = ethUtil.ecrecover(ethUtil.sha3(stringToSign),
    sig.v, sig.r, sig.s);

const recovered2 = ethUtil.bufferToHex(ethUtil.pubToAddress(publicKey));
if (recovered2.toLowerCase() == signerAddress.toLowerCase()) {
    console.log('Address recovered successfully via ethereumjs-util.');
}
票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/39151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档