物理比特币如何得到里面的私匙
比特币的私钥就是随机的256位数字,由0和1组成的二进制数字。这串数字是由可靠的随机数生成器生成。
然后把这些2进制数转换成16进制,再转换成大写字母就获得了现在比特币钱包客户端中导出的私钥格式.
或者对这个256位二进制数再进行哈希256得到的结果也可以用来当作私钥。
bitcoin计算blockquan Hash
bitcoin的创世块的数据是已 hard code的形式写在源码里,
之后的blockquan hash都是通过固定的方式计算出来的. 怎么计算出来呢?
每一个blockquan都有:
version 即网络节点的版本号
prev_blockquan 前一个块的hash,创世块没有,以后的块都有
mrkl_root , 是 Merkle tree , 即默克尔树
time 即时间戳,当前时间
bits 网络的难度
nonce 随机数
这个 nonce 就是 Pow 要计算的随机量 , 区别是要计算2次hash.
先把 version prev_blockquan mrkl_root time bits nonce 当做字符串合并到一起, 得到结果 result . 得到 result 后, 做2次 sha256运算, 得到 hash , 再然后 hash 做大小端转换, 最后的结果就是这个blockquan的hash.
不过 version time bits nonce 要转换为 unsigned long型小字端,
prev_blockquan mrkl_root 要转换为16进制并大小端转换, 这一步确实很麻烦.
测试下 height=1 的 blockquan hash值
挖矿做的工作
在一个blockquan的结构中, version prev_blockquan mrkl_root time bits 都是很容易计算的. 只有 nonce 这个随机数不确定.
bitcoin的 pow 就是 找到一个合适的 nonce , 使得 version prev_blockquan mrkl_root time bits nonce 合并的结果 reuslt ,再经过2次sha256计算, 达到一个符合bitcoin网络难度的数值. bitcoin的网络难度通过 bits计算, 难度即最后计算的hash的前n位是零.
每一个blockquan hash的计算, 都包含了prev_blockquan_hash,这也是链的体现, 增加了攻击bitcoin的难度. 如果有人改了一个blockquan的hash, 这个块之后的所有的块hash都要重新计算.
python处理字节序
参考:
https://en.bitcoin.it/wiki/blockquan_hashing_algorithm
http://www.righto.com/2014/02/bitcoin-mining-hard-way-algorithms.html
https://en.bitcoin.it/wiki/Difficulty
https://bitcoin.org/en/developer-guide#term-merkle-tree
比特币私钥是52位还是64
比特币私钥是64位,WIFI格式是52位
比特币私钥是一个256位的随机数,通过SHA-256算法产生。比特币私钥的定义非常简单,一个是256位(256个二进制数字)另一个是随机数,意思是这个数的产生没有规律。
比特币私钥是一个数字,这个数字可以取从0到2___-1之间的任意值。
BTC之随机数生成
有两个最主要的方法来生成随机数:
a) 通过测量某些随机的物理现象,然后补偿测量过程中可能出现的偏差。比如大气噪声、热噪声和其他外部电磁以及量子现象。从自然资源中获取熵的速度取决于被测量的潜在物理现象,因此它们的速率是有限的,往往比较慢。
b) 使用计算算法,可以产生明显随机结果的长序列,实际上由较短的初始值(称为种子)确定。结果是,如果种子的值是已知的,整个看似随机的序列可以被重复产生。这类随机数生成器被称为伪随机数生成器。这类生成器类型是非阻塞的,可以大量产生数据。
/dev/random 可以用作随机数生成器或者伪随机数生成器,取决于不同的实现。
在linux下,随机数生成器有一个容纳噪声数据的熵池,在读取时,/dev/random设备会返回小于熵池噪声总数的随机字节。/dev/random可生成高随机性的 公钥 或 一次性密码本 。若熵池空了,对/dev/random的读操作将会被 阻塞 ,直到收集到了足够的环境噪声为止。这样的设计使得/dev/random是真正的 随机数发生器 ,提供了最大可能的随机数据熵,建议在需要生成高强度的密钥时使用。
/dev/urandom(“unblockquaned”,非阻塞的随机数发生器),它会重复使用熵池中的数据以产生伪随机数据。这表示对/dev/urandom的读取操作不会产生阻塞,但其输出的熵可能小于/dev/random的。它可以作为生成较低强度密码的伪随机数生成器,不建议用于生成高强度长期密码。
FreeBSD操作系统实现了256位的Yarrow算法变体,以提供伪随机数流。与Linux的/dev/random不同,FreeBSD的/dev/random不会产生阻塞,与Linux的/dev/urandom相似,提供了密码学安全的伪随机数发生器,而不是基于熵池。而FreeBSD的/dev/urandom则只是简单的链接到了/dev/random。
OpenSSL的提供了RAND_bytes方法生成随机数。在使用之前需要使用RAND_add向PRNG中添加种子及熵值。种子可以通过TSC生成。
CryptoAPI提供了CryptGenRandom方法产生随机数。CryptGenRandom已经被废弃,应该使用新版CNG API:BCryptGenRandom
CPU指令rdrand从芯片的硬件随机数生成器中获取随机数
32位:
64位:
BTC采用了多种方式混合的形式,将OpenSSL随机数生成、OS随机数生成、硬件随机数生成再混淆随机数发生器的状态来生成强随机数。
参考文档:
https://zh.wikipedia.org/wiki//dev/random
https://www.openssl.org/docs/man1.0.2/crypto/RAND_seed.html
https://zh.wikipedia.org/zh-hans/RdRand
比特币如何防止伪造交易记录?
(本文在观看李永乐老师视频讲解基础上整理)
防止伪造记录是比特币的一个重要特点,电子签名技术就是防伪的关键。
当一个比特币用户注册的时候会产生一个随机数,随之会产生一个私钥,紧接着生成公钥和地址。
接下来以“A转给B十个比特币”作为案例,看一下比特币的交易是如何防伪的。
Step1:A编写交易记录并对信息加密
Step2:A将“交易信息、公钥、地址”进行全网广播
Step3:全网对A广播出来的信息进行验证
验证的过程就是全网对广播出来的交易信息进行哈希运算,并得出一个摘要。然后用广播出来的公钥和密码进行解密,也得出一个摘要。
对这两个摘要进行对比,如果相同,信息为真,如果不同,信息为假。
以上就是比特币对信息验证的过程。
结语
1、? 比特币防伪采取了电子签名技术;
2、? 私钥加密,公钥解密;
3、? 对广播出来的信息,全网会进行信息验证,验证通过代表信息真实,否则信息伪造。
参考文献
[1]微博 @李永乐老师