美文网首页
用Python生成交易账号

用Python生成交易账号

作者: 李楠30 | 来源:发表于2018-04-21 16:30 被阅读0次

非对称加密

  • 加密解密使用不同的秘钥,加密的密码无法用来解密,必须成对使用。
  • 通讯双方A/B分别生成自己的公钥/私钥对,把公钥发送给对方。A发送信息时使用B的公钥加密,并使用自己的私钥签名。
  • B收到消息后,用A的公钥检查签名是否是A发出,确认成功后,用私钥解密查看信息。
  • B用A的公钥加密信息,并用自己的私钥签名。
  • 最大缺点是速度慢,效率大大低于常规的对称加密。

生成交易账号的步骤

  1. 生成256位(64字节)私钥
  2. 非对称算法生成公钥
  3. 计算公钥的SHA-256
  4. 计算ripemd-160
  5. 在头上加上地址版本
  6. 计算SHA-256
  7. 计算SHA-256
  8. 取第7步的前4个字节,也就是8个16进制个位数,也就是字符串前8位。
  9. 把第8步的4个字节内容添加到第5步结果后面作为效验
  10. 对第9步的结果做base58编码,得到最终地址

代码示例:

import base58
import binascii as ba
import ecdsa
import hashlib
import random

# 生成钱包地址例子程序

def create_priv_key():
    # 不检查范围,大概率不超标。
    # 要检查的话,范围在[1, 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4141)之间。
    digits = ['%x' % random.randrange(16) for _ in range(64)]
    return ''.join(digits)

def build_pub_key(priv_key):
    buff = bytes.fromhex(priv_key)
    sk = ecdsa.SigningKey.from_string(buff,
                                      curve=ecdsa.SECP256k1)
    pub_key = b'\x04' + sk.verifying_key.to_string()
    return ba.b2a_hex(pub_key).decode()

def sha256(key):
    sha = hashlib.sha256(bytes.fromhex(key))
    return ba.hexlify(sha.digest()).decode()

def ripemd160(key):
    rm = hashlib.new('ripemd160')
    rm.update(bytes.fromhex(key))
    return ba.hexlify(rm.digest()).decode()

# 1. 生成256位(64字节)私钥
# priv_key = create_priv_key()
priv_key = '18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725'
# priv_key = 'ccea9c5a20e2b78c2e0fbdd8ae2d2b67e6b1894ccb7a55fc1de08bd53994ea64'
print('1. 私钥:%s' % priv_key)
# 2. 生成公钥
pub_key = build_pub_key(priv_key)
print('2. 公钥:%s' % pub_key)
# 3. 计算sha-256
r_3 = sha256(pub_key)
print('3. 公钥的sha-256:%s' % r_3)
# 4. 计算ripemd-160
r_4 = ripemd160(r_3)
print('4. 对第3步求ripemd-160:%s' % r_4)
# 5. 加入地址版本号,使用比特币主网0x00。
r_5 = '00' + r_4
print('5. 在第4步结果前面添加协议代码:%s' % r_5)
# 6. 计算第5步的sha-256
r_6 = sha256(r_5)
print('6. 对第5步求sha-256:%s' % r_6)
# 7. 计算第6步的sha-256
r_7 = sha256(r_6)
print('7. 对第6步求sha-256:%s' % r_7)
# 8. 取第7步的前4个字节,也就是8个16进制个位数,也就是字符串前8位。
r_8 = r_7[:8]
print('8. 第7步的前4个字节:%s' % r_8)
# 9. 把这4个字节内容添加到第5步结果后面作为校验
r_9 = r_5 + r_8
print('9. 把第8步的结果添加到第5步的结果作为校验:%s' % r_9)
# 10. 对第9步的结果做base58编码,得到最终地址。
addr = base58.b58encode(bytes.fromhex(r_9))
print('10. 钱包地址: %s' % addr)

相关文章

网友评论

      本文标题:用Python生成交易账号

      本文链接:https://www.haomeiwen.com/subject/wswxlftx.html