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