2013-06-13 3 views
3

Я пытаюсь прочитать открытый ключ RSA из файла с помощью следующего кода:Ошибка разбора 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]: 

Кажется, что-то не так с моим утверждением типа преобразования интерфейса {} в * rsa.PublicKey, но я не получил ошибку компиляции.

Каков правильный способ сделать это? Заранее спасибо!

С уважением, Терри

ответ

5

Ошибка в том, что вы передаете ноль для rsa.EncryptPKCS1v15. В качестве первого параметра ему нужен io.Reader, из которого можно считывать случайные байты. Вы можете использовать, например, rand.Reader из пакета crypto/rand.

+0

Да, я только что узнал, что ... Большое спасибо! Могу ли я спросить, почему нам нужно будет передавать некоторые случайные байты? Это для прокладки или что-то еще? –

+0

Нет проблем ..... – ctn

+0

Вау, ты быстро! Но какова цель случайных байтов? –

Смежные вопросы