Heim > Backend-Entwicklung > Golang > Wie kann ich mit dem Go-Paket golang.org/x/crypto/ed25519 den richtigen öffentlichen Schlüssel und die richtige Signatur aus einem vorab gehashten privaten Schlüssel ableiten?

Wie kann ich mit dem Go-Paket golang.org/x/crypto/ed25519 den richtigen öffentlichen Schlüssel und die richtige Signatur aus einem vorab gehashten privaten Schlüssel ableiten?

Susan Sarandon
Freigeben: 2024-11-01 04:27:02
Original
670 Leute haben es durchsucht

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

Diskrepanz des öffentlichen Schlüssels von Ed25519

Problembeschreibung:

Verwendung des Go-Pakets golang.org/x/crypto/ed25519 Versuche, den öffentlichen Schlüssel von einem bestimmten privaten Schlüssel abzuleiten, führen zu einem anderen Ergebnis als der erwartete öffentliche Schlüssel, wie in einem bestimmten Testfall definiert.

Ursache:

Die Diskrepanz entsteht durch die Verwendung unterschiedlicher privater Schlüsselformate ed25519.

Unterschied im privaten Schlüsselformat:

  • Das Go-Paket erwartet ein privates Schlüsselformat, das besteht des 32-Byte-Seeds, verkettet mit dem 32-Byte-öffentlichen Schlüssel.
  • Der Testfall verwendet ein privates Schlüsselformat, das das 64-Byte-Ergebnis eines auf den Seed angewendeten Hashs (oder möglicherweise 64 verwendete Zufallsbytes) ist als Ersatz).

Lösung:

Da die Umkehrung des Hashs, der zum Generieren der privaten Schlüssel des Testfalls verwendet wurde, nicht möglich ist, muss die Konvertierung in ein Format erfolgen, das mit kompatibel ist Das Go-Paket ist nicht möglich.

Vorgeschlagene Lösung:

Um den richtigen öffentlichen Schlüssel für den Testfall zu erhalten, kann eine modifizierte Version des Go-Pakets erstellt werden nutzt die folgenden benutzerdefinierten Funktionen:

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>
Nach dem Login kopieren

sign:

<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>
Nach dem Login kopieren

Verwendung Beispiel:

<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>
Nach dem Login kopieren

Dieser Ansatz ermöglicht die Berechnung des korrekten öffentlichen Schlüssels und der richtigen Signatur mithilfe des modifizierten Go-Pakets, wie im Testfall angegeben.

Das obige ist der detaillierte Inhalt vonWie kann ich mit dem Go-Paket golang.org/x/crypto/ed25519 den richtigen öffentlichen Schlüssel und die richtige Signatur aus einem vorab gehashten privaten Schlüssel ableiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage