以太坊私钥介绍及生成与验证

1)私钥格式

Bitcoin私钥(或其他加密货币私钥)有32 bytes,(或256个bit),或者其他形式表示,Base64 string、a WIF key、助记词

2)为什么是32bytes

比特币使用 ECDSA 或椭圆曲线数字签名算法。更具体地说,它使用称为 secp256k1 的特定曲线。这条曲线的阶数为 256 位,以 256 位为输入,输出 256 位整数。而 256 位正好是 32 字节。对私钥有额外的要求。因为我们使用ECDSA,所以key应该是正数,并且应该小于曲线的阶数

3)生成方法

3.1)原生方法

import random
bits = random.getrandbits(256) #返回具有指定位数的整数,返回的是十进制
# 30848827712021293731208415302456569301499384654877289245795786476741155372082
bits_hex = hex(bits)  # 字符串格式
# 0x4433d156e8c53bf5b50af07aa95a29436f29a94e0ccc5d58df8e57bdc8583c32
private_key = bits_hex[2:]  # 去掉字符串的0x
# 4433d156e8c53bf5b50af07aa95a29436f29a94e0ccc5d58df8e57bdc8583c32

该方法不适合用于加密货币,因为该方法不安全;该方法基于随机数种子生成,如果知道生成时的时间,容易被暴力破解。

3.2)加强版RNG

import secrets
bits = secrets.randbits(256)
# 46518555179467323509970270980993648640987722172281263586388328188640792550961
bits_hex = hex(bits)
# 0x66d891b5ed7f51e5044be6a7ebe4e2eae32b960f5aa0883f7cc0ce4fd6921e31
private_key = bits_hex[2:]
# 66d891b5ed7f51e5044be6a7ebe4e2eae32b960f5aa0883f7cc0ce4fd6921e31

3.3)有些网站会为您生成随机数

一个是 random.org,一个著名的通用随机数生成器。另一个是 bitaddress.org,它是专门为比特币私钥生成而设计的。

3.4)完整代码

私钥 ——> 公钥 ——> 钱包地址

import codecs
import ecdsa
from Crypto.Hash import keccak

class EthereumWallet:
    @staticmethod
    def generate_address(private_key):
        public_key = EthereumWallet.__private_to_public(private_key)
        address = EthereumWallet.__public_to_address(public_key)
        return address
    
    @staticmethod
    def checksum_address(address):
        checksum = '0x'
        # Remove '0x' from the address
        address = address[2:]
        address_byte_array = address.encode('utf-8')
        keccak_hash = keccak.new(digest_bits=256)
        keccak_hash.update(address_byte_array)
        keccak_digest = keccak_hash.hexdigest()
        for i in range(len(address)):
            address_char = address[i]
            keccak_char = keccak_digest[i]
            if int(keccak_char, 16) >= 8:
                checksum += address_char.upper()
            else:
                checksum += str(address_char)
        return checksum
    
    @staticmethod
    def __private_to_public(private_key):
        private_key_bytes = codecs.decode(private_key, 'hex')
        # Get ECDSA public key
        key = ecdsa.SigningKey.from_string(private_key_bytes, curve=ecdsa.SECP256k1).verifying_key
        key_bytes = key.to_string()
        public_key = codecs.encode(key_bytes, 'hex')
        return public_key
    
    @staticmethod
    def __public_to_address(public_key):
        public_key_bytes = codecs.decode(public_key, 'hex')
        keccak_hash = keccak.new(digest_bits=256)
        keccak_hash.update(public_key_bytes)
        keccak_digest = keccak_hash.hexdigest()
        # Take last 20 bytes
        wallet_len = 40
        wallet = '0x' + keccak_digest[-wallet_len:]
        return wallet
# 使用
import blocksmith

key = '7077da4a47f6c85a21fe6c6cf1285c0fa06915871744ab1e5a5b741027884d00'

address = blocksmith.EthereumWallet.generate_address(key)
print(address)
# 0x1269645a46a3e86c1a3c3de8447092d90f6f04ed

checksum_address = blocksmith.EthereumWallet.checksum_address(address)
print(checksum_address)
# 0x1269645a46A3e86c1a3C3De8447092D90f6F04ED

参考github链接

经过测试,结果正确!

Note: 如有侵权,请联系删除

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以太坊地址和公是通过椭圆曲线加密算法生成的。在以太坊中,每个账户都有一个唯一的以太坊地址和公以太坊的公也是通过椭圆曲线加密算法生成的。用于对数据进行加密,公用于对数据进行解密。 下面是一个简单的示例,展示如何使用以太坊的公对数据进行加解密: 1. 生成以太坊中,可以使用任何一个以太坊钱包生成。例如,可以使用 MetaMask 钱包生成。 2. 加密数据 要加密数据,可以使用以太坊的公。以下是一个示例加密函数: ```solidity function encrypt(string memory message, address publicKey) public view returns (bytes32) { bytes32 encrypted = keccak256(abi.encodePacked(message, publicKey)); return encrypted; } ``` 在这个函数中,我们使用 keccak256 哈希函数对消息和公进行加密。 3. 解密数据 要解密数据,可以使用以太坊的公。以下是一个示例解密函数: ```solidity function decrypt(bytes32 encrypted, address privateKey) public view returns (string memory) { bytes32 decrypted = keccak256(abi.encodePacked(encrypted, privateKey)); return string(decrypted); } ``` 在这个函数中,我们使用 keccak256 哈希函数对加密后的消息和进行解密。 请注意,这只是一个简单的示例,实际上在以太坊中使用公进行加解密需要更多的安全措施和实现细节。建议在使用以太坊的公进行加解密时,始终遵循最佳实践和安全标准。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值