0

我正在尝试为 pubkey 生成实现curve25519 算法。但是我陷入了如何从 Go 中的 sha256 编码字符串生成 pubkey 的问题上?

我通过 Python 从 sha256 编码的字符串生成 pubkey 没有问题:

import hashlib
import x25519

example_string = 'kerielle'

sha = hashlib.sha256(example_string.encode()).hexdigest()
hash_bytes = bytes.fromhex(sha)
public_key = x25519.scalar_base_mult(hash_bytes)
hex_res = public_key.hex()

print(hex_res)
>>> 0fa065fcaedecef9aebb5c79ea1c613e82bc5534c4b139d71f3a1cb0cb956652

但是如何在 Go 中做同样的事情呢?这里的基本示例:

var publicKey [32]byte
privateKey := (*[32]byte)(bytes.Repeat([]byte("1"), 32))
curve25519.ScalarBaseMult(&publicKey, privateKey)

fmt.Printf("%x\n", publicKey)
>>> 04f5f29162c31a8defa18e6e742224ee806fc1718a278be859ba5620402b8f3a
4

1 回答 1

3

这只是复制了 Python 代码示例的结果,同时还考虑curve25519.ScalarBaseMult()文档中的指导:

建议将 X25519 函数与 Basepoint 一起使用,因为复制到固定大小的数组可能会导致意外错误。

package main

import (
    "crypto/sha256"
    "fmt"
    "log"

    "golang.org/x/crypto/curve25519"
)

func main() {
    example_string := "kerielle"
    hash := sha256.Sum256([]byte(example_string))
    publicKey, err := curve25519.X25519(hash[:], curve25519.Basepoint)
    if err != nil {
        log.Fatalf("curve25519.X25519() failed: %v", err)
    }
    fmt.Printf("%x\n", publicKey)
}

输出:

0fa065fcaedecef9aebb5c79ea1c613e82bc5534c4b139d71f3a1cb0cb956652

去游乐场

于 2022-01-16T05:10:00.597 回答