微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何克服“盐必须是字节字符串错误”?

如何解决如何克服“盐必须是字节字符串错误”?

早上好

我正在尝试使用crypto_bitcoinj_seed.py恢复我的Multibit HD种子词,我不知道是否有人使用了crypto_bitcoinj_seed.py,但是在其库中运行另一个称为common的python脚本后,我遇到了错误.py错误raise TypeError('salt must be a byte string')

此python脚本有很多引发错误的机会,因此,如果克服了这个错误,可能还会有其他机会。 (请参阅底部代码。)下面的代码显示了盐错误

C:\python38\decrypt_bitcoinj_seed-master>py decrypt_bitcoinj_seed.py
Traceback (most recent call last):
  File "decrypt_bitcoinj_seed.py",line 319,in <module>
    wallet = load_wallet(wallet_file,get_password)
  File "decrypt_bitcoinj_seed.py",line 132,in load_wallet
    key  = pylibscrypt.scrypt(password.encode('utf_16_be'),salt,olen=32)
  File "C:\python38\lib\site-packages\pylibscrypt\hashlibscrypt.py",line 49,in scrypt
    check_args(password,N,r,p,olen)
  File "C:\python38\lib\site-packages\pylibscrypt\common.py",in check_args
    raise TypeError('salt must be a byte string')
TypeError: salt must be a byte string

有人知道如何编辑盐以使其成为字节字符串吗?还是有更好的选择?另外,由于我对编程的了解很少,所以没关系,为什么脚本需要以下所有内容来破解种子词? -password,olen 好消息是 args 通过的“ check args”密码脚本部分。这是我之前提到的有关引发错误的所有可能性的代码

    if not isinstance(password,bytes):
        raise TypeError('password must be a byte string')
    if not isinstance(salt,bytes):
        raise TypeError('salt must be a byte string')
    if not isinstance(N,numbers.Integral):
        raise TypeError('N must be an integer')
    if not isinstance(r,numbers.Integral):
        raise TypeError('r must be an integer')
    if not isinstance(p,numbers.Integral):
        raise TypeError('p must be an integer')
    if not isinstance(olen,numbers.Integral):
        raise TypeError('length must be an integer')
    if N > 2**63:
        raise ValueError('N cannot be larger than 2**63')
    if (N & (N - 1)) or N < 2:
        raise ValueError('N must be a power of two larger than 1')
    if r <= 0:
        raise ValueError('r must be positive')
    if p <= 0:
        raise ValueError('p must be positive')
    if r * p >= 2**30:
        raise ValueError('r * p must be less than 2 ** 30')
    if olen <= 0:
        raise ValueError('length must be positive')

如果出现其他错误,我将在此发布;但我希望它能正常工作并返回我的原话!

解决方法

序曲

我想我想出了一个解决方案,不仅可以帮助自己,还可以帮助某人。很久以前有同样的问题。我从问题中了解到:

  • 主要目标是恢复您需要的种子(12词短语),以恢复您的钱包并获得完全访问权限 ,尤其是汇款(不要与仅手表钱包模式混淆,就像您使用公用密钥/钱包地址来恢复钱包一样)
  • 解决方案不必与使用Python相关。

我将这个答案献给所有不幸的兄弟,这些兄弟在 MultibitHD 中拥有钱包,该钱包不再受支持(Multibit is Deprecated - Do Not Use),并且由于其未解决而被放弃像这样的问题:

  • 未确认的交易;
  • 钱包定期维修;
  • 同步问题;
  • 输入正确的密码时出错;
  • 备份失败等

指南

我们将使用特殊实用程序,该实用程序以mbexport的形式存储在npm(节点程序包管理器)注册表中。通过npm全局安装mbexport软件包,该软件包可与Node.jsnpm install -g mbexport)一起安装。

接下来,您需要确定文件系统中MultibitHD钱包文件的路径。

通常,对于 Windows ,它是:

C:/ Users / 用户名 / AppData / Roaming / MultiBitHD / wallet-id /mbhd.wallet.aes

对于 MacOS ,它是:

〜/图书馆/应用程序支持/ MultiBitHD / wallet-id /mbhd.wallet.aes

用户名是Windows用户, wallet-id 是唯一的钱包标识符(以 mbhd-开头)

一个小提示:如果您可以进入钱包并知道您可能设置的密码,则可以在MultibitHD应用程序中找到路径。这非常方便,尤其是当您有多个钱包时。只需导航至管理钱包->钱包信息中心

Wallet dashboard

然后,您需要打开命令提示符并在下面输入命令。 钱包路径文件是先前找到的钱包路径。

请注意:我个人没有收到错误打开钱包文件时出错,只有当我将钱包文件从资源管理器中拖到命令提示符中时,它才变成完整的有效路径。我也建议您在获得种子的同时关闭Internet。尽管我没有在mbexport的源代码中找到任何有关在Internet上发送敏感数据的问题,但这是一个简单的安全问题。

mbexport 钱包路径文件

Getting the seed from the wallet file

恭喜,您终于有了种子!不要与任何人共享它,并确保将其安全保存并写在纸上,因为这是您获得资金的关键!

从种子中恢复钱包

尽管这不是问题的一部分,但是您可能想知道如何使用种子来恢复钱包,例如,在Electrum中。请遵循本指南Restoring your MultibitHD Wallet in Electrum,并记住您获得的种子已过时BIP39 format,MultibitHD中的派生路径为 m / 0',地址类型为 p2pkh 。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。