将私钥(PKCS8)和公钥(X509)保存到PEM文件并以Java读取它们

时间:2019-10-16 07:14:12

标签: go cryptography rsa pem

我正在用Koltin生成一个密钥对,并将它们保存到两个文件中,当尝试使用除go之外的任何其他语言读取这些文件时,会导致错误“无效的密钥格式”。

这里的go代码生成密钥,对其进行编码并将其保存到pem文件中。私钥应采用PKCS8编码,公钥应采用X509编码。

func ExportPublicKeyAsPemStr(pubkey *rsa.PublicKey) string {
    pubkeyPem := string(pem.EncodeToMemory(&pem.Block{Type: "RSA PUBLIC KEY",Bytes: x509.MarshalPKCS1PublicKey(pubkey)}))
    err := createFile("C:/tmp/publickey.pub", pubkeyPem)
    if err != nil {
        panic(err)
    }
    return pubkeyPem
}
func ExportPrivateKeyAsPemStr(privatekey *rsa.PrivateKey) string {
    privatekeyBytes, err := x509.MarshalPKCS8PrivateKey(privatekey)
    if err != nil {
        panic(err)
    }
    privatekeyPem := string(pem.EncodeToMemory(&pem.Block{Type: "RSA PRIVATE KEY",Bytes: privatekeyBytes}))
    err = createFile("C:/tmp/privatekey.key", privatekeyPem)
    if err != nil {
        panic(err)
    }
    return privatekeyPem
}
func ExportMsgAsPemStr(msg []byte) string {
    msgPem := string(pem.EncodeToMemory(&pem.Block{Type: "MESSAGE",Bytes: msg}))
    err := createFile("C:/tmp/message.pem", msgPem)
    if err != nil {
        panic(err)
    }
    return msgPem
}
func main() {
    bits := 2048
    flag.Parse()
    //args := flag.Args()
    //m:=args[0]
    bobPrivateKey, _ := rsa.GenerateKey(rand.Reader,bits)

    bobPublicKey := &bobPrivateKey.PublicKey
    fmt.Printf("%s\n",  ExportPrivateKeyAsPemStr(bobPrivateKey))
    fmt.Printf("%s\n", ExportPublicKeyAsPemStr(bobPublicKey))
    message := []byte("This is a message with confidential text")
    label := []byte("")
    hash := sha256.New()
    ciphertext, _ := rsa.EncryptOAEP(hash, rand.Reader, bobPublicKey, message,label)
    fmt.Printf("%s\n",ExportMsgAsPemStr(ciphertext))
    plainText, _:= rsa.DecryptOAEP(hash, rand.Reader, bobPrivateKey, ciphertext, label)
    fmt.Printf("RSA decrypted to [%s]", plainText)
}

func createFile(name string, data string) error {
    f, err := os.Create(name)
    if err != nil {
        return err
    }
    defer f.Close()
    _, err = f.WriteString(data)
    if err != nil {
        return err
    }
    return nil
}

以下是两个pem文件的一些示例内容: 私钥:

-----BEGIN RSA PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDB6TI3vNW8+aDx
yzkI5AFIge6O8qPN2DSS7btnwx3AkMWmLg2PY6y5ocs0riZpSKV7fFCJ9+JVhC2r
cSmV6EGaq4r6mHrcX26m/5YMNk+93k1E30Q3JlFyoSkTB2zzt8qKP0rvvimMcI56
uyRiI0LuGdlUqQZ4c0yhyimyHms4vdc6IY3PBFF7V+AKpWkyTmWlUffx987rRp9l
jefz27dsqqv31JvJhBVtQVTAjMSB/vuV0cw6VIBrTBWK5i/zj6NqKp18MEJrugpj
BPqMErKx0Q3oMQ4iIhW1/+kuyyIYoSInTAERqX03nEp+0XETjsZUK6xUxDOtaeFQ
qMhN9F6lAgMBAAECggEAeSFeIFlSv0DE3CZR047yikO4LQ2/a3fSp7Hf7pqA/Giz
PvLnv5nJLRC3qonbLsuVrATlHrp9ZWQzTzRagO1cBe2A3Lfhj8YBjkp8hdZri7TR
WeOKblT+bffke6GY2soFuMR+4DJPLA6nwl0jBjb2uVvmWi9X/mgwB6UM1NqRqhg9
rT0Ct0vd5tBtMsEdl5pY7MRaEIfkM4pOC9ZOqv1791EXnO4io5qQgwOYhSJdOb/4
xavs3gUs+qbJr2dF67vk9RimCNetBdWe917As8QC42JZJcjLupeFwnqRgYGk7ByX
/gkP+rv3XOFr16UZe3RmDBPfxNdQIQYM2LmlUG5XRQKBgQDObRXQCO/YOZSqfgJZ
bHo82qY8dv1jR89+SS6JowVbMODaEZnrfCjfediOuiw1siw6bHKoOwXpVZnPoYUa
drvdM7S86d/54mBNMU9XqecWsybmlIovnlcob0+zUMUKoaW0jf+xgu8zkwYrtNKW
rmaSYylyKDjrSL4Zo6HufDUe+wKBgQDweq/U+9XL6ev0ejTww88w5SbD5d7rqGCQ
aSdHvv/Gig8zHic7PM8c+mfrdVKBMQ2Zpls6nynnEhIrjzbqomQzQzAtnT1heJtP
uCe7V8BM3T79Nel01U05A9O1wEny4pJS1mEKQSgxg0OxNrU27TcNFljaltq0dx3q
EEyxUrWG3wKBgHIadk4yQnGhEn5TfPT1M3Rj4DPYCiRQ028ZALJv/Ev17rRbulsi
nG07KutqGXns7Om2fIJlbdUWzhipTavdKecR57vtAzNbYKQKt7LbZbN0f/JA9Ulx
Gvhs3v9djC1eQPxW6ZmzqIk3odeS8jz8VhJg4c4KUbwsz3fYrW/oFGz1AoGAdoJv
ro1hAjnIX1XuSwykSZtULExXPFlhJSm9At18nTIiZXWhrc683rIEjoPl4ebzpdnW
saAIfWhpbfAJBz56FM0yq/gGbMeL+pBtfCS1juulhBGSeFI52TQqnDIj/z9rDsm5
Tt1nWmcu7+FfEq96ZsexiB+5rh/ZrSTVNrnk3Y8CgYA6sBJ7MNjAVzNG194djt9G
TIVpqvi1vb4WoCQENq6jYDj4y4T4wLX6R3ABlqyOHMnKZwAOXsfk2FRDMg51Vb+0
lAqpBk9cDhNr4Ez0Kwqmx9yZg9ENpie7dQ1/u7Lb1pDr8agAuupa2/lo3CJLSYi7
+IiJDPwv3xIzDpA5Dy1aTg==
-----END RSA PRIVATE KEY-----

公钥:

-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAwekyN7zVvPmg8cs5COQBSIHujvKjzdg0ku27Z8MdwJDFpi4Nj2Os
uaHLNK4maUile3xQiffiVYQtq3EplehBmquK+ph63F9upv+WDDZPvd5NRN9ENyZR
cqEpEwds87fKij9K774pjHCOerskYiNC7hnZVKkGeHNMocopsh5rOL3XOiGNzwRR
e1fgCqVpMk5lpVH38ffO60afZY3n89u3bKqr99SbyYQVbUFUwIzEgf77ldHMOlSA
a0wViuYv84+jaiqdfDBCa7oKYwT6jBKysdEN6DEOIiIVtf/pLssiGKEiJ0wBEal9
N5xKftFxE47GVCusVMQzrWnhUKjITfRepQIDAQAB
-----END RSA PUBLIC KEY-----

现在,例如,如果我将它们输入到此websitethis one(算法RS256)中,则会收到InvalidKeyException ...

有人可以告诉我我在做什么错吗?

0 个答案:

没有答案