3

I'm trying to read an RSA public key from file with the following code:

keyBytes, err := ioutil.ReadFile("pubkey.pem")
if err != nil {
  log.Fatal(err)
}
block, _ := pem.Decode(keyBytes)
fmt.Printf("block.Type: %s\n", block.Type)
pubkeyInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
pubkey, ok := pubkeyInterface.(*rsa.PublicKey)                                                 
if !ok {
  log.Fatal("Fatal error")
}
cipher, err := rsa.EncryptPKCS1v15(nil, pubkey, []byte(msg))                                   
if err != nil {
  log.Fatal(err)
}

But I got the following error:

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x20 pc=0x463921]

goroutine 1 [running]:
io.ReadAtLeast(0x0, 0x0, 0xc200089002, 0x70, 0x7e, ...)
    /usr/lib/go/src/pkg/io/io.go:284 +0xf1
io.ReadFull(0x0, 0x0, 0xc200089002, 0x70, 0x7e, ...)
    /usr/lib/go/src/pkg/io/io.go:302 +0x6f
crypto/rsa.nonZeroRandomBytes(0xc200089002, 0x70, 0x7e, 0x0, 0x0, ...)
    /usr/lib/go/src/pkg/crypto/rsa/pkcs1v15.go:134 +0x70
crypto/rsa.EncryptPKCS1v15(0x0, 0x0, 0xc20004c550, 0xc20004c560, 0xd, ...)
    /usr/lib/go/src/pkg/crypto/rsa/pkcs1v15.go:35 +0x236
main.encode(0x536630, 0xd, 0x535ad0, 0x9, 0x54f1b0, ...)
    /home/taot/programming/go/encrypt/read_cert.go:28 +0x355
main.main()
    /home/taot/programming/go/encrypt/read_cert.go:12 +0x32

goroutine 2 [syscall]:

goroutine 3 [runnable]:

Seems something is wrong with my type assertion converting interface{} to *rsa.PublicKey, but I didn't get a compile error.

What's the correct way of doing this? Thanks in advance!

Regards, Terry

1 Answer 1

5

The error is because you're passing nil to rsa.EncryptPKCS1v15. As the first parameter it needs an io.Reader from which to read random bytes. You can use, for example, rand.Reader from package crypto/rand.

Sign up to request clarification or add additional context in comments.

4 Comments

Yeah, I just found out that... Thanks a lot! May I ask why we would need to pass in some random bytes? Is it for padding or something?
Wow, you are quick! But what's the purpose of the random bytes?
I'm not really familiar with PKCS but it seems you're supposed to encrypt a message smaller than the public key size. The message seems to be padded to the length of the key with non-zero random bytes.
@ctn: Not only smaller but also the data you encrypt MUST be random-like (it MUST NOT have a predetermined format) or you will leak private key information. That's why security algorithms usually encrypt a randomly-generated key that is then used to encipher the cleartext with a symmetric algorithm.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.