主页 > imtoken官网下载1.0 > ECDSA——比特币和以太坊信任基础设施的核心

ECDSA——比特币和以太坊信任基础设施的核心

imtoken官网下载1.0 2023-10-08 05:13:13

比特币李笑比特币身价_比特币扩展公钥_比特币私钥推算公钥

不管我们喜不喜欢,ECDSA 都是比特币和以太坊之王,是它们信任基础设施的核心。 虽然它的可扩展性不如 EdDSA 等方法,但在创建签名时只需稍作修改即可实现一系列隐私保护方法。 在开始之前,让我们快速了解一下 ECDSA 的工作原理。

ECDSA 基础知识

使用 ECDSA 签名,Alice 使用她的私钥 (sk) 对消息的哈希值 (h(M)) 进行签名,Bob 使用她的公钥 (Pk) 对其进行检查。 使用 ECDA,Alice 生成私钥 (sk) 和公钥 (Pk):

比特币私钥推算公钥_比特币李笑比特币身价_比特币扩展公钥

然后我们对消息进行哈希处理:

比特币私钥推算公钥_比特币扩展公钥_比特币李笑比特币身价

之后,Alice 创建一个随机值 k,并产生:

比特币私钥推算公钥_比特币扩展公钥_比特币李笑比特币身价

式中比特币扩展公钥,r为kG的x坐标值(模n),则s的值为:

比特币李笑比特币身价_比特币扩展公钥_比特币私钥推算公钥

当 Bob 检查签名时比特币扩展公钥,他计算:

比特币扩展公钥_比特币李笑比特币身价_比特币私钥推算公钥

比特币私钥推算公钥_比特币李笑比特币身价_比特币扩展公钥

和:

比特币李笑比特币身价_比特币私钥推算公钥_比特币扩展公钥

Bob 然后计算一个点:

比特币私钥推算公钥_比特币扩展公钥_比特币李笑比特币身价

如果Z的x坐标值等于r,则签名通过验证。 在这种情况下,n 是曲线的阶数。

盲法ECDSA

通过盲签名,Bob 可以在不知道消息是什么的情况下签署消息。 在这种情况下,爱丽丝创建了一个“盲”的 ECDSA 签名,鲍勃可以签名,然后爱丽丝可以揭盲。 该方法基于 Oleg Andreev 的比特币盲签名方法。

首先Alice生成a,b,c,d四个随机值,Bob生成p,q两个随机值,然后计算:

比特币私钥推算公钥_比特币李笑比特币身价_比特币扩展公钥

和:

比特币扩展公钥_比特币李笑比特币身价_比特币私钥推算公钥

比特币李笑比特币身价_比特币扩展公钥_比特币私钥推算公钥

G是曲线的基点。 Bob 将这些发送给 Alice。 接下来,爱丽丝计算:

比特币私钥推算公钥_比特币李笑比特币身价_比特币扩展公钥

公钥:

比特币私钥推算公钥_比特币李笑比特币身价_比特币扩展公钥

Alice 计算消息的哈希值 (M):

比特币扩展公钥_比特币私钥推算公钥_比特币李笑比特币身价

然后爱丽丝执行盲法:

比特币私钥推算公钥_比特币扩展公钥_比特币李笑比特币身价

将此发送给鲍勃。 Bob 签署盲散列并返回:

比特币私钥推算公钥_比特币李笑比特币身价_比特币扩展公钥

比特币李笑比特币身价_比特币扩展公钥_比特币私钥推算公钥

爱丽丝打开她的签名:

比特币扩展公钥_比特币李笑比特币身价_比特币私钥推算公钥

现在签名是 r = K_x , s = s 2 。

代码

这是代码:

包主

import ("crypto/ecdsa" "crypto/elliptic" "crypto/rand" "crypto/sha256" "fmt" "math/big" "os" "strconv")

// 源自 Oleg Andreev // 比特币交易的盲签名

功能主要(){

输入 Alice struct {m*big. Inta、b、c、d *大。 诠释}

输入 Bob struct {p, q *big. 整数}位:= 16

比特币李笑比特币身价_比特币扩展公钥_比特币私钥推算公钥

argCount := len(os.Args[1:])

如果 argCount > 0 {bits, _ = strconv.Atoi(os.Args[1])}

曲线 := elliptic.P256()n := Curve.Params().N

alice, bob := Alice{m: getRandom(n)}, Bob{}// Alice 选择随机素数 alice.a, alice.b, alice.c, alice.d = getRandomPrime(bits), getRandomPrime(bits), getRandomPrime (位),getRandomPrime(位)

tmp,x,y := new(big.Int), new(big.Int), new(big.Int)

// 2. Bob 计算 P = (p^-1 .G) 和 Q = (qp^-1 .G)bob.p, bob.q = getRandomPrime(bits), getRandomPrime(bits)Px, Py := Curve .ScalarBaseMult(new(big.Int).ModInverse(bob.p, n).Bytes())Qx, Qy := Curve.ScalarBaseMult(new(big.Int).Mul(bob.q, new(big.Int) ).ModInverse(bob.p, n)).Bytes())

// 3. Alice 计算 K = (ca)^-1 .P 和公钥 T = (a.Kx)^-1 .(bG + Q + dc^-1 .P)。

tmp = new(big.Int)Kx, _ := Curve.ScalarMult(Px, Py, tmp.Mul(alice.c, alice.a).ModInverse(tmp, n).字节())

Tx, Ty := Curve.ScalarBaseMult(alice.b.Bytes())Tx, Ty = Curve.Add(Tx, Ty, Qx, Qy)x, y = Curve.ScalarMult(Px, Py, new(big.Int) ).Mul(alice.d, new(big.Int).ModInverse(alice.c, n)).Bytes())Tx, Ty = Curve.Add(Tx, Ty, x, y)tmp = new(大.Int)Tx, Ty = Curve.ScalarMult(Tx, Ty, tmp.Mul(alice.a, Kx).ModInverse(tmp, n).Bytes())

// 4. Alice 计算 messageh := hashToInt(hash(alice.m.Bytes()), Curve)// 5. Alice 盲注 h_2 = ah + b (mod n) 并发送给 Bobtmp = new(big .Int)h2 := tmp.Mul(alice.a, h).Add(tmp, alice.b).Mod(tmp, n)

// 6. Bob 签署盲散列并返回 s_1 = p.h_2 + q (mod n)。

比特币私钥推算公钥_比特币扩展公钥_比特币李笑比特币身价

tmp = new(big.Int)s1 := tmp.Mul(bob.p, h2).Add(tmp, bob.q).Mod(tmp, n)

// 7. Alice 揭密签名:s_2 = c.s_1 + d (mod n)tmp = new(big.Int)s2 := tmp.Mul(alice.c, s1).Add(tmp, alice.d)。 模组(tmp,n)

// 8. 签名现在是 r=Kx, s=s_2fmt.Printf("m=%s\n\n", alice.m)fmt.Printf("a=%s\nb=%s\nc= %s\nd=%s\n", alice.a, alice.b, alice.c, alice.d)fmt.Printf("公钥 Tx=%s\nTy=%s\n", Tx, Ty )fmt.Printf("Hash h=%s\n\n", h)fmt.Printf("\n盲签名r=%s, s=%s\n", Kx, s1)fmt.Printf("签名r=%s, s=%s\n", Kx, s2)fmt.Println("签名验证:", ecdsa.Verify(&ecdsa.PublicKey{Curve: Curve, X: Tx, Y: Ty}, h.字节 (), Kx, s2))

}func getRandom(n *big.Int) *big.Int {m, _ := rand.Int(rand.Reader, n) 返回 m}func getRandomPrime(bits int) *big.Int {m, _ := rand .Prime(rand.Reader, bits) 返回 m}

func hash(msg []byte) []byte {hasher := sha256.New() hasher.Write(msg) return hasher.Sum(nil)}

func hashToInt(hash []byte, c elliptic.Curve) *big.Int {orderBits := c.Params().N.BitLen()orderBytes := (orderBits + 7) / 8if len(hash) > orderBytes {hash =哈希[:orderBytes]}

ret := new(big.Int).SetBytes(hash)excess := len(hash)*8 - orderBits if excess > 0 {ret.Rsh(ret, uint(excess))}return ret}

这是一个运行示例:

m=46398016479029616968153310998590589859317634753915956549813904092937392557159a=3303670661b=3226384361c=3530828149d=3607703383Public Key Tx=75232732142229191477159812086310547165062017290843364912683578530970424703230Ty=73950523097040244239776555774732425845079447152113985190585097252768983601069Hash h=53060989786633559228535141356889483919385714906876242047763586659314070909566Blinded Signature r=94046861866238546923597525972649788516701559058765278594626970725249113708126, s=103442503972324084972377390983720274585365710753545239530321864819095340728763Signature r=94046861866238546923597525972649788516701559058765278594626970725249113708126, s=35825078730317479356116975137038450525621519055620748195720062041695485378112Signature verified: true

我们可以看到签名的真实性。 运行代码如下:

来源:

关于

ChinaDeFi- ChinaDeFi.com是一个研究驱动的DeFi创新机构,我们也是一个区块链开发团队。 每天从全球500多个优质信息源的近900条内容中,寻找更深入、更系统的内容,以最快的速度同步到中国市场,提供决策支持辅助材料。