mt logoMyToken
总市值:
0%
恐慌指数:
0%
币种:--
平台 --
ETH Gas:--
EN
USD
APP
Ap Store QR Code

Scan Download

比特币开发指南 - 钱包Wallets

收藏
分享

钱包 Wallets

比特币钱包的实质是私钥收集器。这些私钥被存到一个文件中,甚至可以打印到一片纸上。

Private Key Formats 私钥格式

私钥是用于从一个特定的地址上解锁出 satoshis 。在比特币技术体系中 , 一个私钥的标准格式是一个 256 位的数字 , 在下面的数值之间:

0x1 and 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4141, 展示了几乎整个 2256-1 范围区间 范围 区间 是由 secp256k1 ECDSA 指定的, 比特币 技术体系 使用 这个 加密标准。

Wallet Import Format (WIF) 导入钱包的格式

为了 复制的私钥 不易 发生 错误 ,可以使用 导入钱包的格式 WIF 使用 base58Chec k 编码私钥 , 大大减少 错误 复制的 可能性 , 就像标准的比特币地址。

1. 私钥。

2. 若是主网添加 0 x80 字节 测试网络则为 0xef

3. 延展键执行 sha – 256 哈希

4. 在前述结果上再执行一次 sha - 256 哈希。

5. 第二次哈希值的首个 四字节 ,作为 校验

6. 将第 5 点获得的校验值添加到第 2 所指的扩展键上

7. 使用 Base58Checkencoding 方法将 字符串转换成使用 Base58 编码的 字符串。

使用 Base58 解码功能 很容易使过程可逆,并且去除 填充。

Mini Private Key Format 迷你私钥格式

迷你私钥格式 是一个使用 30 个字符编码 私钥 的方法 , 从而容易把私钥 嵌入在一个小的物理空间 , 实体 比特币的令牌 , 以及抗刮伤的二维 QR

1. 迷你 私钥 的第一个字符是 S

2. 为了 确保 一个迷你私钥 被正确 格式 ,先将 一个问号添加到私钥。

3. 计算 SHA256 散列。如果产生的第一个字节是 “00”, 这是格式良好的。 用这个机制来避免打字失败 在暴力破解过程中使用 随机数 , 直到一个 具备正确格式 的迷你私钥产生。

4. 为了获得完整的私有密钥 , 用户只需要一个 SHA256 散列的原始迷你私钥。这个过程是单向的 :从衍生的秘钥计算 迷你私有密钥 是棘手的

由于其视觉相似“ l , 很多实现不允许的字符 ' 1 ' 的迷你私钥。

.

资源 : 常见创建和赎回这些键的工具是 Casascius 实用程序

Hierarchical Deterministic Key Creation 创建层次确定的钥匙

等级确定的钥匙创建和传输协议 (HD 协议 ) 极大地简化了钱包备份 , 不需要在使用同一钱包的多个程序之间的重复通信,允许创建可以独立运作的子账户,即使孩子帐户被破解了 父账户依然可以监控或控制子账户的能力,并且可以把账户分为“全部权限”或者“限制访问”的,不受信任的用户或程序可以被允许接收或监控支付但不能够花出比特币。

HD 协议利用 ECDSA 协议 公钥创建 函数 point() , 将一个较大的整数 ( 也就是 私钥 ), 转变成一个图点 ( 公钥 ):

point(private_key) == public_key

基于 point() 函数的运行方式 , 可以通过结合已有的父公钥和创建自任意整数的公钥,创建一个子公钥。如果添加整数 i 到最初 ( ) 私钥,由 point ()创建的这个子公钥是相同的, 然后发现剩下的总和除以一个所有比特币软件使用的常量 G (译者注:这个章节翻译的不好)

point( (parent_private_key + i) % G ) == parent_public_key + point(i)

当基于同一个整数序列后,即使不再交流,两个或两个以上的单独程序 , 可以从一个父公私钥匙对上创建出一系列的惟一的子密钥。此外 , 在不用存取私钥的情况下,用来收款的公钥可以分发出去,从而允许在一个可能不安全的公共 WEB 服务器上分发公钥。

通过重复子密钥生成操作,子公钥还可以创建自己的公钥 ( 孙公钥 ):

point( (child_private_key + i) % G ) == child_public_key + point(i)

无论是否生成子公钥或更一步生成子公钥,一个可预测的整数序列值不会比使用对所有交易使用单一公钥更好,尤其是当知晓一个子公钥就能找到的所有从同一父公钥生成的子公钥。其实,基于一个随机种子生成的整数序列,此种方式生成子公钥互不可见的,除非知道这个种子。

HD 协议 使用一个根创建层次化的子钥 , 孙钥,以及其他不可链接 deterministically-generated 整数值。每一子钥也从父钥获得 deterministically-generated 的种子 , 称为 链码 , 即使一个链码被入侵,允许主链码能继续使用 , 比如当一个基于网络的公钥分发项目被黑掉,并不影响此系统。

point( (parent_private_key + lefthand_hash_output) % G ) == child_public_key

point(child_private_key) == parent_public_key + point(lefthand_hash_output)

如前所述 , HD 协议生成公钥的需要 4 个输入值:

·父私钥和父公钥是常规压缩 256 位的 ECDSA 非对称钥匙对。

· 父链码 看上去像是随机 256 位数据。

· 索引值 是一个由程序设定的 32 位整数。

在上图所示的范式 , 父链码 , 父公钥 , 索引值送入一个单向密码散列算法 (HMAC-SHA512) 中产生 512 deterministically-generated-but-seemingly-random 数据。散列输出右侧 256 位作为新的子链码。散列输出的左侧 256 位作为整数值,输入 父私钥 父公钥 , 分别创建一个 子私钥 子公钥 :

point( (parent_private_key + lefthand_hash_output) % G ) == child_public_key

point(child_private_key) == parent_public_key + point(lefthand_hash_output)

指定不同的索引值将从同一父钥创建不同的不可链接子钥。重复的这个进程,将使子钥使用子链码创建不可链接孙钥。

因为创建 子钥 需要钥匙和 链码 ,钥匙和 链码 一起被称为 扩展钥匙 扩展私钥 和其相应的 扩展公钥 相同的链码。 ( 顶级父 ) 主私钥 主链码 来自随机数据 , 如下所示。

128 ,256 位或 512 位的随机数据中创建出根种子。为了使用对应的设置来创建衍生的钥匙,只需要备份根种子的 128 , 以获得每个键由一个特定的钱包程序使用特定的设置。

( 警告 : 在撰写本文时 , 基于 HD 协议的 钱包 程序并不会完全兼容,所以为了获得一个指定的 基本种子 ,用户必须使用相同的钱包软件及其对应的设置。 )

根种子 散列后创建 seemingly-random 512 位数据 , 从根种子起创建出 主私钥 主链码 ( , 主扩展私钥 ) 。使用函数 point ()从 主私钥 创建 主公钥 , 与主链代码 , 主扩展公钥 。主扩展键在功能上相当于其他 扩展键 ; 不同的是他在层次化结构的顶部位置。

Hardened Keys 加固钥匙

加固扩展键解决正常扩展键所引起潜在问题。如果攻击者获得一个正常的父链码和父公钥 , 他能通过强力攻击找到所有的派生出来的链码。如果攻击者也得到一个子私钥 , 孙私钥,以及派生的私钥,他可以使用链码和对应的私钥生成的所有扩展出来私钥。

也许更糟糕的是 , 攻击者可以反向 推导出 正常的孩子私钥 ,从一个子私钥中 减去一个父链码 来恢复父公钥,此种情况见 见上面的插图 所体现 的儿童和父母。这意味着 一个获得了扩展公钥和衍生的私钥的是 可以恢复的公 共的 私钥 ,以及所有衍生出来的钥匙。

基于这个原因 , 扩展链码的公钥应该比标准的公钥更能安全。 users should be advised against exporting even non-extended private keys to possibly-untrustworthy environments (彻底不会翻译)

经过一些权衡 , 加固钥匙的方式修复了常用方式。

在上面部分中描述的,常用的推导公式结合索引值、父代码 , 和父公钥来创建子链码代码和整型值, 整数与父私钥结合来生成子私钥。

免责声明:本文版权归原作者所有,不代表MyToken(www.mytokencap.com)观点和立场;如有关于内容、版权等问题,请与我们联系。
相关阅读