„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie lässt sich die Diskrepanz zwischen den privaten Schlüsselformaten von Golang und Bittorrent für Ed25519 ausgleichen?

Wie lässt sich die Diskrepanz zwischen den privaten Schlüsselformaten von Golang und Bittorrent für Ed25519 ausgleichen?

Veröffentlicht am 08.11.2024
Durchsuche:164

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

ed25519.Public Result Discrepancy

Das Problem entsteht durch unterschiedliche Formate für ed25519-Privatschlüssel. Der Schlüssel beginnt als 32-Byte-Seed, der mit SHA512 gehasht wird, um 64 Bytes zu erstellen (bestimmte Bits werden während dieses Prozesses umgedreht).

Golang Private Key Format

Das private Schlüsselformat von Golang besteht aus dem 32-Byte-Startwert, der mit dem öffentlichen 32-Byte-Schlüssel verkettet ist.

Bittorrent-Privatschlüsselformat

Die privaten Bittorrent-Schlüssel sind die 64-Byte-Schlüssel. Byte-Ausgabe des Hashs oder möglicherweise nur 64 zufällige Bytes, die auf die gleiche Weise wie das Hash-Ergebnis verwendet werden.

Konvertieren von Bittorrent-Schlüsseln in das Golang-Format

Leider ist es nicht möglich, Bittorrent-Schlüssel in ein zu konvertieren Format, das die Golang-API akzeptiert, da der Hash-Prozess nicht umkehrbar ist.

Benutzerdefinierte Golang-Implementierung für Testvektoren

Um dieses Problem zu beheben, eine modifizierte Version der Golang-Bibliothek Basierend auf dem internen Paket golang.org/x/crypto/ed25519/internal/edwards25519 kann erstellt werden:

Funktion zum Generieren eines öffentlichen Schlüssels aus einem privaten Schlüssel

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[:]
}

Funktion zur Signaturgenerierung

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
}

Beispielverwendung

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!")))
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3