Почему privateKey * PublicKey получают другой результат в Ed25519 с golang - PullRequest
0 голосов
/ 28 августа 2018

для результата want я хочу вычислить значение X как apiKey с формулой this

Pubkey1 = Privkey1 * G

Pubkey2 = Privkey2 * G

тогда мы получим

Privkey2 * Pubkey1 = Privkey1 * Pubkey2

также равно

Privkey2 * Privkey1 * G = Privkey1 * Privkey2 * G = X

тогда сервис и клиент могут использовать X в качестве ключа для подписи 101

Я новичок в Голанге и ED25519 или ECDSA , если я ошибся , надеюсь, что кто-то может выяснить , спасибо большое!

библиотека, которую я использовал, crypto / ed25519

в этой библиотеке я нашел функцию GeDoubleScalarMultVartime (), которую можно вычислить по формуле

 r = a*A + b*B

Я понятия не имею, как рассчитать X, поэтому я считаю, если я установил b = 0

r = a*A + 0*B = a*A

и затем я пишу код для проверки。

в lib crypto / ed25519, все функции ядра расположены во внутренней папке ,, так что я пишу некоторые функции, чтобы я мог их выставить

// get ProjectiveGroupElement struct
func GetProjectiveGroupElement() edwards25519.ProjectiveGroupElement {
  var R edwards25519.ProjectiveGroupElement
  return R
}
// get GeDoubleScalarMultVartime function
func GeDoubleScalar(r *edwards25519.ProjectiveGroupElement, a * [32]byte, A *edwards25519.ExtendedGroupElement, b *[32]byte) {
    edwards25519.GeDoubleScalarMultVartime(r, a, A, b)
}
// return PublicKey correspondence ExtendedGroupElement immediate, which used in GeDoubleScalarMultVartime() as param A instead PublicKey
func GenerateKey(rand io.Reader) (PublicKey, PrivateKey, edwards25519.ExtendedGroupElement, error) {
    if rand == nil {
        rand = cryptorand.Reader
    }

    seed := make([]byte, SeedSize)
    if _, err := io.ReadFull(rand, seed); err != nil {
        var B edwards25519.ExtendedGroupElement
        return nil, nil, B, err
    }

    privateKey, A := NewKeyFromSeed(seed)
    publicKey := make([]byte, PublicKeySize)
    copy(publicKey, privateKey[32:])

    return publicKey, privateKey, A, nil
}
func NewKeyFromSeed(seed []byte) (PrivateKey, edwards25519.ExtendedGroupElement){
if l := len(seed); l != SeedSize {
    panic("ed25519: bad seed length: " + strconv.Itoa(l))
}

digest := sha512.Sum512(seed)
digest[0] &= 248
digest[31] &= 127
digest[31] |= 64

var A edwards25519.ExtendedGroupElement
var hBytes [32]byte
copy(hBytes[:], digest[:])
edwards25519.GeScalarMultBase(&A, &hBytes)
var publicKeyBytes [32]byte
A.ToBytes(&publicKeyBytes)
privateKey := make([]byte, PrivateKeySize)
copy(privateKey, seed)
copy(privateKey[32:], publicKeyBytes[:])

return privateKey, A
}

это тестовый код

package main

import (
        "crypto/rand"
        "golang.org/x/crypto/ed25519"
)

func main() {
    pubK, privK, localA, err := ed25519.GenerateKey(rand.Reader)
    if err != nil {
        log.Printf("error")
    }
    var R = ed25519.GetProjectiveGroupElement()
    var testpubKey [32]byte
    var testprivKey [32]byte
    for i,v := range pubK {
        testpubKey[i] = v
    }
    for i,v := range privK {
        if i < 32 {
            testprivKey[i] = v
        }
    }
    var apikey1 [32]byte
    var b [32]byte //set b = 0
    log.Printf("localA:%x\n", localA)
    pubK2, privK2, localB, err := ed25519.GenerateKey(rand.Reader)
    if err != nil {
        log.Printf("error")
    }
    var R2 = ed25519.GetProjectiveGroupElement()
    var testpubKey2 [32]byte
    var testprivKey2 [32]byte
    for i,v := range pubK2 {
        testpubKey2[i] = v
    }
    for i,v := range privK2 {
        if i < 32 {
            testprivKey2[i] = v
        }
    }
    var apikey2 [32]byte
    var b2 [32]byte //set b = 0
    log.Printf("localB:%x\n", localB)
    ed25519.GeDoubleScalar(&R2, &testprivKey2, &localA, &b2)
    R2.ToBytes(&apikey2)
    log.Printf("apikey2:%x\n", apikey2)
    log.Printf("privK2:%x\n", privK2)
    ed25519.GeDoubleScalar(&R, &testprivKey, &localB, &b)
    R.ToBytes(&apikey1)
    log.Printf("apikey:%x\n", apikey1)
    log.Printf("privK1:%x\n", privK)
   }

результат

2018/08/28 11:17:23 apikey2:c025975d177059792498509fc4d4a8586b0039273d80c62760cf52064d2555bb
2018/08/28 11:17:23 privK2:ebd70f9b2254bee1de3a105e274fc6b0d65da8d66b1ba47d760a47a3f8b5fe866bc1d3fa1db801b49dc5521cf0b440c84894dd03e2871581c2a84cdc9c92e037
2018/08/28 11:17:23 apikey:0cfd0e75e8ec990d93d2768b101c70c0bf42e38e869afacfcbc1e61183fdd03d
2018/08/28 11:17:23 privK1:5eee36a68309f49fb73e1a93338c3a9173ce37cf5b2c0d27d344b45a7f441c37cd021701c36a5322eacbba6e4a49eda2fbfa32bfe5baf859d9851ecff714721a

два apikey разные, я неправильно использовал lib? или у меня неправильное познание с ed25519? Жаль, что кто-то может оказать мне помощь. спасибо

мой английский не очень хорош, если вы запутаетесь с моим описанием, просто разберитесь, спасибо еще раз

1 Ответ

0 голосов
/ 28 августа 2018

На ровном месте я бы сказал, что это возможно потому, что вы используете GenerateKey, который вызывает NewKeyFromSeed, когда privateKey фактически копируется из семени copy(privateKey, seed), и поэтому вы используете семя вместо digest фактически используется в NewKeyFromSeed, но для того, чтобы выполнить скалярный трюк, который вы хотите сделать, вы должны использовать фактический частный скаляр в ваших вычислениях с нижним и верхним битами, установленными так, как они должны.

Вместо этого измените ваш NewKeyFromSeed на: copy(privateKey, digest) и, возможно, он будет работать как задумано.

Отказ от ответственности: я только скомпилировал этот код в своей голове, поэтому я могу быть выключен. Если вам нужна дополнительная помощь, вы должны опубликовать MWE и, возможно, перейти к StackOverflow, поскольку это больше похоже на вопрос кода отладки, чем на вопрос криптографии.

...