ed25519.Percanggahan Hasil Awam
Isu timbul daripada format berbeza untuk kunci persendirian ed25519. Kekunci bermula sebagai benih 32-bait yang dicincang menggunakan SHA512 untuk mencipta 64 bait (bit tertentu diterbalikkan semasa proses ini).
Format Kunci Peribadi Golang
Format kunci peribadi Golang terdiri daripada biji 32 bait yang digabungkan dengan kunci awam 32 bait.
Format Kunci Peribadi Bittorrent
Kunci peribadi Bittorrent ialah 64- bait keluaran cincang atau berpotensi hanya 64 bait rawak digunakan dengan cara yang sama seperti hasil cincang.
Menukar Kekunci Bittorrent kepada Format Golang
Malangnya, tidak boleh menukar kunci Bittorrent kepada format yang diterima API Golang kerana proses cincang tidak boleh diterbalikkan.
Pelaksanaan Golang Tersuai untuk Vektor Ujian
Untuk menangani isu ini, versi pustaka Golang yang diubah suai berdasarkan pakej dalaman golang.org/x/crypto/ed25519/internal/edwards25519 boleh dibuat:
Fungsi untuk Menjana Kunci Awam daripada Kunci Peribadi
<code class="go">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>
Fungsi untuk Penjanaan Tandatangan
<code class="go">func sign(privateKey, publicKey, message []byte) []byte { var privateKeyA [32]byte copy(privateKeyA[:], privateKey) // we need this in an array later 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>
Contoh Penggunaan
<code class="go">const privateKeyHex = "e06d3183d14159228433ed599221b80bd0a5ce8352e4bdf0262f76786ef1c74db7e7a9fea2c0eb269d61e3b38e450a22e754941ac78479d6c54e1faf6037881d" const expectedPublicKey = "77ff84905a91936367c01360803104f92432fcd904a43511876df5cdf3e7e548" const expectedSig = "6834284b6b24c3204eb2fea824d82f88883a3d95e8b4a21b8c0ded553d17d17ddf9a8a7104b1258f30bed3787e6cb896fca78c58f8e03b5f18f14951a87d9a08" privateKey, _ := hex.DecodeString(privateKeyHex) publicKey := getPublicKey(privateKey) keyMatches := expectedPublicKey == hex.EncodeToString(publicKey) sigMatches := expectedSig == hex.EncodeToString(sign(privateKey, publicKey, []byte("4:salt6:foobar3:seqi1e1:v12:Hello World!")))</code>
Atas ialah kandungan terperinci Bagaimana untuk mendamaikan percanggahan antara format kunci peribadi Golang dan Bittorrent untuk Ed25519?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!