>  기사  >  백엔드 개발  >  Go 패키지 golang.org/x/crypto/ed25519를 사용하여 사전 해시된 개인 키에서 올바른 공개 키와 서명을 어떻게 파생시킬 수 있나요?

Go 패키지 golang.org/x/crypto/ed25519를 사용하여 사전 해시된 개인 키에서 올바른 공개 키와 서명을 어떻게 파생시킬 수 있나요?

Susan Sarandon
Susan Sarandon원래의
2024-11-01 04:27:02578검색

How can I derive the correct public key and signature from a prehashed private key using the Go package golang.org/x/crypto/ed25519?

Ed25519 공개 키 불일치

문제 설명:

Go 패키지 사용 golang.org/x/crypto/ed25519 , 지정된 개인 키에서 공개 키를 파생시키려는 시도는 지정된 테스트 사례에 정의된 예상 공개 키와 비교하여 다른 결과를 생성합니다.

근본 원인:

다른 ed25519 개인 키 형식을 사용하면 불일치가 발생합니다.

개인 키 형식 차이점:

  • Go 패키지에는 다음으로 구성된 개인 키 형식이 필요합니다. 32바이트 공개 키와 연결된 32바이트 시드.
  • 테스트 사례에서는 시드에 적용된 해시의 64바이트 결과(또는 사용된 임의의 64바이트)인 개인 키 형식을 사용합니다. 대체).

해결책:

테스트 사례 개인 키를 생성하는 데 사용된 해시를 되돌리는 것이 불가능하므로 다음과 호환되는 형식으로 변환합니다. Go 패키지는 불가능합니다.

제안된 솔루션:

테스트 사례에 대한 올바른 공개 키를 얻으려면 Go 패키지의 수정된 버전을 생성할 수 있습니다. 다음 사용자 정의 기능을 활용합니다:

getPublicKey:

<code class="go">// GetPublicKey generates the public key from the prehashed private key.
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[:]
}</code>

sign:

<code class="go">// Sign generates a signature from the prehashed private key, public key, and message.
func sign(privateKey, publicKey, message []byte) []byte {
    var privateKeyA [32]byte
    copy(privateKeyA[:], privateKey)
    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
}</code>

사용법 예:

<code class="go">privateKeyHex := "e06d3183d14159228433ed599221b80bd0a5ce8352e4bdf0262f76786ef1c74db7e7a9fea2c0eb269d61e3b38e450a22e754941ac78479d6c54e1faf6037881d"
privateKey, _ := hex.DecodeString(privateKeyHex)
expectedPublicKey := "77ff84905a91936367c01360803104f92432fcd904a43511876df5cdf3e7e548"
expectedSig := "6834284b6b24c3204eb2fea824d82f88883a3d95e8b4a21b8c0ded553d17d17ddf9a8a7104b1258f30bed3787e6cb896fca78c58f8e03b5f18f14951a87d9a08"
publicKey := getPublicKey(privateKey)
fmt.Printf("Calculated Public Key: %x\n", publicKey)
fmt.Printf("Expected Public Key:   %s\n", expectedPublicKey)
calculatedSig := sign(privateKey, publicKey, []byte("Hello, World!"))
fmt.Printf("Calculated Signature: %x\n", calculatedSig)
fmt.Printf("Expected Signature:   %s\n", expectedSig)</code>

이 접근 방식을 사용하면 테스트 사례에 지정된 대로 수정된 Go 패키지를 사용하여 올바른 공개 키와 서명을 계산할 수 있습니다.

위 내용은 Go 패키지 golang.org/x/crypto/ed25519를 사용하여 사전 해시된 개인 키에서 올바른 공개 키와 서명을 어떻게 파생시킬 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.