"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo conciliar la discrepancia entre los formatos de clave privada de Golang y Bittorrent para Ed25519?

¿Cómo conciliar la discrepancia entre los formatos de clave privada de Golang y Bittorrent para Ed25519?

Publicado el 2024-11-08
Navegar:873

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

ed25519. Discrepancia de resultados públicos

El problema surge de diferentes formatos para las claves privadas ed25519. La clave comienza como una semilla de 32 bytes a la que se le aplica un hash usando SHA512 para crear 64 bytes (algunos bits se invierten durante este proceso).

Formato de clave privada de Golang

El formato de clave privada de Golang comprende la semilla de 32 bytes concatenada con la clave pública de 32 bytes.

Bittorrent Private Formato de clave

Las claves privadas de Bittorrent son la salida de 64 bytes del hash o potencialmente solo 64 bytes aleatorios utilizados de la misma manera que el resultado del hash.

Conversión de claves de Bittorrent a Formato Golang

Desafortunadamente, no es factible convertir claves Bittorrent a un formato que la API de Golang acepte porque el proceso hash no es reversible.

Implementación personalizada de Golang para vectores de prueba

Para solucionar este problema, se creó una versión modificada de la biblioteca Golang basada en el paquete interno golang.org/x/crypto /ed25519/internal/edwards25519 se puede crear:

Función para generar clave pública a partir de privada Clave

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

Función para generación de firmas

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
}

Ejemplo de uso

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!")))
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3