[Java] Verschlüsselung mit Cipher

PlaciD

Böhser Onkel
ID: 55555
L
11 Februar 2007
722
105
Hi,

ich experimentiere gerade mit Cipher herum, aber es will nicht so recht klappen.

Grundgedanke ist folgender: Ich möchte Objekte vom Client zum Server schicken. Das klappt soweit. Nun sollen diese Objekte verschlüsselt werden.

Also habe ich mir folgende Methode für die Verschlüsselung gebaut:
Code:
private byte[] encrpyt(byte[] byteArray, PublicKey publicKey) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException{
		Cipher cipher = Cipher.getInstance(Config.TRANSFORMATION);
		cipher.init(Cipher.ENCRYPT_MODE, publicKey);
		return cipher.doFinal(byteArray);
	}

Aber die doFinal wirft nun die Exception:
javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes

Meinen Key generiere ich wiefolgt:

Code:
try {
			keyPairGen = KeyPairGenerator.getInstance(Config.ALGORITHM);
			keyPairGen.initialize(Config.KEY_SIZE);
			KeyPair keyPair = keyPairGen.generateKeyPair();
			this.privateKey = keyPair.getPrivate(); 
			this.publicKey = keyPair.getPublic();
		} catch (NoSuchAlgorithmException e) {
			System.out.println(e); // TODO Handle exception
		}

Ich bin nicht so fit in Verschlüsselung, deshalb komme ich mit der Exception nicht so klar. Heißt die Fehlermeldung jetzt, dass ich nur Nachrichten der Länge 117 bytes verschlüsseln kann? Idee wäre dann, das Objekt in ein Byte-Array umzuwandeln, dieses splitten, verschlüsseln, senden, entschlüsseln, zusammensetzen. Aber da gibt es bestimmt einen eleganteren Weg?

Grüße,
Sebastian
 
musst du nicht noch ein padding festlegen was bei byte-größen != blockgröße eingesetzt wird ?

Edit: statt die ganzen bytes in die dofinal-methode zu geben, gib die mal der update-methode und ruf danach dofinal mit leeren argumenten auf
 
Hi,

bezüglich des Paddings: Das habe ich noch überhaupt nicht verstanden, also keine Ahnung, was ich da eintragen kann/muss.

Zu deinem Lösungsvorschlag: Jetzt darf die Größe schon 118 Byte sein, leider noch nicht mehr... Hilft mir also auch nicht wirklich weiter.

Danke trotzdem,
Sebastian
 
bezüglich des Paddings: Das habe ich noch überhaupt nicht verstanden, also keine Ahnung, was ich da eintragen kann/muss.

k, also nehmen wir AES als Beispiel:
AES ist ein sogenannter "Blockchiffre", d.h. wenn du Daten verschlüsselst, müssen sie in Blöcke der Blocklänge unterteilt werden.
Wir haben eine Blockgröße von 256 Bit gewählt (von den Möglichkeiten 128, 192 und 256), also können wir Daten mit 256Bits, 512Bits, 768Bits usw encodieren.
Nun tritt es aber selten auf, dass man Daten verschlüsseln möchte, die genau der Blocklänge entsprechen, deshalb hängt man ein Padding an.
Die Art des Paddings, kann man nun auswählen, es gibt z.B. die Möglichkeit, dass man sagt, am Schluss wird ein 1-Bit angehängt und dann kommen nur noch 0-Bits.
Also wollen wir nun einen String verschlüsseln, der aus 64 Bits besteht, wird durch das Padding alles auf die Blocklänge von 256Bit aufgefüllt, um den Algorithmus nutzen zu können.