3

次のコードを使用して、ファイルから RSA 公開鍵を読み取ろうとしています。

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)
}

しかし、次のエラーが発生しました。

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]:

interface{} を *rsa.PublicKey に変換する型アサーションに問題があるようですが、コンパイル エラーは発生しませんでした。

これを行う正しい方法は何ですか?前もって感謝します!

よろしく、 テリー

4

1 に答える 1

5

エラーは、nil を に渡しているためですrsa.EncryptPKCS1v15io.Reader最初のパラメータとして、ランダムなバイトを読み取る元の が必要です。たとえば、rand.Readerfrom packageを使用できますcrypto/rand

于 2013-06-13T16:52:11.043 に答える