非对称加密
- 加密解密使用不同的秘钥,加密的密码无法用来解密,必须成对使用。
- 通讯双方A/B分别生成自己的公钥/私钥对,把公钥发送给对方。A发送信息时使用B的公钥加密,并使用自己的私钥签名。
- B收到消息后,用A的公钥检查签名是否是A发出,确认成功后,用私钥解密查看信息。
- B用A的公钥加密信息,并用自己的私钥签名。
- 最大缺点是速度慢,效率大大低于常规的对称加密。
生成交易账号的步骤
- 生成256位(64字节)私钥
- 非对称算法生成公钥
- 计算公钥的SHA-256
- 计算ripemd-160
- 在头上加上地址版本
- 计算SHA-256
- 计算SHA-256
- 取第7步的前4个字节,也就是8个16进制个位数,也就是字符串前8位。
- 把第8步的4个字节内容添加到第5步结果后面作为效验
- 对第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)
网友评论