Сохранение Privatekey (PKCS8) и Publickey (X509) в файлы PEM и чтение их на Java - PullRequest
0 голосов
/ 16 октября 2019

Я генерирую пару ключей в Koltin и сохраняю их в два файла, при попытке прочитать эти файлы на любом другом языке, кроме 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: Privatekey:

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

Publickey:

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

Теперь, если я, например, введу их на этот веб-сайт или на этот (алгоритм RS256), я получу исключение InvalidKeyException ...

Может кто-нибудь сказать, что яя делаю не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...