Penerangan Masalah:
Menggunakan pakej Go golang.org/x/crypto/ed25519 , percubaan untuk mendapatkan kunci awam daripada kunci persendirian yang diberikan menghasilkan hasil yang berbeza berbanding kunci awam yang dijangkakan seperti yang ditakrifkan dalam kes ujian tertentu.
Punca Punca:
Percanggahan timbul daripada penggunaan format kunci persendirian ed25519 yang berbeza.
Perbezaan Format Kunci Peribadi:
Penyelesaian:
Memandangkan membalikkan cincang yang digunakan untuk menjana kunci persendirian kes ujian tidak boleh dilaksanakan, penukaran kepada format yang serasi dengan pakej Go tidak boleh dilakukan.
Penyelesaian Cadangan:
Untuk mendapatkan kunci awam yang betul untuk kes ujian, versi pakej Go yang diubah suai boleh dibuat yang menggunakan fungsi tersuai berikut:
getPublicKey:
<code class="go">// GetPublicKey generates the public key from the prehashed private key. func getPublicKey(privateKey []byte) []byte { var A edwards25519.ExtendedGroupElement var hBytes [32]byte copy(hBytes[:], privateKey) edwards25519.GeScalarMultBase(&A, &hBytes) var publicKeyBytes [32]byte A.ToBytes(&publicKeyBytes) return publicKeyBytes[:] }</code>
tanda:
<code class="go">// Sign generates a signature from the prehashed private key, public key, and message. func sign(privateKey, publicKey, message []byte) []byte { var privateKeyA [32]byte copy(privateKeyA[:], privateKey) var messageDigest, hramDigest [64]byte h := sha512.New() h.Write(privateKey[32:]) h.Write(message) h.Sum(messageDigest[:0]) var messageDigestReduced [32]byte edwards25519.ScReduce(&messageDigestReduced, &messageDigest) var R edwards25519.ExtendedGroupElement edwards25519.GeScalarMultBase(&R, &messageDigestReduced) var encodedR [32]byte R.ToBytes(&encodedR) h.Reset() h.Write(encodedR[:]) h.Write(publicKey) h.Write(message) h.Sum(hramDigest[:0]) var hramDigestReduced [32]byte edwards25519.ScReduce(&hramDigestReduced, &hramDigest) var s [32]byte edwards25519.ScMulAdd(&s, &hramDigestReduced, &privateKeyA, &messageDigestReduced) signature := make([]byte, 64) copy(signature[:], encodedR[:]) copy(signature[32:], s[:]) return signature }</code>
Penggunaan Contoh:
<code class="go">privateKeyHex := "e06d3183d14159228433ed599221b80bd0a5ce8352e4bdf0262f76786ef1c74db7e7a9fea2c0eb269d61e3b38e450a22e754941ac78479d6c54e1faf6037881d" privateKey, _ := hex.DecodeString(privateKeyHex) expectedPublicKey := "77ff84905a91936367c01360803104f92432fcd904a43511876df5cdf3e7e548" expectedSig := "6834284b6b24c3204eb2fea824d82f88883a3d95e8b4a21b8c0ded553d17d17ddf9a8a7104b1258f30bed3787e6cb896fca78c58f8e03b5f18f14951a87d9a08" publicKey := getPublicKey(privateKey) fmt.Printf("Calculated Public Key: %x\n", publicKey) fmt.Printf("Expected Public Key: %s\n", expectedPublicKey) calculatedSig := sign(privateKey, publicKey, []byte("Hello, World!")) fmt.Printf("Calculated Signature: %x\n", calculatedSig) fmt.Printf("Expected Signature: %s\n", expectedSig)</code>
Pendekatan ini membolehkan pengiraan kunci awam dan tandatangan yang betul menggunakan pakej Go yang diubah suai, seperti yang dinyatakan dalam kes ujian.
Atas ialah kandungan terperinci Bagaimanakah saya boleh mendapatkan kunci awam dan tandatangan yang betul daripada kunci persendirian pracincang menggunakan pakej Go golang.org/x/crypto/ed25519?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!