Skip to content

关于SM2算法中设置密钥的问题 #41

Description

@htlsmilework

您好!

我参考 https://dongle.go-pkg.com/zh/crypto/sm2.html 文档的示例,在这段代码中遇到了一个问题:

package main

import (
	"log"

	"github.com/dromara/dongle"
	"github.com/dromara/dongle/crypto/keypair"
)

func main() {
	kp := keypair.NewSm2KeyPair()
	kp.PublicKey = []byte(`-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEVJKqUmu59VTLhqCiVBmKqRjL5MXy
RHKwFAI+qG2Hqy5Wf5cLRlIf7aSMKqwGvYpP6gVOqQpvBdDQhDqr8rqrYA==
-----END PUBLIC KEY-----`)
	kp.PrivateKey = []byte(`-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBG0wawIBAQQgKvp8GZUkqT8UH/Z5
u8mjNM0JIvqmFolR6LczGEZmSvmhRANCAARUkqpSa7n1VMuGoKJUGYqpGMvkxfJE
crAUAj6obYerLlZ/lwtGUh/tpIwqrAa9ik/qBU6pCm8F0NCEOqvyuqtg
-----END PRIVATE KEY-----`)
	encrypter := dongle.Encrypt.FromString("hello world").BySm2(kp)
	if encrypter.Error != nil {
		log.Fatalf("加密错误: %v\n", encrypter.Error)
	}
	rawString := encrypter.ToRawString()
	decrypter := dongle.Decrypt.FromRawString(rawString).BySm2(kp)
	if decrypter.Error != nil {
		log.Fatalf("解密错误: %v\n", decrypter.Error)
	}
	val := decrypter.ToString() // hello world
	log.Println(val)
}

golang 版本:1.25
dongle 版本:v1.2.3
我原本期望能得到:

hello world

但实际上我得到了:

2026/05/11 15:13:18 加密错误: crypto/sm2: failed to encrypt data: invalid public key: asn1: structure error: point not on curve

我尝试过从其他地方生成SM2密钥对,也是会报错:

package main

import (
	"log"

	"github.com/dromara/dongle"
	"github.com/dromara/dongle/crypto/keypair"
)

func main() {
	kp := keypair.NewSm2KeyPair()
	kp.PublicKey = []byte(`-----BEGIN PUBLIC KEY-----
MDQ2YjBhYzU4OTQ3M2YyYmQyODc3NTE5NGI2OWIzODhiN2ViMDI3OGRjZDA2Zjcy
NDZmY2I3OTk2YjdjZDM4ZDkwMjVmMjBjZmQyZGM5ZWNkOTQzMTdjOGYzNDI1ZjYx
YzZlZDZmZDMxYWZjYjM0YmNiYTNhOGVhM2YzYTQ1NTc4OA==
-----END PUBLIC KEY-----`)
	kp.PrivateKey = []byte(`-----BEGIN PRIVATE KEY-----
NmVmNWIyMmUwYjY0OTgxZjVjOWVkZDZkYjY3MGJkODFmYTMwNWZiOGRiN2FhNDI1
NjVkMDliZmY1OWVkZDVlMg==
-----END PRIVATE KEY-----`)
	encrypter := dongle.Encrypt.FromString("hello world").BySm2(kp)
	if encrypter.Error != nil {
		log.Printf("加密错误: %v\n", encrypter.Error)
		return
	}
	rawString := encrypter.ToRawString()
	decrypter := dongle.Decrypt.FromRawString(rawString).BySm2(kp)
	if decrypter.Error != nil {
		log.Printf("解密错误: %v\n", decrypter.Error)
		return
	}
	val := decrypter.ToString() // hello world
	log.Println(val)
}

运行结果:

2026/05/11 15:16:28 加密错误: crypto/sm2: failed to encrypt data: invalid public key: asn1: syntax error: invalid SubjectPublicKeyInfo

只有尝试本地生成密钥,不做任何操作,才能获得正确结果:

package main

import (
	"log"

	"github.com/dromara/dongle"
	"github.com/dromara/dongle/crypto/keypair"
)

func main() {
	kp := keypair.NewSm2KeyPair()
	err := kp.GenKeyPair()
	if err != nil {
		log.Fatal(err)
	}
	encrypter := dongle.Encrypt.FromString("hello world").BySm2(kp)
	if encrypter.Error != nil {
		log.Printf("加密错误: %v\n", encrypter.Error)
		return
	}
	rawString := encrypter.ToRawString()
	decrypter := dongle.Decrypt.FromRawString(rawString).BySm2(kp)
	if decrypter.Error != nil {
		log.Printf("解密错误: %v\n", decrypter.Error)
		return
	}
	val := decrypter.ToString() // hello world
	log.Println(val)
}

运行结果:

2026/05/11 15:18:25 hello world

谢谢!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions