«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как устранить несоответствие между форматами закрытых ключей Golang и Bittorrent для Ed25519?

Как устранить несоответствие между форматами закрытых ключей Golang и Bittorrent для Ed25519?

Опубликовано 8 ноября 2024 г.
Просматривать:212

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

ed25519.Расхождение общедоступных результатов

Проблема возникает из-за разных форматов закрытых ключей ed25519. Ключ начинается с 32-байтового начального числа, которое хэшируется с использованием SHA512 для создания 64 байтов (некоторые биты переворачиваются во время этого процесса).

Формат закрытого ключа Golang

Формат закрытого ключа Golang состоит из 32-байтового начального числа, объединенного с 32-байтовым открытым ключом.

Формат закрытого ключа Bittorrent

Частые ключи Bittorrent — это 64-байтовые ключи. байтовый вывод хеша или, возможно, только 64 случайных байта, используемых таким же образом, как и результат хеширования.

Преобразование ключей Bittorrent в формат Golang

К сожалению, невозможно преобразовать ключи Bittorrent в формат Golang. формат, который принимает Golang API, поскольку процесс хэширования необратим.

Пользовательская реализация Golang для тестовых векторов

Для решения этой проблемы создана модифицированная версия библиотеки Golang на основе внутреннего пакета golang.org/x/crypto/ed25519/internal/edwards25519 можно создать:

Функция для генерации открытого ключа из закрытого ключа

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

Функция для генерации подписи

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
}

Пример использования

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!")))
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3