热门标签 | 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,搞定!


推荐阅读
  • 数组的排序:数组本身有Arrays类中的sort()方法,这里写几种常见的排序方法。(1)冒泡排序法publicstaticvoidmain(String[]args ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • MPLS VP恩 后门链路shamlink实验及配置步骤
    本文介绍了MPLS VP恩 后门链路shamlink的实验步骤及配置过程,包括拓扑、CE1、PE1、P1、P2、PE2和CE2的配置。详细讲解了shamlink实验的目的和操作步骤,帮助读者理解和实践该技术。 ... [详细]
  • 面向对象之3:封装的总结及实现方法
    本文总结了面向对象中封装的概念和好处,以及在Java中如何实现封装。封装是将过程和数据用一个外壳隐藏起来,只能通过提供的接口进行访问。适当的封装可以提高程序的理解性和维护性,增强程序的安全性。在Java中,封装可以通过将属性私有化并使用权限修饰符来实现,同时可以通过方法来访问属性并加入限制条件。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
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社区 版权所有