热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

BTC不同格式私钥的相互转换

BTC不同格式私钥的相互转换前言:众所周知,比特币常见到的私钥格式有三种,分别是16进制格式的,WIF格式,以及WIF压缩格式。它们的本质是一样的,但是它们之间应该如何进行转换呢?

BTC不同格式私钥的相互转换

前言:众所周知,比特币常见到的私钥格式有三种,分别是16进制格式的,WIF格式,以及WIF压缩格式。它们的本质是一样的,但是它们之间应该如何进行转换呢?请看正文~

这里以 精通BTC一书中的例子做转换介绍,原始数据如下:

//16进制私钥
1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aedd
//WIF压缩格式私钥
KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ
//WIF格式私钥
5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn

一 16进制格式的私钥转换成WIF格式

  1. 在16进制私钥前面加上0x80版本号,如下:

    801e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aedd

  2. 对第1步结果进行SHA256哈希计算,如下:

    f7d98762db7267f6f9283156058333dce856036ae0a0b4741046d25058747739

  3. 将第2步结果进行SHA256哈希计算,如下:

    c47e83ffafda3ba4396e1bc6a648515e5fc9aa95910af6a4429537b87fb7b474

  4. 取第3步结果的前4字节(c47e83ff),加到第1步结果的末尾,如下:

    801e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aeddc47e83ff

  5. 对第4步结果进行Base58编码,就是最后得到的WIF格式私钥了,如下:

    5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn

java代码转换实现如下:

package com.example.blockchain.test;
import org.bitcoinj.core.Base58;
import org.bouncycastle.util.encoders.Hex;
import party.loveit.bip44forjava.core.Sha256Hash;
public class Test {
public static void main(String[] args) {
//16进制私钥:1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aedd
//WIF压缩格式私钥:KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ
//WIF非压缩格式私钥:5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn
//1.在16进制私钥前面加上0x80版本号
String hex = "801e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aedd";
//2.对第1步结果进行SHA256哈希计算
byte[] hash1 = Sha256Hash.hash(Hex.decode(hex));
//3.将第2步结果进行SHA256哈希计算
byte[] hash2 = Sha256Hash.hash(hash1);
//4.取第3步结果的前4字节(c47e83ff),加到第1步结果的末尾
String result = hex + Hex.toHexString(hash2).substring(0, 8);
//5.对第4步结果进行Base58编码
System.out.println(Base58.encode(Hex.decode(result)));
}
}

说明:可能会有人疑惑,为什么生成的私钥是 5J3mBbAH58CpQ3Y5RNJpUKPE62SQ5tfcvU2JpbnkeyhfsYB1Jcn 而不是 KxFC1jmwwCoACiCAWZ3eXa96mBM6tb3TYzGmf6YwgdGWZgawvrtJ 呢?那么,又该如何生成 K 开头的私钥呢,其实很简单 -> 只需在原始16进制格式私钥的后面加上01即可,加上01表示该私钥是压缩格式的。特别说明:

  • 原始格式 32 字节,256位的0或者1
  • hex格式,hex格式又分为压缩和非压缩,压缩和非压缩的区别在于 -> 压缩格式 = 非压缩格式 + 01 ,所以说压缩格式并不是真的压缩了,反而多了一个后缀01
  • WIF(wallet-import-format)格式,5开头
  • WIF-compressed(WIF压缩格式),K 或者 L 开头

二 WIF格式私钥转换成16进制格式私钥

假如你耐心看完了上面的转换,相信反过来也明白了,我就简单说明一下吧:

  1. Base58解码;
  2. 将解码结果去掉80版本号,以及去掉最后面的4字节校验位。

OK,搞定!


推荐阅读
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • 本题探讨了在大数据结构背景下,如何通过整体二分和CDQ分治等高级算法优化处理复杂的时间序列问题。题目设定包括节点数量、查询次数和权重限制,并详细分析了解决方案中的关键步骤。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 本文介绍 Java 中如何使用 Year 类的 atMonth 方法将年份和月份组合成 YearMonth 对象,并提供代码示例。 ... [详细]
  • 深入解析动态代理模式:23种设计模式之三
    在设计模式中,动态代理模式是应用最为广泛的一种代理模式。它允许我们在运行时动态创建代理对象,并在调用方法时进行增强处理。本文将详细介绍动态代理的实现机制及其应用场景。 ... [详细]
  • Python 工具推荐 | PyHubWeekly 第二十一期:提升命令行体验的五大工具
    本期 PyHubWeekly 为大家精选了 GitHub 上五个优秀的 Python 工具,涵盖金融数据可视化、终端美化、国际化支持、图像增强和远程 Shell 环境配置。欢迎关注并参与项目。 ... [详细]
  • 深入解析ArrayList与LinkedList的差异
    本文详细对比了Java中ArrayList和LinkedList两种常用集合类的特性、性能及适用场景,通过代码示例进行测试,并结合实际应用场景分析其优缺点。 ... [详细]
  • 本文深入探讨了 Java 中 LocalTime 类的 isSupported() 方法,包括其功能、语法和使用示例。通过具体的代码片段,帮助读者理解如何检查特定的时间字段或单位是否被 LocalTime 类支持。 ... [详细]
  • 为了解决不同服务器间共享图片的需求,我们最初考虑建立一个FTP图片服务器。然而,考虑到项目是一个简单的CMS系统,为了简化流程,团队决定探索七牛云存储的解决方案。本文将详细介绍使用七牛云存储的过程和心得。 ... [详细]
  • 由二叉树到贪心算法
    二叉树很重要树是数据结构中的重中之重,尤其以各类二叉树为学习的难点。单就面试而言,在 ... [详细]
  • 在寻找轻量级Ruby Web框架的过程中,您可能会遇到Sinatra和Ramaze。两者都以简洁、轻便著称,但它们之间存在一些关键区别。本文将探讨这些差异,并提供详细的分析,帮助您做出最佳选择。 ... [详细]
  • 本文介绍了一个经典的算法问题——活动选择问题,来源于牛客网的比赛题目。该问题要求从一系列活动集合中选出最多数量的相容活动,确保这些活动的时间段不重叠。 ... [详细]
author-avatar
寒落落
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有