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
 
T

tröööt

Gast
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 ...
 

Dogano88

Mitglied
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
 

njans

Top Contributor
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.
 

Dogano88

Mitglied
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...
 

Dogano88

Mitglied
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:
T

tröööt

Gast
@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 ...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Einfache Java Verschlüsselung Java Basics - Anfänger-Themen 4
D Java Password verschlüsselung Java Basics - Anfänger-Themen 6
D Java Verschlüsselung Java Basics - Anfänger-Themen 8
A Einfache java Verschlüsselung HILFE Java Basics - Anfänger-Themen 3
A Java Verschlüsselung/Cipher Java Basics - Anfänger-Themen 12
L Frage zur Verschlüsselung in java Java Basics - Anfänger-Themen 3
L Java und PGP Verschlüsselung, wie...??? Java Basics - Anfänger-Themen 2
U Cäsar Verschlüsselung Java Basics - Anfänger-Themen 8
Camoflasche RSA Verschlüsselung Java Basics - Anfänger-Themen 0
J RSA Verschlüsselung Testen / byte[] in Objekt umwandeln Java Basics - Anfänger-Themen 1
M Verschlüsselung mit replace() Java Basics - Anfänger-Themen 35
P Cäsear verschlüsselung irgendwas passt noch nicht Java Basics - Anfänger-Themen 2
A Methoden Cäsar-Verschlüsselung Java Basics - Anfänger-Themen 13
N Erste Schritte JFrame Caesar-Verschlüsselung Java Basics - Anfänger-Themen 23
Y Caesar Verschlüsselung Fehler Java Basics - Anfänger-Themen 4
Ä Cäsar-Verschlüsselung Java Basics - Anfänger-Themen 5
N Caesar Verschlüsselung Java Basics - Anfänger-Themen 2
L Interpreter-Fehler RSA Verschlüsselung Fehler Java Basics - Anfänger-Themen 2
M Erste Schritte Verschlüsselung von text Java Basics - Anfänger-Themen 21
M Erste Schritte Verschlüsselung / Login-Sicherheit Java Basics - Anfänger-Themen 8
D Eine einfache Verschlüsselung schreiben Java Basics - Anfänger-Themen 3
A Vigenere Verschlüsselung Java Basics - Anfänger-Themen 2
B RSA Verschlüsselung für Aktivierunscode Java Basics - Anfänger-Themen 7
T Array Verschlüsselung Java Basics - Anfänger-Themen 5
Z Cäsar-Verschlüsselung Java Basics - Anfänger-Themen 1
V Permutation, Verschlüsselung Java Basics - Anfänger-Themen 19
H Cäsar-Verschlüsselung Java Basics - Anfänger-Themen 1
S Caesar Verschlüsselung Start Hilfe Java Basics - Anfänger-Themen 4
K Symmetrische Verschlüsselung von TextArea Java Basics - Anfänger-Themen 7
U Problem mit Verschlüsselung Java Basics - Anfänger-Themen 2
C Frage zu RSA-Verschlüsselung Java Basics - Anfänger-Themen 3
Y Applet: Verschlüsselung Java Basics - Anfänger-Themen 3
H Caesar-Verschlüsselung - Was stimmt nicht? Java Basics - Anfänger-Themen 6
V Ceasar Verschlüsselung Java Basics - Anfänger-Themen 9
F Problem: Verschlüsselung von String in Array Fehler Java Basics - Anfänger-Themen 2
C Verschlüsselung Java Basics - Anfänger-Themen 8
R Frage zu Cäsar - Verschlüsselung! Java Basics - Anfänger-Themen 10
I Rc4 Verschlüsselung in BlueJ Java Basics - Anfänger-Themen 18
D Verschlüsselung Java Basics - Anfänger-Themen 4
C Compiler-Fehler Verschlüsselung Java Basics - Anfänger-Themen 2
B byte-weise Verschlüsselung Java Basics - Anfänger-Themen 6
S Caesar-Verschlüsselung Problem/Frage Java Basics - Anfänger-Themen 4
P RSA Verschlüsselung kleines Problem Java Basics - Anfänger-Themen 5
R Verschlüsselung von String Java Basics - Anfänger-Themen 4
J Cäsar Verschlüsselung Java Basics - Anfänger-Themen 12
G Verschlüsselung und Entschlüsselung von Texten Java Basics - Anfänger-Themen 7
O Verschlüsselung mit Cipher & Key Java Basics - Anfänger-Themen 9
A Vigenere Verschlüsselung Java Basics - Anfänger-Themen 2
K Cäsar-Verschlüsselung Java Basics - Anfänger-Themen 1
S Hill Verschlüsselung Java Basics - Anfänger-Themen 10
W Xor-Verschlüsselung Java Basics - Anfänger-Themen 15
Y verschlüsselung Java Basics - Anfänger-Themen 10
T Frage zur Verschlüsselung (RSA) Java Basics - Anfänger-Themen 6
S Verschlüsselung Key Splitting Java Basics - Anfänger-Themen 2
B Again, Verschlüsselung Java Basics - Anfänger-Themen 3
M Caeser Verschlüsselung ganz einfach(nicht für mich) Java Basics - Anfänger-Themen 6
D Verschlüsselung Java Basics - Anfänger-Themen 4
A verschlüsselung Java Basics - Anfänger-Themen 7
G Vergleich bei MD5-Verschlüsselung Java Basics - Anfänger-Themen 3
zilti md5-Verschlüsselung? Java Basics - Anfänger-Themen 7
L Caesar-Verschlüsselung programmieren Java Basics - Anfänger-Themen 12
Lazybone Vigenere Verschlüsselung funktioniert nicht richtig Java Basics - Anfänger-Themen 8
S XOR-Verschlüsselung Java Basics - Anfänger-Themen 5
U "Einfache Verschlüsselung" Java Basics - Anfänger-Themen 17
K Verschlüsselung Java Basics - Anfänger-Themen 8
E Verschlüsselung mithilfe von Array Java Basics - Anfänger-Themen 2
S SHA? Hashcodes, Blowfish Verschlüsselung Java Basics - Anfänger-Themen 7
H .java Dateien in Eclipse einbinden und ausführen Java Basics - Anfänger-Themen 1
onlyxlia Schlüsselworte Was meint man mit "einen Typ" in Java erstellen? Java Basics - Anfänger-Themen 2
O Java Kara geschweifte Klammern Java Basics - Anfänger-Themen 2
richis-fragen Mausrad logitech kann links und rechts klick wie in java abragen. Java Basics - Anfänger-Themen 15
XWing Java Klssenproblem Java Basics - Anfänger-Themen 4
R Umgebungsvariable java -cp gibt immer Java-Hilfe... Java Basics - Anfänger-Themen 3
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
F TableModelListener: java.lang.ArrayIndexOutOfBoundsException: 132 Java Basics - Anfänger-Themen 3
G Java 8 - Support-Ende Java Basics - Anfänger-Themen 7
T Java Weihnachtsbaum + Rahmen Java Basics - Anfänger-Themen 1
N Will mit Java anfangen Java Basics - Anfänger-Themen 13
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
M Java Mail Programm Java Basics - Anfänger-Themen 4
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
J Java long- in int-Variable umwandeln Java Basics - Anfänger-Themen 6
JaZuDemNo Java im Studium Java Basics - Anfänger-Themen 7
E Java Programm zur anzeige, ob Winter- oder Sommerzeit herrscht Java Basics - Anfänger-Themen 62
I QR code in Java selber generieren Java Basics - Anfänger-Themen 5
V Java-Ausnahmebehandlung: Behandlung geprüfter Ausnahmen Java Basics - Anfänger-Themen 1
krgewb Java Streams Java Basics - Anfänger-Themen 10
A Überwältigt von der komplexen Java Welt Java Basics - Anfänger-Themen 29
O Mehrfachvererbung auf Spezifikations- und Implementierungsebene in Java. Interfaces Java Basics - Anfänger-Themen 19
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
R mit Java API arbeiten Java Basics - Anfänger-Themen 9
P JDK installieren Probleme bei der Java-Installation Java Basics - Anfänger-Themen 8
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
Timo12345 JNLP File mit Java öffnen Java Basics - Anfänger-Themen 2
S Video Editierung mit Java.._ Java Basics - Anfänger-Themen 2
F Einstelungen in Java - CursorBlinkRate Java Basics - Anfänger-Themen 10
A PHP $_POST["name"] in Java Java Basics - Anfänger-Themen 3
vivansai21 Is there a oneliner to create a SortedSet filled with one or multiple elements in Java? Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben