V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xu2060
V2EX  ›  Bitcoin

关于比特币钱包恢复问题

  •  
  •   xu2060 · 2021-10-24 15:31:04 +08:00 · 1436 次点击
    这是一个创建于 1132 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我使用的 bither 冷钱包,创建了一个普通私钥账户,导出了私钥明文。 请问各位,这个私钥明文如何转换成 12 个单词的助记词,或者说什么钱包支持私钥明文恢复钱包。

    10 条回复    2021-10-28 08:58:42 +08:00
    funbox
        1
    funbox  
       2021-10-25 09:51:25 +08:00
    发来我帮你看看~
    acess
        2
    acess  
       2021-10-25 20:22:00 +08:00
    你说的是 K/L/5 开头的一大长串 base58 (大小写混合字母+数字)么?
    这个私钥就是单个的私钥,并不存在什么转换成 12 个单词的助记词。(当然你可以把这个私钥 hash 一下作为助记词的 raw entropy ,然而这并没有什么 X 用,因为没有相关标准,并没有其他软件支持这个玩法)

    12 个单词的助记词,一般是 BIP39 助记词,它是 HD 钱包的种子,HD 钱包里的所有私钥都是它派生出来的。

    但是助记词这个东西,业内的情况比较蛋疼,BIP39 是“事实上的标准”,但诞生之初就有人反对,还有其他钱包做出来共用同一套英文单词表、但定义不一样的其他助记词标准,然后状况就变得更混乱了……
    acess
        3
    acess  
       2021-10-25 20:32:56 +08:00
    K/L/5 开头的这个叫 wallet import format ( WIF )。我记得支持这个的钱包应该还是有不少的,比如 electrum 、mycelium 都支持。

    不过 electrum 之前还干过一个蛋疼的事情。
    BTC 有了隔离见证之后,同一个私钥可以得到 3 种(常用的)地址,也就是最经典的 1 开头的 P2PKH 、bc1 开头的“原生隔离见证地址”、3 开头的“兼容隔离见证地址”。
    bitcoin core 一开始就是一个私钥同时用来生成这 3 种地址,但 electrum 觉得这样不好。虽然后来 bitcoin core 开发者也被说服了,然并 X ,这种用法从一开始就存在而且还会永远存在下去。
    electrum 他们觉得,一个私钥就应该有专门的用途,原先 1 开头地址的私钥就不应该用来生成 3 或 bc1 开头的地址,反之亦然,于是他们就给隔离见证定义了新的 WIF 版本号,于是就产生了一种不被兼容的 WIF 格式私钥,只有 electrum 自己能识别,别的钱包都不认这种私钥。
    后来他们放弃了这种做法,但肯定已经有人生成了这种不兼容的 WIF……于是这种不兼容的 WIF 至少 electrum 自己还是得继续支持下去。
    现在 electrum 则是改变了做法,导出或导入私钥的时候,可以在私钥前面加上类似 p2wpkh:这样的前缀,来指定要生成的是哪种地址。但我印象里 electrum 这么干了,其他钱包也未必会支持……哎。
    acess
        4
    acess  
       2021-10-25 20:37:10 +08:00
    还有,同一个私钥,公钥有压缩和非压缩之分,很显然对应的地址也不一样。最早的时候,没想到可以用压缩公钥,后来因为压缩公钥占字节数少就开始改用压缩的。
    隔离见证规定公钥必须是压缩的。私钥本身在密码学上并没有所谓压缩和非压缩之分,但 WIF 格式还是规定,如果私钥在 payload 末尾加上一个 0x01 字节,就标记这个私钥生成的公钥是压缩的。然后 K/L 开头的就是这种会生成压缩公钥的私钥,5 开头则是不压缩的。
    xu2060
        5
    xu2060  
    OP
       2021-10-26 15:05:12 +08:00
    @acess #4 感谢你的回答 非常全面。
    ps:
    这两天我也找到了问题的答案 现在来说 huobi wallet 支持单个私钥导入钱包。这是第一种恢复方式
    第二种麻烦点:
    bitcoinjs-lib 用这个 js 库来完成操作
    const keyPair = ECPair.fromWIF("私钥明文")
    const { address } = btc.payments.p2pkh({ pubkey: keyPair.publicKey });
    然后进行接下来的操作.....
    jayLink
        6
    jayLink  
       2021-10-27 20:20:25 +08:00
    @acess 讲的挺好的,老哥学过密码学的样子,区块链方面的学习有什么途径推荐吗,书籍,开源 etc...
    jayLink
        7
    jayLink  
       2021-10-27 20:26:12 +08:00
    @acess 有个疑问,如果按照 BIP39 助记词是 2048 个单词表里随机抽取的 12 个单词作为助记词,采用暴力穷举的方式,是不是和有可能导入别人的钱包,把别人的币转走
    acess
        8
    acess  
       2021-10-28 03:07:27 +08:00
    @jayLink 额……并没有专门学过这方面……但是可以读精通比特币这本书、还可以搜 bitcoin wiki 、维基百科、bitcoin stackexchange 之类的……

    从 2048 个单词表里抽取 12 个单词,2048^12=2^132 ,可以编码表示 132bit 的数据; BIP39 是把这 132bit 的最后 4bit 拿去做 checksum ,前 128bit 才是随机生成的 raw entropy 。(后 4bit 是前 128bit 推算出来的)
    128bit 的强度其实已经和比特币用的 ECDSA secp256k1 数字签名等同。没错,虽然比特币私钥确实是 256bit 这么长,但毕竟这是非对称加密,只相当于 128bit 对称密钥的强度(我记得内在的原理还是生日攻击,但具体咋回事就不懂了)

    所以说 12 单词的 BIP39 助记词已经足够安全了……(当然前提是生成助记词的随机数源靠谱,以及自己没有泄漏被骗什么的)

    还有,老款的 trezor ( trezor one ,没有触屏)我记得就是为了防止键盘记录木马而打乱单词输入顺序,才用了 24 单词的 BIP39 。后来 trezor model t 有触屏了,不依赖电脑输入助记词了,于是就改成(默认) 12 单词了。(而且对于 trezor one ,后来也新加了远比打乱单词顺序更靠谱的“高级恢复”,也就是打乱键盘。打乱单词顺序能提供的熵我记得是差一点到 80bit ,比 128bit 还是减弱了不少,打乱键盘就不会像这样减弱强度了)。
    acess
        9
    acess  
       2021-10-28 03:10:59 +08:00
    @jayLink (啊,哈希其实也是数字签名必不可少的一个部分来着……比特币签名交易时用的哈希也是 256bit 的,于是我记得之前看到过,很显然因为生日攻击的存在,256bit 的哈希只有 128bit 的抗碰撞强度,所以从这个角度也可以说比特币系统只有 128bit 这个强度的安全性……)
    xu2060
        10
    xu2060  
    OP
       2021-10-28 08:58:42 +08:00
    @jayLink #6 我这有一个可以看看,我觉得讲的不错
    [北京大学肖臻老师《区块链技术与应用》公开课-哔哩哔哩] https://b23.tv/YiNdHx
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2719 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 15:26 · PVG 23:26 · LAX 07:26 · JFK 10:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.