JCE mit AES

Status
Nicht offen für weitere Antworten.

Saxony

Top Contributor
Hiho,

ich würde gerne einen String verschlüsseln und auch wieder entschlüsseln. Bisher brachte ich es zu folgendem Code:

Java:
public class MyCipher {

	private Cipher cipher;
	private Key key;

	public MyCipher () {

		try {

			this.cipher = Cipher.getInstance("AES");

			byte[] raw = { viele (16) bytes };

			this.key = new SecretKeySpec(raw, "AES");

		} catch (NoSuchAlgorithmException e) {

			e.printStackTrace();
		} catch (NoSuchPaddingException e) {

			e.printStackTrace();
		}
	}

	private String encrypt(String aData) {

		String result = "";

		try {

			cipher.init(Cipher.ENCRYPT_MODE, key);
			
			byte[] decodedData = new BASE64Decoder().decodeBuffer(aData); 
			
			byte[] encryptedData = cipher.doFinal(decodedData);
			
			result = new BASE64Encoder().encode(encryptedData);
			
		} catch (InvalidKeyException e) {

			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {

			e.printStackTrace();
		} catch (BadPaddingException e) {

			e.printStackTrace();
		} catch (IOException e) {
			
			e.printStackTrace();
		}

		return result;
	}

	private String decrypt(String aData) {

		String result = "";

		try {

			cipher.init(Cipher.DECRYPT_MODE, key);
			
			byte[] decodedData = new BASE64Decoder().decodeBuffer(aData); 
			
			byte[] encryptedData = cipher.doFinal(decodedData);
			
			result = new BASE64Encoder().encode(encryptedData);
			
		} catch (InvalidKeyException e) {

			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {

			e.printStackTrace();
		} catch (BadPaddingException e) {

			e.printStackTrace();
		} catch (IOException e) {
		
			e.printStackTrace();
		}

		return result;
	}
}

So das funktioniert auch (fast) soweit!

Möchte ich besipielsweise "HalloWelt" verschlüsseln und wieder entschlüsseln bekomme ich nur "HalloWel" zurück. Wenn ich es mit "1234567890" versuche bekomme ich "123456789078" zurück. Mit "1234" klappt es. Ich habe also nun Grund zu der Annahme, dass nur ganzzahlige Vielfache von 4 (byte) gültige bzw. vollständig zu verschlüsselnde Datensätze darstellen.

Wie kann ich aber nun auch andere Textlängen verschlüsseln bzw. den original Text wiederbekommen?

bye Saxony
 
Ich denke, das Stichwort "Padding" könnte dir weiterhelfen. Die AES Implementierungen benötigen imho immer eine "gepaddeten" Eingabe, da AES ein blockweise arbeitender Algorithmus ist.

Using padding in encryption

Schau dir auch mal die bouncycastle Library dazu an.
 

Saxony

Top Contributor
Hiho,

so nachdem ich nun eine ganze Weile mit CBC, CFB, ECB, PKCS5Padding, PKCS7Padding, NoPadding usw. rumgespielt habe - gab es folgende Überraschung:

Java:
private String encrypt(String aData) {

	String result = "";

	try {

		cipher.init(Cipher.ENCRYPT_MODE, key);

		byte[] utf8 = aData.getBytes("UTF8");

		byte[] encryptedData = cipher.doFinal(utf8);

		result = new BASE64Encoder().encode(encryptedData);

	} catch (InvalidKeyException e) {

		e.printStackTrace();
	} catch (IllegalBlockSizeException e) {

		e.printStackTrace();
	} catch (BadPaddingException e) {

		e.printStackTrace();
	} catch (IOException e) {

		e.printStackTrace();
	}

	return result;
}

private String decrypt(String aData) {

	String result = "";

	try {

		cipher.init(Cipher.DECRYPT_MODE, key);

		byte[] decodedData = new BASE64Decoder().decodeBuffer(aData);

		byte[] utf8 = cipher.doFinal(decodedData);

		result = new String(utf8, "UTF8");

	} catch (InvalidKeyException e) {

		e.printStackTrace();
	} catch (IllegalBlockSizeException e) {

		e.printStackTrace();
	} catch (BadPaddingException e) {

		e.printStackTrace();
	} catch (IOException e) {

		e.printStackTrace();
	}

	return result;
}

Es war also nur etwas durcheinander bei meinen Encoding Dingen und nicht beim Cryptovorgang an sich!
Als default (Verwendung von "AES") scheint der Cipher schon automatisch zu padden und ECB zu verwenden.

Naja nun klappt es auf jeden Fall auch wenn String.length % [8,16] != 0; :)

bye Saxony
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben