go - 无法在golang中使用公钥加密

标签 go rsa public-key-encryption

我正在使用 golang 加密库。

func encrypt(publicKey *rsa.PublicKey, message string) []byte {
    msg := []byte(message)
    println(message, msg)
    cipherText, err := rsa.EncryptPKCS1v15(rand.Reader, publicKey, msg)
    if err != nil {
        println("Error:", err.Error())
    }

    return cipherText
}

出现以下错误

panic :运行时错误:无效内存地址或零指针解引用 [信号 SIGSEGV:分段违规代码=0x1 地址=0x0 pc=0x40e86d6]

如何处理?如何使用PKCS1加密?

控制台:-

Verifying local data [20/32]0xc0000d37b0
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x40e8456]

goroutine 1 [running]:
crypto/rsa.checkPub(...)
        /usr/local/Cellar/go/1.12.5/libexec/src/crypto/rsa/rsa.go:75
crypto/rsa.EncryptPKCS1v15(0x4334500, 0xc0000a0060, 0x0, 0xc0000d37b0, 0x14, 0x20, 0x402ddb2, 0x2, 0x42df45d, 0x1c, ...)
        /usr/local/Cellar/go/1.12.5/libexec/src/crypto/rsa/pkcs1v15.go:42 +0x56
main.encrypt(0x0, 0x42dcb46, 0x14, 0x0, 0x0, 0x0)
        /Users/weri/goModules/src/EastWinds/CoreUtils.go:195 +0x129
main.main()
        /Users/weri/goModules/src/EastWinds/main.go:26 +0x11e

公钥代码:-

func importPublicKey(publicKeyString string) *rsa.PublicKey {
    block, _ := pem.Decode([]byte(publicKeyString))
    if block == nil {
        return nil
    }

    pub, err := x509.ParsePKIXPublicKey(block.Bytes)
    if err != nil {
        println("Error: ", err.Error())
        return nil
    }

    switch pub := pub.(type) {
    case *rsa.PublicKey:
        println(pub.N)
        return pub
    default:
        break // fall through
    }

    return nil
}

publicKey:- 

-----开始RSA公钥----- MIIBIjANBgkqhkiG9w0BAQEFAOCAQ8AMIIBCgKCAQEAz1Ibsf4IGAs1ymoew4hR MQUJwIGotca3kiHOeZzuzosuw58z8FFEDQt+PcxjTsx3mvo0uK04oL5CGorQZrTl jJroZj5B2IwmHu2l1wpoKjaPbQDWu8RoIKlObaq9ENcqmH2/yvxUIBcJ0M9e5Tky UslTmqUdZCSDljPO+u30HkBVRqs5Z/bE82BfYMKJ3oDBdWMfiM2nyxGb9ynlml5B dC3USyVIr9NE7NEW5y78ru2F1/zmnPdfnOp4FgsgwLrinML7LZ+TUKT2zfwsVhJK IKl6WFwDQUspi1Oo5km3AsvGtGqBynCyWtj3ZPHMlCQplEusDmF9flyiABgvBrwk uQIDAQAB -----结束RSA公钥-----


最佳答案

playground您共享的链接,您的 PEM key 字符串格式不正确,它需要完全像这样:

    const pubPEM = `
-----BEGIN RSA PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz1Ibsf4IGAs1ymoew4hR
MQUJwIGotca3kiHOeZzuzosuw58z8FFEDQt+PcxjTsx3mvo0uK04oL5CGorQZrTl
jJroZj5B2IwmHu2l1wpoKjaPbQDWu8RoIKlObaq9ENcqmH2/yvxUIBcJ0M9e5Tky
UslTmqUdZCSDljPO+u30HkBVRqs5Z/bE82BfYMKJ3oDBdWMfiM2nyxGb9ynlml5B
dC3USyVIr9NE7NEW5y78ru2F1/zmnPdfnOp4FgsgwLrinML7LZ+TUKT2zfwsVhJK
IKl6WFwDQUspi1Oo5km3AsvGtGqBynCyWtj3ZPHMlCQplEusDmF9flyiABgvBrwk
uQIDAQAB
-----END RSA PUBLIC KEY-----`

如果我从 x509.ParsePKIXPublicKey 中获取示例并传递一个格式正确的 key ,它有效:https://play.golang.org/p/-wPYh7gxr5P

关于您的原始代码的更多注释:

  • 你只是打印错误,它们也应该返回并检查
  • 您没有检查返回的 key 是否为 nil 这可能会在 block == nil 时悄悄发生
  • 您应该检查pem.Decode 返回的未解析部分是否为空

关于go - 无法在golang中使用公钥加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56594962/

相关文章:

java - 使用 RSA 加密时,“没有安装的提供程序支持此 key : sun. security.provider.DSAPublicKeyImpl”

java - 复杂的加密/解密模型——这有可能吗?

java - 使用RSA加密图像时出错

c - C语言中的RSA加密/解密

mongodb - Golang/mgo : How can I store Date (not ISODate) in mongodb?

go - 是否需要关闭文件?

golang : copy of context when copy is background

go - 从golang中的单词结尾删除句号

java - 在android中使用公钥加密

java - Android NoClassDefFoundError - RSA 加密