搭建山寨比特币投资网站,拉人进群交流 可这个群里,除了被...

静香

搭建山寨比特币投资网站,拉人进群交流 可这个群里,除了被...


就像我们在银行的账户密码一样,决定比特币一个账户所有权的是与账户相关的三个核心概念:私钥、公钥和比特币地址。比特币钱包和交易与它们息息相关。

(一) 私钥、公钥和钱包地址(比特币地址)之间的关系

每个比特币钱包中包含一系列的密钥对,每个密钥对包括一个私钥和一个公钥。私钥(k)是一个数字,通常是随机选出的。有了私钥,我们就可以使用椭圆曲线乘法这个单向加密函数产生一个公钥(K)。有了公钥(K),我们就可以使用一个单向加密哈希函数生成比特币地址(A)。

事实上,比特币地址可以看作一种公钥。

他们之间的关系如上图所示,私钥可以通过椭圆加密算法生成公钥,公钥可以通过哈希函数生成比特币地址。反之,无法从比特币地址推断生成公钥,也无法从公钥推断生成私钥,这是由后面要介绍的非对称加密算法所实现的。

值得一提的是,掌握私钥就能生成相应的公钥和比特币地址(钱包地址),相当于掌握了整个账户,所以我们一定要保管好自己的私钥。

(二)私钥、公钥和钱包地址(比特币地址)生成流程图:

1. 首先使用随机数发生器生成一个『私钥』。一般来说这是一个256bits的数,拥有了这串数字就可以对相应『钱包地址』中的比特币进行操作,所以必须被安全地保存起来。

2. 『私钥』经过SECP256K1算法处理生成了『公钥』。SECP256K1是一种椭圆曲线算法,通过一个已知『私钥』时可以算得『公钥』,而『公钥』已知时却无法反向计算出『私钥』。这是保障比特币安全的算法基础。

3. 同SHA256一样,RIPEMD160也是一种Hash算法,由『公钥』可以计算得到『公钥哈希』,而反过来是行不通的。

4. 将一个字节的地址版本号连接到『公钥哈希』头部(对于比特币网络的pubkey地址,这一字节为“0”),然后对其进行两次SHA256运算,将结果的前4字节作为『公钥哈希』的校验值,连接在其尾部。

5. 将上一步结果使用BASE58进行编码(比特币定制版本),就得到了『钱包地址』。

比如, 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa

(三)加密算法在比特币钱包和交易中的应用场景。

『私钥』用来生成『公钥』和『钱包地址』,也用来对交易进行签名。拥有了『私钥』就是拥有了对这个钱包余额的一切操作权力。

(1)使用『私钥』对交易进行签名

比特币钱包间的转账是通过交易(Transaction)实现的。交易数据是由转出钱包『私钥』的所有者生成,也就是说有了『私钥』就可以花费该钱包的比特币余额。生成交易的过程如下:

1. 交易的原始数据包括“转账数额”和“转入钱包地址”,但是仅有这些是不够的,因为无法证明交易的生成者对“转出钱包地址”余额有动用的权利。所以需要用『私钥』对原始数据进行签名。

2. 生成“转出钱包公钥”,这一过程与生成『钱包地址』的第2步是一样的。

3. 将“转出签名”和“转出公钥”添加到原始交易数据中,生成了正式的交易数据,这样它就可以被广播到比特币网络进行转账了。

2)使用『公钥』对签名进行验证

交易数据被广播到比特币网络后,节点会对这个交易数据进行检验,其中就包括对签名的校验。如果校验正确,那么这笔余额就成功地从“转出钱包”转移到“转入钱包”了。

(四)生成私钥、公钥、比特币地址的示例代码。

椭圆加密算法使用的是 python 的 ecdsa 库,哈希算法使用的是 hashlib 。 另外没讲到的部分是 base58Checkencode , 这是在表示比特币地址时所用的方法,可以把地址压缩得更短 ,使得表示更为清晰。

(1)首先需要通过终端安装 ecdsa 包(椭圆加密算法库)。

Linux系统:sudo pip install ecdsa

Windows系统:直接下载源码安装。

(2)Python代码:(windows,python2.7 idle)

# -*- coding: UTF-8 -*-

import ecdsa

import ecdsa.der

import ecdsa.util

import hashlib

import os

import re

import struct

b58 = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'

def base58encode(n):

result = ''

while n > 0:

result = b58[n%58] + result

n /= 58

return result

def base256decode(s):

result = 0

for c in s:

result = result * 256 + ord(c)

return result

def countLeadingChars(s, ch):

count = 0

for c in s:

if c == ch:

count += 1

else:

break

return count

def base58CheckEncode(version, payload):

s = chr(version) + payload

checksum = hashlib.sha256(hashlib.sha256(s).digest()).digest()[0:4]

result = s + checksum

leadingZeros = countLeadingChars(result, '0')

return '1' * leadingZeros + base58encode(base256decode(result))

def privateKeyToWif(key_hex):

return base58CheckEncode(0x80, key_hex.decode('hex'))

def privateKeyToPublicKey(s):

sk = ecdsa.SigningKey.from_string(s.decode('hex'), curve=ecdsa.SECP256k1)

vk = sk.verifying_key

return ('04' + sk.verifying_key.to_string()).encode('hex')

def pubKeyToAddr(s):

ripemd160 = hashlib.new('ripemd160')

ripemd160.update(hashlib.sha256(s.decode('hex')).digest())

return base58CheckEncode(0, ripemd160.digest())

def keyToAddr(s):

return pubKeyToAddr(privateKeyToPublicKey(s))

#Generate a random private key

private_key = os.urandom(32).encode('hex')

print "Secret Exponent (Uncompressed) : %s " % private_key

print "Public Key : %s" % privateKeyToPublicKey(private_key)

print "Private Key : %s " % privateKeyToWif(private_key)

print "Address : %s " % keyToAddr(private_key)

(3)输出:

更多交易所入口

一站式注册各大交易所、点击进入加密世界、永不失联,币安Binance/欧易OKX/GATE.IO芝麻开门/Bitget/抹茶MEXC/火币Huobi

点击进入 永不失联

目录[+]