Verschlüsselung mit Java

Dogano88

Mitglied
Hallo Freunde,

ich habe da eine Frage, wo ich nicht weiter komme. Ich habe mir ein wenig Code zusammengestellt, welches einzelne Strings verschlüsselt (ich hoffe das tut es) 🙂

Hier mal der Code:

Java:
public class encryptionTest {
	public static void main(String[] args) {
		String xform = "RSA/ECB/PKCS1Padding";
		
			
		KeyPairGenerator kpg = null;
		try {
			kpg = KeyPairGenerator.getInstance("RSA");
			System.out.println(a);
		} catch (NoSuchAlgorithmException e2) {
			// TODO Auto-generated catch block
			e2.printStackTrace();
		}
		kpg.initialize(512);
		KeyPair kp = kpg.generateKeyPair();
		PublicKey pubk = kp.getPublic();
		PrivateKey prvk = kp.getPrivate();

		String string = new String("Dieser Text soll verschlüsselt werden!");
		byte[] dataBytes = string.getBytes();
		byte[] encBytes = null;
		try {
			encBytes = encrypt(dataBytes, pubk, xform);
		} catch (Exception e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		byte[] decBytes = null;
		try {
			decBytes = decrypt(encBytes, prvk, xform);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		System.out.println("unverschlüsselter String: " + string);
		System.out.println("verschlŸsselter Text: " + new String(encBytes));
		System.out.println("entschlŸsselter Text: " + new String(decBytes));
	}

	private static byte[] encrypt(byte[] inpBytes, PublicKey key, String xform)
			throws Exception {
		Cipher cipher = Cipher.getInstance(xform);
		cipher.init(Cipher.ENCRYPT_MODE, key);
		return cipher.doFinal(inpBytes);
	}

	private static byte[] decrypt(byte[] inpBytes, PrivateKey key, String xform)
			throws Exception {
		Cipher cipher = Cipher.getInstance(xform);
		cipher.init(Cipher.DECRYPT_MODE, key);
		return cipher.doFinal(inpBytes);
	}

}

Jetzt habe ich aber eine andere Frage: ich möchte Strings in einem Array verschlüsseln und in eine Datenbank ablegen. Diesbezüglich habe ich 2 Fragen:

das Schlüsselpaar darf ich nicht jedes mal neu generieren, oder? Wie kann ich das Programm soweit modifizieren, dass ein vom Anwender eingegebenes Passwort als Schlüssel genutzt wird?

Weiterhin habe ich Probleme gehabt ein Array (also Daten im Array) zu verschlüsseln. Könnt ihr mir behilflich sein?

Liebe Grüße,

Dogano
 
also alleine RSA mit 512 Bit ... erlaubt das java überhaupt ? dachte minimum sind 768 Bit ... naja ... doesnt matter ... du solltest aber eher 1024 oder 2048 Bit nutzen ... sonst kann es sein das dein input zu groß für den Block wird ...

mal davon abgesehen nutzt man RSA selbst eigentlich nur um einen symetrischen schlüssel wie AES oder DESede zu verschlüsseln ... und nutzt dann für die eigentlichen daten das symetrische verfahren ... unter anderem auch weil symetrische verfahren CBC unterstützen und man damit deutlich größere nutzdaten verschlüsseln kann als der key selbst lang ist ...
 
Hi,

nach euren schlauen Tipps habe ich jetzt einmal versucht mit AES zu verschlüsseln. Ich habe folgende Klasse geschrieben, die ich mir zum größten Teil aus dem Internet zusammen kopiert und in Konstruktor und Klassen aufgeteilt habe. Die Sache ist aber, dass ich immer eine Fehlermeldung "Null Pointer Exception" bekomme, egal ob ich nun ver- oder entschlüsseln will:

Java:
public class Sicherheit {
	Cipher cipher;
	byte[] iv;
	SecretKeyFactory factory;
	AlgorithmParameters params;
	KeySpec spec;
	SecretKey tmp;
	SecretKey secret;

	public Sicherheit(String password) {
		char[] passwordForEncryption = password.toCharArray();
		try {
			factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
			spec = new PBEKeySpec(passwordForEncryption, "MOE31NbS".getBytes(),
					65536, 256);
			tmp = factory.generateSecret(spec);
			secret = new SecretKeySpec(tmp.getEncoded(), "AES");
			//cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
			cipher = Cipher.getInstance("AES");
			params = cipher.getParameters();
			iv = params.getParameterSpec(IvParameterSpec.class).getIV(); //Hier kommt die Fehlermeldung
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvalidParameterSpecException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvalidKeySpecException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	public byte[] encryption(String[] values) {
		byte[] ciphertext = null;
		try {
			cipher.init(Cipher.ENCRYPT_MODE, secret);
			for (int i = 0; i < 20; i++) {
				ciphertext = cipher.doFinal(values[i].getBytes("UTF-8"));
			}
		} catch (InvalidKeyException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (BadPaddingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return ciphertext;
	}

	public void decryption(byte[] ciphertext) {
		try {
			cipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));
			String plaintext = new String(cipher.doFinal(ciphertext), "UTF-8");
			System.out.println(plaintext);
		} catch (InvalidKeyException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvalidAlgorithmParameterException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (BadPaddingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

Java:
xception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at de.dogan.utils.Sicherheit.<init>(Sicherheit.java:42)
	at de.dogan.createGUI.swing.createGUI$4.actionPerformed(createGUI.java:219)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2028)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2351)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
	at java.awt.Component.processMouseEvent(Component.java:6382)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3275)
	at java.awt.Component.processEvent(Component.java:6147)
	at java.awt.Container.processEvent(Container.java:2083)
	at java.awt.Component.dispatchEventImpl(Component.java:4744)
	at java.awt.Container.dispatchEventImpl(Container.java:2141)
	at java.awt.Component.dispatchEvent(Component.java:4572)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4619)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4280)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4210)
	at java.awt.Container.dispatchEventImpl(Container.java:2127)
	at java.awt.Window.dispatchEventImpl(Window.java:2489)
	at java.awt.Component.dispatchEvent(Component.java:4572)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:704)
	at java.awt.EventQueue.access$400(EventQueue.java:82)
	at java.awt.EventQueue$2.run(EventQueue.java:663)
	at java.awt.EventQueue$2.run(EventQueue.java:661)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
	at java.awt.EventQueue$3.run(EventQueue.java:677)
	at java.awt.EventQueue$3.run(EventQueue.java:675)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:674)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Könnt ihr mir behilflich sein? Wie kann ich das Problem lösen?

Ferner will ich die Eingabe, also die Verschlüsselung über ein eindimensionales, die Entschlüsselung über einem 2D-String Array machen. Die Bytes sollen also in diese Arrays als plaintext gespeichert werden. Könnt ihr mir helfen meine Klassen dementsprechend anzupassen?

Liebe Grüße,

Dogano88
 
Java:
 byte[] ciphertext = null;
        try {
            cipher.init(Cipher.ENCRYPT_MODE, secret);
            for (int i = 0; i < 20; i++) {
                ciphertext = cipher.doFinal(values[i].getBytes("UTF-8"));
            }

ciphertext ist null. Dann weist du dem Array ein neues Array zu und das machst du 20 mal.
Dir ist bewusst, dass du jedes mal das vorherige Array einfach verwirfst?

Deine NPE wird irgendwo in dem Abschnitt (laut deinem Stacktrace) geworfen.
Also entweder ist cipher null, oder ein Eintrag in values ist null.
 
Hallo,

das mit den Arrays ist mir mehr oder weniger bewusst. Die Frage ist aber, ich habe ein Array, in dem 20 Werte gespeichert sind. Diese sollen verschlüsselt und an das aufrufende Programm zurück gegeben werden. Wenn ich

Java:
		byte[] ciphertext = new byte[20];
		try {
			cipher.init(Cipher.ENCRYPT_MODE, secret);
			for (int i = 0; i < 20; i++) {
				ciphertext[i] = cipher.doFinal(values[i].getBytes("UTF-8"));
			}

versuche, bekomm ich eine Exception, dass ich niht von byte[] zu byte konvertieren kann.

Java:
		byte[] ciphertext = new byte[20];
		try {
			cipher.init(Cipher.ENCRYPT_MODE, secret);
			for (int i = 0; i < 20; i++) {
				ciphertext = cipher.doFinal(values.getBytes("UTF-8"));
			}

Diese Variante funktioniert auch niht ganz.

Die Fehlermeldung erhalte ich wenn ich einen neuen IV anlegen will... Ich weiß echt nicht mehr weiter...
 
Hallo,

ich habe meine Klasse jetzt soweit verändert, dass das Verschlüsseln funktioniert. Nur habe ich leider immer noch Probleme mit dem Entschlüsseln. Ich kann diesen IV einfach nicht setzen. Ich bekomme immer diese NPE. Kennt einer eine Lösung?

Java:
public class Sicherheit {
	Cipher dcipher;

	byte[] salt = new String("12345678").getBytes(); // TODO new Salt !!
	int iterationCount = 1024;
	int keyStrength = 256;
	SecretKeySpec key;
	IvParameterSpec spec;
	byte[] iv;

	public Sicherheit(String password) throws InvalidParameterSpecException {
		SecretKeyFactory factory;
		try {
			factory = SecretKeyFactory
					.getInstance("PBKDF2WithHmacSHA1");
			KeySpec spec = new PBEKeySpec(password.toCharArray(), salt,
					iterationCount, keyStrength);
			SecretKey tmp = factory.generateSecret(spec);
			key = new SecretKeySpec(tmp.getEncoded(), "AES");
			dcipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvalidKeySpecException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

	public byte[] encrypt(String data) throws Exception {
		dcipher.init(Cipher.ENCRYPT_MODE, key);
		AlgorithmParameters params = dcipher.getParameters();
		iv = params.getParameterSpec(IvParameterSpec.class).getIV();
		byte[] utf8EncryptedData = dcipher.doFinal(data.getBytes());
		return utf8EncryptedData;
	}

	public String decrypt(byte[] encryptedData)
			throws UnsupportedEncodingException {
		byte[] utf8 = null;

		try {

			dcipher.init(Cipher.DECRYPT_MODE, key,new IvParameterSpec(iv));
			utf8 = dcipher.doFinal(encryptedData);

		} catch (InvalidKeyException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (BadPaddingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvalidAlgorithmParameterException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return new String(utf8, "UTF8");
	}

}

Java:
xception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at javax.crypto.spec.IvParameterSpec.<init>(DashoA13*..)
	at de.dogan.utils.Sicherheit.decrypt(Sicherheit.java:72)
	at de.dogan.database.hsqldb.HSQLConnection.getDataFromDatabaseForOverview(HSQLConnection.java:108)
	at de.dogan.createGUI.swing.createGUI$4.actionPerformed(createGUI.java:228)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2028)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2351)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
	at java.awt.Component.processMouseEvent(Component.java:6382)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3275)
	at java.awt.Component.processEvent(Component.java:6147)
	at java.awt.Container.processEvent(Container.java:2083)
	at java.awt.Component.dispatchEventImpl(Component.java:4744)
	at java.awt.Container.dispatchEventImpl(Container.java:2141)
	at java.awt.Component.dispatchEvent(Component.java:4572)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4619)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4280)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4210)
	at java.awt.Container.dispatchEventImpl(Container.java:2127)
	at java.awt.Window.dispatchEventImpl(Window.java:2489)
	at java.awt.Component.dispatchEvent(Component.java:4572)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:704)
	at java.awt.EventQueue.access$400(EventQueue.java:82)
	at java.awt.EventQueue$2.run(EventQueue.java:663)
	at java.awt.EventQueue$2.run(EventQueue.java:661)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
	at java.awt.EventQueue$3.run(EventQueue.java:677)
	at java.awt.EventQueue$3.run(EventQueue.java:675)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:674)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
 
Zuletzt bearbeitet:
@TO
also ich weis zwar nicht woher du diesen mist hast .. aber mit CBC wirst du da nicht weit kommen ...

du versuchst aus einem nicht-CBC-Cipher dem kein IV übergeben wurde einen IV zu entnehmen ... das das kracht ist klar ...

@Slater
IV steht für initialization vector und ist beim CBC-mode (CipherBlockChain) wichtig ...
im CBC-mode wird nämlich immer der nächste block mit dem vorherigen XOR verknüpft ... und um den ersten block zu verschlüsseln muss man natürlich für diesen einen solchen block zur verfügung stellen .. und das ist dann der IV ...
näheres kann dir google und wikipedia zum thema AES/CBC-mode verraten

btw : CTR ist kein wirklich "schöner" mode ... denn hier wird lediglich ein counter durch den cipher geschoben und dessen ergebnis dann mit dem plain-text XOR verknüpft ... da gibt es deutlich bessere verfahren

@TO
auch wenn ich diese klassen und deren verwendung hier schon mal gepostet habe ... hier noch mal

RSAHelper.java
Java:
import java.io.*;
import java.security.*;
import javax.crypto.*;
public class RSAHelper
{
	private InputStream in;
	private OutputStream out;
	private PrivateKey privateKey;
	private PublicKey publicKey;
	private Cipher privateCipher;
	private Cipher publicCipher;
	public RSAHelper(InputStream in, OutputStream out)
	{
		this.in=in;
		this.out=out;
	}
	public boolean generateKeyPair()
	{
		try
		{
			KeyPairGenerator kpg=KeyPairGenerator.getInstance("RSA");
			kpg.initialize(2048);
			KeyPair kp=kpg.generateKeyPair();
			privateKey=kp.getPrivate();
			publicKey=kp.getPublic();
			return true;
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return false;
		}
	}
	public boolean sendPublicKey()
	{
		try
		{
			ObjectOutputStream oos=new ObjectOutputStream(out);
			oos.writeObject(publicKey);
			return true;
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return false;
		}
	}
	public boolean receivePublicKey()
	{
		try
		{
			ObjectInputStream ois=new ObjectInputStream(in);
			publicKey=(PublicKey)ois.readObject();
			return true;
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return false;
		}
	}
	public boolean initCipher()
	{
		try
		{
			if(privateKey!=null)
			{
				privateCipher=Cipher.getInstance("RSA/ECB/PKCS1PADDING");
				privateCipher.init(Cipher.UNWRAP_MODE, privateKey);
			}
			publicCipher=Cipher.getInstance("RSA/ECB/PKCS1PADDING");
			publicCipher.init(Cipher.WRAP_MODE, publicKey);
			return true;
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return false;
		}
	}
	public boolean sendSecretKey(SecretKey secretKey)
	{
		try
		{
			byte[] wrappedKey=publicCipher.wrap(secretKey);
			out.write((wrappedKey.length>>4));
			out.write(wrappedKey);
			return true;
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return false;
		}
	}
	public SecretKey receiveSecretKey()
	{
		try
		{
			int length=in.read();
			byte[] wrappedKey=new byte[(length<<4)];
			in.read(wrappedKey);
			return (SecretKey)privateCipher.unwrap(wrappedKey, "AES", Cipher.SECRET_KEY);
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return null;
		}
	}
}
ich weis das RSA/ECB/PKCS1PADDING auch nicht das gelbe vom ei ist ... aber es reicht wenn man jedes mal einen neuen RSA-schlüssel erzeugt

AESHelper.java
Java:
import java.io.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
public class AESHelper
{	
	private SecretKey key;
	private Cipher encryptCipher;
	private Cipher decryptCipher;
	public AESHelper(SecretKey key)
	{
		this.key=key;
	}
	public static SecretKey generateKey()
	{
		try
		{
			KeyGenerator keyGen=KeyGenerator.getInstance("AES");
			keyGen.init(128);
			return keyGen.generateKey();
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return null;
		}
	}
	public boolean initCipher()
	{
		try
		{
			IvParameterSpec iv=new IvParameterSpec(key.getEncoded());
			encryptCipher=Cipher.getInstance("AES/CBC/PKCS5PADDING");
			encryptCipher.init(Cipher.ENCRYPT_MODE, key, iv);
			decryptCipher=Cipher.getInstance("AES/CBC/PKCS5PADDING");
			decryptCipher.init(Cipher.DECRYPT_MODE, key, iv);
			return true;
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return false;
		}
	}
	public byte[] encryptRAW(byte[] input)
	{
		try
		{
			return crypt(input, encryptCipher);
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return null;
		}
	}
	public String encryptString(String input)
	{
		byte[] rawinput=input.getBytes();
		byte[] rawoutput=encryptRAW(rawinput);
		if(rawoutput==null)
		{
			return null;
		}
		return binaryToHexString(rawoutput);
	}
	public byte[] decryptRAW(byte[] input)
	{
		try
		{
			return crypt(input, decryptCipher);
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return null;
		}
	}
	public String decryptString(String input)
	{
		byte[] rawinput=hexStringToBinary(input);
		byte[] rawoutput=decryptRAW(rawinput);
		if(rawoutput==null)
		{
			return null;
		}
		return new String(rawoutput);
	}
	private byte[] crypt(byte[] data, Cipher cipher) throws Exception
	{
		ByteArrayInputStream bais=new ByteArrayInputStream(data);
		ByteArrayOutputStream baos=new ByteArrayOutputStream();
		int blockSize=cipher.getBlockSize();
		int outputSize=cipher.getOutputSize(blockSize);
		byte[] input=new byte[blockSize];
		byte[] output=new byte[outputSize];
		int inLength=0;
		boolean finished=false;
		while(!finished)
		{
			inLength=bais.read(input);
			if(inLength==blockSize)
			{
				int outLength=cipher.update(input, 0, blockSize, output);
				baos.write(output, 0, outLength);
			}
			else
			{
				finished=true;
			}
		}
		if(inLength>0)
		{
			output=cipher.doFinal(input, 0, inLength);
		}
		else
		{
			output=cipher.doFinal();
		}
		baos.write(output);
		return baos.toByteArray();
	}
	private String binaryToHexString(byte[] input)
	{
		StringBuilder stringBuilder=new StringBuilder(input.length*2);
		for(byte b : input)
		{
			int i=b&0xFF;
			if(i<16)
			{
				stringBuilder.append("0");
			}
			stringBuilder.append(Integer.toHexString(i));
		}
		return stringBuilder.toString();
	}
	private byte[] hexStringToBinary(String input)
	{
		byte[] output=new byte[input.length()/2];
		for(int i=0; i<output.length; i++)
		{
			output[i]=(byte)Integer.parseInt(input.substring(i*2, (i*2)+2), 16);
		}
		return output;
	}
}
in zeile 32 steckt das geheimnis : ich erzeuge aus dem key-material direkt den IV ... da beide 128 Bit lang sind kann dieser dann bei Cipher.init() direkt übergeben werden ...
wenn man mit key-längen 192 Bit oder 256 Bit arbeiten will muss man "key.getEncoded()" noch soweit verarbeiten das an den konstruktor nur 128 Bit kommen ... da AES nun mal eine feste blocklänge von 128 Bit hat ... aber keys auch mit 192 Bit und 256 Bit unterstützt ...

weiterhin sollte man beachten das wenn es zu enconding-fehlern in den String-methoden kommt man folgende änderungen machen muss

zeile 59 : getBytes() zu getBytes("UTF-8") und dann entsprechend die Exception verarbeiten
zeile 87 : new String(rawoutput) zu new String(rawoutput, "UTF-8") und auch hier entsprechend die Exception verarbeiten


da das ganze eigentlich für die sicherung einer netzwerk-kommunikation gedacht ist müsste man im RSAHelper noch eine methode einbauen die den privateKey rausrückt ... um später den AES-key wieder entschlüsseln zu können um damit die eigentlichen daten wieder zu entschlüsseln ...

da nach eigentlicher planung die entsprechende seite ihren privateKey ja nur am sitzungs-beginn für den austausch des AES-keys benötigt ist natürlich nur eine methode zum übertragen des publicKey vorgesehen ...

man kann das ganze aber noch recht einfach zu einem file-crypter umschrieben ...
alternativ könnte man entweder den AES-key direkt selbst ... oder den RSA-key sebst noch mal mit einem password-basierten verfahren verschlüsseln ...
kommt darauf an wie sicher es sein soll ... denn möglich wäre z.b. zwar den AES-key mit in das output-file zu schreiben ... den RSA-key selbst aber z.b. direkt auf einen USB-stick der dann zum entschlüsseln nötig ist ...

wie gesagt : das ganze ist eigentlich nicht dafür gedacht dierekt dateien zu verschlüsseln sondern eine netzwerk-kommunikation abzusichern ... braucht halt n bissl arbeit um daraus n file-crypter zu machen ... aber den aufwand mach ich mir jetzt nicht ... außerdem sollte aus dem code sowie der DOC zu den jeweiligen klassen die verwendung klar werden ...
 

Zurück
Oben