Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah saya boleh mendapatkan kunci awam dan tandatangan yang betul daripada kunci persendirian pracincang menggunakan pakej Go golang.org/x/crypto/ed25519?

Bagaimanakah saya boleh mendapatkan kunci awam dan tandatangan yang betul daripada kunci persendirian pracincang menggunakan pakej Go golang.org/x/crypto/ed25519?

Susan Sarandon
Susan Sarandonasal
2024-11-01 04:27:02578semak imbas

How can I derive the correct public key and signature from a prehashed private key using the Go package golang.org/x/crypto/ed25519?

Percanggahan Kunci Awam Ed25519

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:

  • Pakej Go mengharapkan format kunci persendirian yang terdiri daripada daripada benih 32 bait yang digabungkan dengan kunci awam 32 bait.
  • Kes ujian menggunakan format kunci persendirian iaitu hasil 64 bait cincang yang digunakan pada benih (atau mungkin 64 bait rawak digunakan sebagai pengganti).

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!

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