RSA Verschlüsselung kleines Problem

pilx

Mitglied
Ich bin gerade dabei in Java die RSA Verschlüsselung zu implementieren. Das Erstellen der Schlüssel dürfte soweit funktionieren (bin mal mit einem Debugger durchgegangen), Probleme habe ich allerdings dabei, wenn Text verschlüsselt werden soll. Ich bekomme als Ausgabe lauter Fragezeichen und im Debugger chinesische Schriftzeichen...

Ver- und Entschlüsselt wird mit den folgenden Methoden
Java:
public String[] cipher(String text) {
   	
    	//zerlegt in Zahlenfolge
	    BigInteger[] zahlen = CipherTools.split(text,modulus);
	    
	    //chiffriert jede Zahl
	    for(int i=0; i < zahlen.length; i++) {
	    	zahlen[i] = zahlen[i].modPow(privateExponent,modulus);
	    }
	    
	    //gibt Folge von Zahlen aus
	    String[] fertig = CipherTools.transform(zahlen);
	    return fertig;
	   
    }
   
    public String decipher(String... text) {
   	
    	//berechnet die Zahl c zu jedem Stueck Text
    	BigInteger[] zahlen = CipherTools.transform(text);
    	
    	//dechiffriert jede Zahl
    	for(int i=0; i < zahlen.length; i++) {
    		zahlen[i] = zahlen[i].modPow(privateExponent,modulus);
    	}
    	
    	//gibt zusammenhaengenden Text aus
    	return CipherTools.concat(CipherTools.transform(zahlen));
    	
    }

split ist eine Methode, die Text in Zahlen umwandelt. transform sind Methoden, die Folgen von Zahlen in Folgen von Texten umwandeln bzw. umgekehrt und concat ist eine Methode, die aus einem Array von Texten (also String[]) wieder einen einzelnen erstellt (String).
 
Also CipherTools kenne ich persönlich nicht. Ist das 'ne eigene Klasse? Dann könnte es daran liegen, dass in den zu verschlüsselnden Texten Sonderzeichen verwendet werden und bei der Wandlung in BigInteger "<String>.getBytes()" ohne den Parameter Charset verwendet wird. Der BigInteger erhält deswegen einen falschen Wert.
In diesem Falle liegt es nahe, die Texte mal völlig unkonventionell in ein ByteArray zu wandeln und daraus die BigInteger zu erstellen.
Java:
import java.nio.ByteBuffer;
import java.nio.CharBuffer;

public class BufferTest
{
	public static void main(String ... args)
	{
    	char[] ch = "test".toCharArray();
    	ByteBuffer bb = ByteBuffer.allocateDirect(ch.length * 2);
    	CharBuffer cb = bb.asCharBuffer();
    	cb.put(ch);
    	byte[] by = new byte[bb.capacity()];
    	bb.get(by);
    	BigInteger out = new BigInteger(by);
    	System.err.println(out);
	}
}
Die Zurückwandlung in einen String funktioniert entsprechend umgekehrt. Das Ganze ist auch völlig unabhängig von irgendwelchen Zeichensätzen geschweige denn Sonderzeichen.
 
das war es nicht...schade. Naja diese Tools sind einfach nur Methoden mit denen Text zu Zahlen gemacht werden kann, umgekehrt das gleiche und Textteile zu einem String.
 
Okay, wenn ich drüber nachdenke, muss das nicht mal ein Fehler sein, weil es eben nur um die Verschlüsselung geht. Das Problem dabei ist ja, dass die verschlüsselten Zahlen mehr oder weniger zufällig sind und die daraus resultierenden Texte natürlich ebenso unleserlich. Solange aus dem verschlüsseltem Text per "decipher()" wieder der Klartext errechnet wird, ist alles in Ordnung.
 
Ok, mein Fehler lag woanders. Ich bin ja noch Anfänger und habe nicht sauber gearbeitet. Hatte zwei BigInteger und folgendes geschrieben
Java:
p.subtract(BigInteger.ONE)
q.subtract(BigInteger.ONE)
f = p.multiply(q)

dabei hätte man entweder p = p... schreiben müssen oder einfach so wie ich es jetzt gemacht habe
Java:
BigInteger f = (p.subtract(BigInteger.ONE)).multiply(q.subtract(BigInteger.ONE));
 

Neue Themen


Zurück
Oben