Rumah pembangunan bahagian belakang Golang Bagaimana untuk mendamaikan percanggahan antara format kunci peribadi Golang dan Bittorrent untuk Ed25519?

Bagaimana untuk mendamaikan percanggahan antara format kunci peribadi Golang dan Bittorrent untuk Ed25519?

Oct 31, 2024 am 07:06 AM

How to reconcile the discrepancy between Golang and Bittorrent private key formats for Ed25519?

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(&amp;A, &amp;hBytes)
    var publicKeyBytes [32]byte
    A.ToBytes(&amp;publicKeyBytes)

    return publicKeyBytes[:]
}</code>
Salin selepas log masuk

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(&amp;messageDigestReduced, &amp;messageDigest)
    var R edwards25519.ExtendedGroupElement
    edwards25519.GeScalarMultBase(&amp;R, &amp;messageDigestReduced)

    var encodedR [32]byte
    R.ToBytes(&amp;encodedR)

    h.Reset()
    h.Write(encodedR[:])
    h.Write(publicKey)
    h.Write(message)
    h.Sum(hramDigest[:0])
    var hramDigestReduced [32]byte
    edwards25519.ScReduce(&amp;hramDigestReduced, &amp;hramDigest)

    var s [32]byte
    edwards25519.ScMulAdd(&amp;s, &amp;hramDigestReduced, &amp;privateKeyA, &amp;messageDigestReduced)

    signature := make([]byte, 64)
    copy(signature[:], encodedR[:])
    copy(signature[32:], s[:])

    return signature
}</code>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Tag artikel panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah? GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah? Mar 03, 2025 pm 05:17 PM

GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah?

Bagaimana saya menulis objek dan stub untuk ujian di GO? Bagaimana saya menulis objek dan stub untuk ujian di GO? Mar 10, 2025 pm 05:38 PM

Bagaimana saya menulis objek dan stub untuk ujian di GO?

Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego? Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego? Mar 03, 2025 pm 05:22 PM

Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego?

Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO? Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO? Mar 10, 2025 pm 03:20 PM

Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO?

Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya? Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya? Mar 10, 2025 pm 05:36 PM

Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya?

Bagaimana cara menulis fail dalam bahasa Go dengan mudah? Bagaimana cara menulis fail dalam bahasa Go dengan mudah? Mar 03, 2025 pm 05:15 PM

Bagaimana cara menulis fail dalam bahasa Go dengan mudah?

Bagaimanakah saya boleh menggunakan alat linter dan analisis statik untuk meningkatkan kualiti dan pemeliharaan kod pergi saya? Bagaimanakah saya boleh menggunakan alat linter dan analisis statik untuk meningkatkan kualiti dan pemeliharaan kod pergi saya? Mar 10, 2025 pm 05:38 PM

Bagaimanakah saya boleh menggunakan alat linter dan analisis statik untuk meningkatkan kualiti dan pemeliharaan kod pergi saya?

Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go? Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go? Mar 03, 2025 pm 05:18 PM

Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go?

See all articles