2017-06-30 5 views
-5

Wie kann ich eine Nachricht mit einem privaten Schlüssel in Golang entschlüsseln?entschlüsseln mit öffentlichen Schlüssel

$ openssl genrsa -out ./server/server.key 
Generating RSA private key, 2048 bit long modulus 
..................+++ 
.............................................+++ 

$ openssl rsa -in ./server/server.key -pubout -out ./client/client.pub 
writing RSA key 

$ echo "secret" | openssl rsautl -inkey ./server/server.key -sign > ./secret 

# decrypt with public key 
$ openssl rsautl -inkey ./client/client.pub -pubin -in ./secret 
secret 
+4

Haben Sie versucht, auch bei der Dokumentation suchen? https://godoc.org/crypto/rsa Was hast du versucht, das funktioniert nicht? Du hast nichts gepostet. – RayfenWindspear

+0

diese Bibliothek kann Nachricht mit öffentlichen Schlüssel nicht entschlüsseln, nur Methoden überprüfen – vadv

+2

@ vadv Ich denke, dass Sie asymmetrische Schlüsselverschlüsselung missverstehen. Sie verschlüsseln mit einem öffentlichen Schlüssel und entschlüsseln mit einem privaten Schlüssel, wie Sie an den Funktionssignaturen in diesem Paket erkennen können - die Encrypt * -Funktionen benötigen einen öffentlichen Schlüssel und die Decrypt * -Funktionen einen privaten Schlüssel. – Adrian

Antwort

2

Ich denke, es gibt ein bisschen ein Missverständnis hier. openssl rsautl -sign verschlüsselt die Daten nicht. Es erzeugt eine Signatur. Der Inhalt in Ihrer secret Datei ist nicht "geheim", verschlüsselt. Es ist vielmehr eine Signatur des Textes "secret", die mit dem privaten Schlüssel signiert ist.

Mit dem öffentlichen Schlüssel können Sie die Signatur -verify, aber das ist nicht wirklich das, was Sie versuchen zu tun. Es klingt wie Sie wollen verschlüsseln/entschlüsseln, nicht signieren/verifizieren.

Verwenden Sie die Optionen -encrypt und -decrypt Optionen von rsautl. Die Verschlüsselung erfolgt mit dem öffentlichen Schlüssel, und die Entschlüsselung erfolgt mit dem privaten Schlüssel.

Bedenken Sie, dass der Datenmenge, die Sie mit RSA verschlüsseln können, Grenzen gesetzt sind. Normalerweise würden Sie einen symmetrischen Schlüssel mit RSA schützen und den symmetrischen Schlüssel für die Massenverschlüsselung und -entschlüsselung verwenden.

+0

Es ist immer erwähnenswert, dass es schwierig ist, diese Operationen selbst durchzuführen und fehleranfällig zu sein. Ich würde empfehlen, ein Tool zu finden, das die Verwendung von Verschlüsselung mit öffentlichem/privatem Schlüssel zusammen mit Symmetrisch automatisiert. Die Verwendung von roher RSA/AES allein bietet viele Fehler. – vcsjones

+0

Danke @vcsjones Ich möchte Inhalt der signierten signierten Nachricht ('secret'), wie in Java 'importieren javax.crypto.Cipher;' 'cipher = Cipher.getInstance (" RSA ");' 'cipher.init (Cipher.DECRYPT_MODE, ); '' cipher.doFinal (); ' diese Rückkehr 'geheim' – vadv

1

ich meine Frage vollständig verstanden, es war etwa RSA_public_decrypt Methode von OpenSSL: https://www.openssl.org/docs/man1.1.0/crypto/RSA_public_decrypt.html

ich keine rein golang Realisierung gefunden haben. Realisierung mit CGO: https://github.com/dgkang/rsa/blob/master/rsa/rsa.go

UPD, Arbeit für mich:

func RSA_public_decrypt(pubKey *rsa.PublicKey, data []byte) []byte { 
    c := new(big.Int) 
    m := new(big.Int) 
    m.SetBytes(data) 
    e := big.NewInt(int64(pubKey.E)) 
    c.Exp(m, e, pubKey.N) 
    out := c.Bytes() 
    skip := 0 
    for i := 2; i < len(out); i++ { 
     if i+1 >= len(out) { 
      break 
     } 
     if out[i] == 0xff && out[i+1] == 0 { 
      skip = i + 2 
      break 
     } 
    } 
    return out[skip:] 
} 
Verwandte Themen