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?

DDD
DDDasal
2024-10-31 07:06:30596semak imbas

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(&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!

Kenyataan:
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