Copyright © 2022-2024 aizws.net · 网站版本: v1.2.6·内部版本: v1.23.3·
页面加载耗时 0.00 毫秒·物理内存 63.6MB ·虚拟内存 1300.0MB
欢迎来到 AI 中文社区(简称 AI 中文社),这里是学习交流 AI 人工智能技术的中文社区。 为了更好的体验,本站推荐使用 Chrome 浏览器。
比特币地址的组成: 【版本 + 公钥哈希 + 校验和】,长度为26位到34位。
package main import ( "bytes" "crypto/ecdsa" "crypto/elliptic" "crypto/rand" "crypto/sha256" "log" "fmt" "golang.org/x/crypto/ripemd160" "github.com/btcsuite/btcutil/base58" ) const walletVersion = byte(0x00) // 钱包版本 const addressChecksumLen = 4 // 验证码长度 // 钱包 type Wallet struct { PrivateKey ecdsa.PrivateKey PublicKey []byte } // 初始化钱包 func NewWallet() *Wallet { private, public := newKeyPair() wallet := Wallet{private, public} return &wallet } // 得到比特币地址 func (w Wallet) GetAddress() string { // ripemd160(sha256(publickey)) pubKeyHash := HashPubKey(w.PublicKey) // 最前面添加一个字节的版本信息 walletVersionedPayload := append([]byte{walletVersion}, pubKeyHash...) // 获得 sha256(sha256(versionPublickeyHash)) 四个字节 checksum := checksum(walletVersionedPayload) // 拼接 walletVersionedPayload + checksumHash fullPayload := append(walletVersionedPayload, checksum...) // 进行 base58 编码,生成可视化地址 address := base58.Encode(fullPayload) // 比特币地址格式:【钱包版本 + 公钥哈希 + 验证码】 return address } // 得到公钥哈希 func HashPubKey(pubKey []byte) []byte { publicSHA256 := sha256.Sum256(pubKey) RIPEMD160Hasher := ripemd160.New() _, err := RIPEMD160Hasher.Write(publicSHA256[:]) if err != nil { log.Panic(err) } publicRIPEMD160 := RIPEMD160Hasher.Sum(nil) return publicRIPEMD160 } // 通过【钱包版本+公钥哈希】生成验证码 func checksum(payload []byte) []byte { firstSHA := sha256.Sum256(payload) secondSHA := sha256.Sum256(firstSHA[:]) return secondSHA[:addressChecksumLen] } // 创建新的私钥、公钥 func newKeyPair() (ecdsa.PrivateKey, []byte) { curve := elliptic.P256() private, err := ecdsa.GenerateKey(curve, rand.Reader) if err != nil { log.Panic(err) } pubKey := append(private.PublicKey.X.Bytes(), private.PublicKey.Y.Bytes()...) return *private, pubKey } // 验证比特币地址 func ValidateAddress(address string) bool { pubKeyHash := base58.Decode(address) actualChecksum := pubKeyHash[len(pubKeyHash)-addressChecksumLen:] version := pubKeyHash[0] pubKeyHash = pubKeyHash[1 : len(pubKeyHash)-addressChecksumLen] targetChecksum := checksum(append([]byte{version}, pubKeyHash...)) return bytes.Compare(actualChecksum, targetChecksum) == 0 } func main() { wallet := NewWallet() bitcoinAddress := wallet.GetAddress() fmt.Println("比特币地址:", string(bitcoinAddress)) fmt.Printf("比特币地址是否有效:%v\n:", ValidateAddress(string(bitcoinAddress))) }
椭圆曲线加密算法(Elliptic Curve Cryptography),简称 ECC,是基于椭圆曲线数学理论实现的一种非对称加密算法。ECC 相比 RSA,ECC 优势是可以使用更短的密钥,来实现与 RSA 相 ...