Android-RSA-Verschlüsselung von public string
Ich arbeite an einem android-Anwendung, wo ich möchte, die der Benutzer zum verschlüsseln von Nachrichten mit anderen öffentlichen Schlüssel. Das system generiert ein öffentliches/privates Schlüsselpaar und dann Nachrichten gesendet werden können, um andere Nutzer heimlich.
Ich bin erstellen eines Verschlüsselungs-Klasse, die sich um die Verschlüsselung/Entschlüsselung von Nachrichten. Ich bin leider mit einigen Problemen.
In dieser Methode, möchte ich übergeben Sie die Benutzer den geheimen Schlüssel (private key) sowie die Nachricht, die Sie verschlüsseln möchten. Ich möchte das Geheimnis um die Benutzer-definiert sind (wie "MySecretPassword").
public static void lock(String secret, String textToEncrypt) {
try {
//Convert the public key string into a key
byte[] encodedPublicKey = Base64.decode(secret.getBytes("utf-8"),Base64.DEFAULT);
X509EncodedKeySpec spec = new X509EncodedKeySpec(encodedPublicKey);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publickey = keyFactory.generatePublic(spec); //Crash Here
PrivateKey privateKey = keyFactory.generatePrivate(spec);
//Encrypt Message
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publickey);
byte[] encryptedBytes = cipher.doFinal(textToEncrypt.getBytes());
Log.d(TAG,"Encrypted: "+new String(encryptedBytes));
} catch (Exception e) {
e.printStackTrace();
}
}
Ausnahme ist wie folgt:
java.security.spec.InvalidKeySpecException: java.lang.RuntimeException: error:0c0740b0:ASN.1 encoding routines:ASN1_get_object:TOO_LONG
Was vermisse ich hier? Bin ich etwas fehlt offensichtlich oder bin ich Missverständnis, wie diese tools arbeiten? Ich habe diese javascript-Bibliothek für public/private key-Verschlüsselung vor und versuche, etwas ähnliches zu tun hier. Ich würde es begrüßen, wenn jemand könnte mich in die richtige Richtung 🙂
- "Andere Benutzer können die Nachrichten entschlüsselt werden, die mit Ihrem öffentlichen Schlüssel." Sie sind also nicht geheim, denn jeder kennt den öffentlichen Schlüssel? Ihr Fehler: Sie wollen nicht, um einen Schlüssel erzeugen, basiert auf X509-codierte Daten, die Sie erzeugen wollen, basiert auf einem Kennwort: stackoverflow.com/a/992413/995891
- Ah, ich gemischter Dinge, während Sie Tippen. Sollte der Benutzer verschlüsseln Sie eine Nachricht mit Ihrem Ziel-dem öffentlichen Schlüssel (z.B. wenn ich eine Nachricht senden wollen auf mein Freund, ich verschlüsseln mit dem bekannten öffentlichen Schlüssel). Ich nehme einen Blick auf den link, den Sie gepostet 🙂
- Vielleicht ist es nur ein Tippfehler ist, aber der öffentliche Schlüssel ist allen wohlbekannt, Sie können die Daten verschlüsseln, die nur der Empfänger (= Besitzer des privaten Schlüssel) entschlüsseln kann. Das ist der Weg, es ist sicher, um Nachrichten zu senden. edit: yep.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ein Geheimnis ist, nicht einen öffentlichen Schlüssel.
Sie verschlüsseln mit dem öffentlichen Schlüssel des Empfängers. Dieser Wert ist öffentlichen, was bedeutet, dass jeder kann es nachschlagen. Sie brauchen, um den Wert der anderen Partei den öffentlichen Schlüssel und ziehen Sie Sie in Ihrem code nicht senden Sie in Ihrem eigenen privaten Schlüssel. Der richtige Weg, dies zu tun beinhaltet keine Geheimnisse!
Normalerweise nicht direkt verschlüsseln einer Nachricht mit RSA, statt Sie zu verschlüsseln, einen AES-Schlüssel (oder einem anderen symmetrischen Schlüssel) mit RSA und Nutzung der AES-Schlüssel, der zum verschlüsseln der Nachricht. Wenn Ihre Nachrichten sind sehr kurz, Sie könnte verwenden Sie die RSA direkt, aber es funktioniert nicht für lange Nachrichten.
Hier sind ein paar links, die zeigen, wie zu implementieren RSA auf Android: