[Exception] RSA Verschlüsselung.

Lord_Aratorn

Aktives Mitglied
Hey, ich habe folgenden Code:

Java:
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import javax.crypto.Cipher;


public class RSACrypt {
	public byte[] decrypt(Key privateKey, byte[] encrypted)
	{
	    try
	    {
	        Cipher cipher = Cipher.getInstance("RSA");
	        cipher.init(Cipher.DECRYPT_MODE, privateKey);
	        cipher.update(encrypted);
	        return cipher.doFinal();
	    }
	    catch (Exception e)
	    {
	    	e.printStackTrace();
	    }
	    return null;
	}
	
	public byte[] encrypt(Key publickey, byte[] inputFile)
	{
	    try
	    {
	        Cipher cipher = Cipher.getInstance("RSA");
	        cipher.init(Cipher.ENCRYPT_MODE, publickey);
	        cipher.update(inputFile);
	        return cipher.doFinal();
	    }
	    catch (Exception e)
	    {
	    	e.printStackTrace();
	    }
	    return null;
	}

	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		KeyPairGenerator pairgen;
		try {
			pairgen = KeyPairGenerator.getInstance("RSA");
	        SecureRandom random = new SecureRandom();
	        pairgen.initialize(512, random);
	        KeyPair keyPair = pairgen.generateKeyPair();
	        
	        Key publicKey = keyPair.getPublic();
	        Key privateKey = keyPair.getPrivate();
	        
//	        System.out.println("pub:"+ publicKey);
//	        System.err.println("priv:"+ privateKey);
	        
	        
	        RSACrypt cryptor = new RSACrypt();
	        byte[] encrypted = cryptor.encrypt(publicKey, "Dude ist so verdammt cool, das sich die bäume bewegen im wind der gezeiten.".getBytes());
		    System.out.println(new String(encrypted));
	        byte[] decrypted = cryptor.decrypt(privateKey, encrypted);
	        System.out.println(new String(decrypted));
	        
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
	}

}

Der Code, soll den test-String "Dude ist so verdammt cool, das sich die bäume bewegen im wind der gezeiten." mit RSA verschlüsseln, anschließend wieder entschlüsseln und ausgeben. Jedoch wird folgende Exception geworfen

Code:
javax.crypto.IllegalBlockSizeException: Data must not be longer than 53 bytes
	at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:338)
	at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:383)
	at javax.crypto.Cipher.doFinal(Cipher.java:1708)
	at test.RSACrypt.encrypt(RSACrypt.java:34)
	at test.RSACrypt.main(RSACrypt.java:63)
Exception in thread "main" java.lang.NullPointerException
	at java.lang.String.<init>(String.java:601)
	at test.RSACrypt.main(RSACrypt.java:64)

Wie man ersehen kann ist der String zu lang und es läuft beim doFinal der encryption Methode was fehl.
Der String "horst" wird ohne Probleme ver- und ent-schlüsselt.
Nun muss ich jedoch auch längere Nachrichten (strings) verschlüsseln können.
Vielleicht hat einer von euch nen Plan, wodran es scheitert.
 

Lord_Aratorn

Aktives Mitglied
Danke für eure Antworten.
Jedoch ist mir dennoch nicht klar, wie ich das Problem beheben kann.
Der erste Link gibt nicht mal irgendwelche Informationen. Nur den Hinweis, das man synchrone und asynchrone verfahren mischen sollte.
 
Zuletzt bearbeitet:

Wortraum

Bekanntes Mitglied
Der Hinweis soll Dir sagen, daß Du mit dem asymmetrischen Verfahren (RSA) einen geheimen Schlüssel eines symmetrischen Verfahrens (beispielsweise AES) verschlüsseln sollst. Statt also die Daten mit RSA zu verschlüsseln, verschlüsselst Du einen geheimen Schlüssel, mit dem wiederum die Daten verschlüsselt sind. Das ist gängige Praxis und nennt sich hybride Verschlüsselung.

Diese hat drei entscheidende Vorteile: die Verschlüsselung ist etwa um den Faktor 1000 schneller; man kann beliebig große Daten verschlüsseln; die Daten müssen nicht für jede Person einzeln mit dessen öffentlichen Schlüssel verschlüsselt werden, sondern nur der geheime Schlüssel.

Du mußt bei Dir also noch folgendes machen:
1) Einen geheimen Schlüssel erzeugen, am besten mit AES.
2) Mit diesem Schlüssel verschlüsselst Du die Daten, die Du derzeit mit dem öffentlichen RSA-Schlüssel zu verschlüsseln versuchst.
3) Statt den Daten verschlüsselst Du mit dem öffentlichen RSA-Schlüssel jetzt nur den AES-Schlüssel.

Das klingt erst einmal kompliziert, ist es aber eigentlich gar nicht. Und nur so kann man die Vorteile von asymmetrischen und symmetrischen Verfahren nutzen. Vielleicht brauchst Du das aber gar nicht und Dir reicht nur AES, das geht natürlich auch. Nur so, wie Du es jetzt hast, geht es nicht, weil sich mit RSA nur sehr kleine Datenmengen verschlüsseln lassen (abhängig von der Schlüssellänge).

Noch ein kleiner Hinweis zur Terminologie:
1) Privater Schlüssel: der private Schlüssel bei einem asymmetrischen Verfahren, der geheim bleiben muß.
2) Geheimer Schlüssel: der Schlüssel bei einem symmetrischen Verfahren, den nur die Personen kennen dürfen, die die Daten lesen sollen.

Viel Erfolg beim Rumprobieren! :)
 
Zuletzt bearbeitet:

Lord_Aratorn

Aktives Mitglied
Vielleicht brauchst Du das aber gar nicht und Dir reicht nur AES, das geht natürlich auch. Nur so, wie Du es jetzt hast, geht es nicht, weil sich mit RSA nur sehr kleine Datenmengen verschlüsseln lassen (abhängig von der Schlüssellänge).

Ah Ok, es ist also abhängig von der Länge des Erzeugten Schlüssels wie viel Byte an Daten verschlüsselt werden können. Dann versuche ich mal einen längeren Schlüssel.

Ich kenne hybride Verschlüsselungsverfahren und auch das wrappen eines Keys. Doch soll für das Projekt an dem ich gerade arbeite, Daten auf dem Netzwerk verschlüsselt werden, und die Vorgabe ist RSA. Warum? Keine Ahnung SSH wäre da wahrscheinlich eine sinnvollere Lösung.
 
S

SlaterB

Gast
längerer Schlüssel hilft nur wenn die Grenze der Daten fast erreicht ist,
aber dein String kann doch statt 60 auch 100 oder 1000 oder 10000 Byte lang sein,
da nützt es nicht, den eh schon langen und komplizierten Schlüssel genauso aufzublähen,

wenn schon dann arbeite in die naheliegende andere Richtung:
zerteile die zu verschlüsselnden Daten in 50 Byte-Blöcke und verschlüssele die einzeln
 

Lord_Aratorn

Aktives Mitglied
ja das habe ich mir auch schon überlegt. Doch da die Netzwerkkommunikation über udp abgehalten werden soll, und da udp weder die Reihenfolge noch die Richtigkeit des Inhaltes sicherstellt, muss ich entweder ein Paket mit allen Blöcken verschicken oder mich selbst um die Reihenfolge kümmern. Schließlich muss der Inhalt wieder zusammengesetzt werden.
 
S

SlaterB

Gast
die Methode encrypt gibt wie bisher am Ende ein byte[] zurück, das Aufteilen beim Ver- und Entschlüsseln wird da intern abgewickelt, soweit möglich,
ganz unabhängig von der sonstigen Verwendung
 

Lord_Aratorn

Aktives Mitglied
Das ist mir schon klar, doch muss ich ja das byte[], was ich verschlüsseln will, aufteilen. Anschließend jeden Block verschlüsseln und am ende sämtliche Blöcke zusammenfügen zu einem byte[] und dieses zurückgeben. Oder habe ich da was falsch verstanden?
 

Lord_Aratorn

Aktives Mitglied
dann müssten ja sämtliche verschlüsselte Blöcke die selbe Länge haben, oder?
Welche wäre die denn? Ist die Blocklänge vor der Verschlüsselung genauso groß wie danach?
 
S

SlaterB

Gast
ich kann das nicht sagen, du könntest es problemlos ausprobieren ;)
notfalls musst du dir ein Protokoll überlegen, die ersten 100 Bytes sind reserviert für Metainformationen,
im ersten Byte steht die Anzahl der Blöcke n (< 100), in den nächsten n Bytes steht die Länge dieser Blöcke, danach kommen die Bytes,
oder ähnliches

wenn zu kompliziert, dann eben nicht, war nur ein Vorschlag, hab es selber noch nicht gemacht
 

Lord_Aratorn

Aktives Mitglied
Ich habe mal die encryption und die decryption methode umgeschreiben. Und die klasse um instanzvariablen (publickey, privatekey, test) erweitert.
test beinhaltet die selben daten wie der erste verschlüsselte block. Dies ist zum testen, ob die Blöcke vom encrypt denen vom decrypt entsprechen.
Jedoch ist dieses wohl nicht der Fall. Der auskommentierte Code der encrypt-Methode funktioniert, wenn er einkommentiert wird. der Code in der decrypt jedoch nicht.

Java:
public byte[] decrypt2(Key privateKey,  byte[] encrypted, int blocksize)
	{
	    try
	    {
	    	ByteArrayOutputStream bos = new ByteArrayOutputStream();
//	    	for (int i = 0; i < encrypted.length; i=i+blocksize) {
	    	int i = 0;
		    	byte[] tmp = new byte[blocksize];
		    	System.arraycopy(encrypted, i, tmp, 0, blocksize);
		    	System.out.println("tmp: "+new String(tmp));
		    	System.out.println("test: "+new String(test));
		    	if (new String(test).equals(new String(tmp))) {
					System.out.println("gleich");
				}
		        Cipher cipher = Cipher.getInstance("RSA");
		        cipher.init(Cipher.DECRYPT_MODE, privateKey);
		        tmp = cipher.doFinal(tmp);
		        bos.write(tmp);
		    	System.err.println("länge: "+ tmp.length + "inhalt:" +new String(tmp));
//	    	}
	    	return bos.toByteArray();
	    }
	    catch (Exception e)
	    {
	    	e.printStackTrace();
	    }
	    return null;
	}
	
	public byte[] encrypt(Key publickey, byte[] inputFile, int blocksize)
	{
	    try
	    {
	    	ByteArrayOutputStream bos = new ByteArrayOutputStream();
	    	for (int i = 0; i < inputFile.length; i=i+blocksize) {
	    		byte[] tmp = new byte[blocksize];
	    	
	    		if (tmp.length < inputFile.length- i){
	    			System.arraycopy(inputFile, i, tmp, 0, tmp.length);
	    		}else{
	    			for (int j = 0; j < inputFile.length-i; j++) {
						tmp[j] = inputFile[i+j];
					}
	    		}
	    		Cipher cipher = Cipher.getInstance("RSA");
	    		cipher.init(Cipher.ENCRYPT_MODE, publickey);
	    		tmp = cipher.doFinal(tmp);
//		    		cipher.init(Cipher.DECRYPT_MODE, privateKey);
//			        tmp = cipher.doFinal(tmp);
//			        System.out.println("dc: "+new String(tmp));
	    		if(i == 0)
	    			this.test = tmp;
	    		bos.write(tmp);
	    		System.err.println("länge: "+ tmp.length + "inhalt:" +new String(tmp));
	    	}
	    	
	        return bos.toByteArray();
	    }
	    catch (Exception e)
	    {
	    	e.printStackTrace();
	    }
	    return null;
	}
 

FArt

Top Contributor
Funktioniert nicht bedeuetet Exception oder der Vergleich schlägt fehl? Wenn zweiteres, ist es dann wirklich die Entschlüsselung, die fehlschlägt? Wenn ersteres, was sind das für Fehler?
Eines verstehe ich nicht: über meine gepostete Google-Suche findet man sehr schnell funktionierenden Beispielcode. Warum nimmst du den nicht als Startpunkt her? Oft gibt es auch praktische Kommentare dazu, z.B. welche Fehler oft gemacht werden und wie man dem begegnet...

Beispiel für einen Kommentar, der zu deinen Postings hier passen könnte:
Thanks a lot!
It was very usefull for me. I had a problem encryting long bytes arrays, this article solved my problens; which were that I didn’t have a copyBytes() method to pass full byte arrays. How ever I tryed to encript a byte array which was not full complete and then , when I tryed to decript it I had exceptions with block size padding and similar.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Object cast exception Allgemeine Java-Themen 7
W Queue.remove() -> no such element exception Allgemeine Java-Themen 17
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
N Kann ich die Nullpointer Exception umgehen Allgemeine Java-Themen 12
N A java Exception has occured Allgemeine Java-Themen 8
G javafx "class path" exception Allgemeine Java-Themen 5
H Interface PluginSystem ClassNotFound exception für library Klassen Allgemeine Java-Themen 10
tom.j85 Exception bei Abfrage von Ländercodes in API? Allgemeine Java-Themen 13
S Exception Allgemeine Java-Themen 5
LimDul Streams und Exception Allgemeine Java-Themen 8
C FileLock - Exception wird immer geworfen Allgemeine Java-Themen 4
S Wertbeschränkung Exception oder Anpassung? Allgemeine Java-Themen 4
D Nullpointer Exception Problem Allgemeine Java-Themen 5
Kirby.exe Nullpointer Exception bei Queue Allgemeine Java-Themen 5
R Schlüsselworte "Throw new exception" gibt nicht den String als Fehlermeldung aus Allgemeine Java-Themen 2
P Swing Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: npoints > xpoints.length || npoints > ypoints.length Allgemeine Java-Themen 5
S RMI Exception Allgemeine Java-Themen 0
S MSSQL Exception & Connection String Allgemeine Java-Themen 19
S Interface, generischer Datentyp, Exception? Allgemeine Java-Themen 3
coolian warum bekomme ich ein string index out of bounds exception Allgemeine Java-Themen 17
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
S Exception in thread "main" java.lang.NullPointerException at FamilienApp.main(FamilienApp.java:15) Allgemeine Java-Themen 1
M Klassen Serializable Exception Allgemeine Java-Themen 1
E HILFE !! Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/io/FileUtils Allgemeine Java-Themen 4
E Thread Exception Allgemeine Java-Themen 6
javaerd Binomialkoeffizient ausrechnen, Exception in thread "main" java.lang.StackOverflowError Allgemeine Java-Themen 6
M xlsx File auslesen Exception occured Allgemeine Java-Themen 13
X jvm exception abfangen und an externes Programm schicken Allgemeine Java-Themen 4
G Java/LibGDX File Loading Exception Allgemeine Java-Themen 2
B Exception in Application init method Allgemeine Java-Themen 5
H OOP Testen einer Exception mit JUnit Allgemeine Java-Themen 8
M javafx ComboBox- Nullpointer Exception Allgemeine Java-Themen 6
perlenfischer1984 Dialect class not found exception Allgemeine Java-Themen 15
Thallius Bekomme keine Exception mit Stacktrace mehr. Was habe ich getan? Allgemeine Java-Themen 13
perlenfischer1984 Functionsparameter prüfen und eine Exception werfen !? Allgemeine Java-Themen 11
E Probleme mit nextInt() und Exception Allgemeine Java-Themen 35
Z Exception wird nicht ausgelöst Allgemeine Java-Themen 2
0 Animiertes Gif anzeigen - NullPointer Exception Allgemeine Java-Themen 19
T Konstruktor löst exception aus Allgemeine Java-Themen 7
KilledByCheese Dezimal nach Hexadezimal rechner wirft seltsame exception Allgemeine Java-Themen 4
V Compiler-Fehler Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 125, Size: 125 Allgemeine Java-Themen 11
D Codeausführung bevor Exception abgeschlossen ist Allgemeine Java-Themen 11
T FileNotFound Exception Allgemeine Java-Themen 9
L Exception/Error auf JDialog umleiten Allgemeine Java-Themen 2
C Arithmetic Exception, obwohl nichts 0 ist Allgemeine Java-Themen 5
M A Java Exception has occured. Allgemeine Java-Themen 1
J Exception in thread "main" java.lang.NoClassDefFoundError Allgemeine Java-Themen 4
M Exception in thread "AWT-EventQueue-0" Allgemeine Java-Themen 6
P Input/Output java.util.Scanner in einer Schleife und Exception-Behandlung: Einlesen einer Zahl Allgemeine Java-Themen 4
E A Java Exception Has Occured Allgemeine Java-Themen 4
T Exception handling Allgemeine Java-Themen 7
P lazy loading exception Allgemeine Java-Themen 0
A Interpreter-Fehler OutOfMemory Exception mit Base64 decode Allgemeine Java-Themen 3
S Java Applet Crash - Keine Exception Allgemeine Java-Themen 8
S Best Practice verschiedene Exceptions fangen und neue Exception erzeugen Allgemeine Java-Themen 11
K Exception in thread "AWT-EventQueue-1" Allgemeine Java-Themen 2
K Gepacktes Jar-File gibt beim Doppelklick eine Exception aus Allgemeine Java-Themen 4
P Eigene Exception Klasse Allgemeine Java-Themen 7
N Java Interne Exception Allgemeine Java-Themen 4
B JUnit4 Exception-Test Allgemeine Java-Themen 4
127.0.0.1 SQL Exception, kein Driver Allgemeine Java-Themen 9
S Erste Schritte Exception beendet Schleife nicht - Methode macht trotz throw weiter? Allgemeine Java-Themen 9
R ZIP FileSystem unter Windows wirft exception Allgemeine Java-Themen 7
H java.util.Timer und Funktion mit SQL Exception Allgemeine Java-Themen 5
Ollek Barcode mit Barcode4J erzeugen - Exception Allgemeine Java-Themen 4
Z Concurrent Modification Exception - HashMap (kein remove) Allgemeine Java-Themen 4
E Eigene Exception Klasse erstellen Allgemeine Java-Themen 3
L Variablen IO Exception weil File angeblich nicht exisitert Allgemeine Java-Themen 10
T Exception versus Rückgabeparamter Allgemeine Java-Themen 26
S Exception enableDepthTest Allgemeine Java-Themen 7
M JAXB Reimport zu Hibernate DB -> Exception Allgemeine Java-Themen 3
W Kleine Frage zu Null-Pinter-Exception Allgemeine Java-Themen 21
aze JUnit: Testen ob bestimmte Exception nicht auftritt Allgemeine Java-Themen 18
S Null Pointer Exception bei BufferedReader Allgemeine Java-Themen 4
N Runtime.exec() Exception Problem Allgemeine Java-Themen 3
P Default constructor cannot handle exception type Allgemeine Java-Themen 6
M Objekt prüfen auf null ->Invocation Target Exception??? Allgemeine Java-Themen 2
S Bildaufbau durch Servlet -> Exception Allgemeine Java-Themen 11
E Queue: Wie kann hier ein null-Pointer Exception auftreten?! Allgemeine Java-Themen 11
S Exception beim Schreiben des Dataset in XML Datei Allgemeine Java-Themen 8
M Webstart Exception trotz signierten JARs Allgemeine Java-Themen 3
E Interpreter-Fehler unbekannte Exception Allgemeine Java-Themen 12
B Komische Exception Allgemeine Java-Themen 4
U SwingWorker und Exception Allgemeine Java-Themen 3
B Nullpointer Exception in Array Allgemeine Java-Themen 15
G WebService Exception Allgemeine Java-Themen 3
M Best Practices Exception Handling für eigene library Allgemeine Java-Themen 8
G PermSpace Exception Allgemeine Java-Themen 2
S Invalid Chunk Exception Allgemeine Java-Themen 3
N URLClassLoader Exception Allgemeine Java-Themen 5
Apo Java Sound Mark/Reset Exception Allgemeine Java-Themen 14
M Exception ganz sehen Allgemeine Java-Themen 2
D Problem mit EasyMock und Exception Allgemeine Java-Themen 6
B Exception wird geworfen, ich darf sie aber nicht abfangen. Allgemeine Java-Themen 10
7 Exception wird nicht aufgefangen Allgemeine Java-Themen 8
C Desktop.mail Problem. IO Exception: Failed to open. Allgemeine Java-Themen 3
Final_Striker Exception bei neuem Look und Feel Allgemeine Java-Themen 2
N Exception beim auslesen einer JTable Allgemeine Java-Themen 5
nrg Stilistisch korrektes Exception Handling Allgemeine Java-Themen 4
F Geworfene Exception kommt nicht an Allgemeine Java-Themen 6

Ähnliche Java Themen


Oben