2016-05-11 9 views
3

Ich arbeite an einer Android-Anwendung, wo ich möchte, dass der Benutzer Nachrichten mit anderen öffentlichen Schlüsseln verschlüsseln kann. Das System würde ein öffentliches/privates Schlüsselpaar erzeugen und dann können Nachrichten heimlich an andere Benutzer gesendet werden.Android RSA-Verschlüsselung von öffentlichen String

Ich erstelle eine Verschlüsselungsklasse, die für die Verschlüsselung/Entschlüsselung von Nachrichten zuständig ist. Leider habe ich ein paar Probleme.

Bei dieser Methode möchte ich sowohl den geheimen (privaten Schlüssel) des Benutzers als auch die Nachricht, die sie verschlüsseln möchten, weitergeben. Ich möchte, dass das Geheimnis benutzerdefiniert ist (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(); 
    } 
} 

Die Ausnahme ist wie folgt:

java.security.spec.InvalidKeySpecException: java.lang.RuntimeException: error:0c0740b0:ASN.1 encoding routines:ASN1_get_object:TOO_LONG 

Was soll ich hier fehlt? Fehle ich etwas Offensichtliches oder missverstehe ich, wie diese Werkzeuge funktionieren? Ich habe this Javascript-Bibliothek für die Verschlüsselung des öffentlichen/privaten Schlüssels verwendet und versuche, etwas ähnliches hier zu tun. Ich würde es schätzen, wenn jemand mir in die richtige Richtung zeigen könnte :)

+1

Sie sind also nicht geheim, weil jeder den öffentlichen Schlüssel kennt? Ihr Fehler: Sie möchten keinen Schlüssel generieren, der auf X509-codierten Daten basiert, sondern auf einem Passwort basieren: http://stackoverflow.com/a/992413/995891 – zapl

+0

Ah, ich habe Dinge beim Tippen gemischt . Der Benutzer sollte eine Nachricht unter Verwendung des öffentlichen Schlüssels ihres Ziels verschlüsseln (z. B. wenn ich eine Nachricht an meinen Freund senden möchte, verschlüssele ich mit diesem öffentlichen Schlüssel für Freunde). Ich werde einen Blick auf den Link werfen, den du gepostet hast :) – Pancake

+1

Vielleicht ist es nur ein Tippfehler aber der öffentliche Schlüssel ist jedem bekannt, du kannst * en * kryptieren Daten damit, die nur der Empfänger (= Besitzer des privaten Schlüssels) kann * de * krypten. So ist es sicher, Nachrichten zu senden. editieren: ja. – zapl

Antwort

2

Ein Geheimnis ist kein öffentlicher Schlüssel.

Sie verschlüsseln mit dem öffentlichen Schlüssel des Empfängers. Dieser Wert ist public, was bedeutet, dass jeder nachschlagen kann. Sie müssen den Wert des öffentlichen Schlüssels des anderen Teilnehmers ermitteln und ihn in Ihren Code einspeisen, und nicht Ihren eigenen privaten Schlüssel senden. Der richtige Weg, um dies zu tun, beinhaltet keine Geheimnisse!

Normalerweise verschlüsselt man eine Nachricht nicht direkt mit RSA, sondern verschlüsselt einen AES-Schlüssel (oder einen anderen symmetrischen Schlüssel) mit RSA und verwendet den AES-Schlüssel zum Verschlüsseln der Nachricht. Wenn Ihre Nachrichten wirklich kurz sind, können Sie RSA direkt verwenden, aber es funktioniert nicht für lange Nachrichten.

Hier sind ein paar Links zeigen, wie RSA auf Android implementieren: "Andere Benutzer Nachrichten entschlüsselt werden können, ihre öffentlichen Schlüssel"

Verwandte Themen