Verschlüsselung

Hallo,

ganz einfach:
Du liest Deserialisierst den PublicKey den du geschickt bekommen hast und
machst einfach das was in der encrypt Methode gezeigt wird:
Java:
        PublicKey publicKey = readPublicKey(publicKeyFile);
        Cipher cipher = Cipher.getInstance(algorithm);
        String data = "www.tutorials.de";
        byte[] encryptedData = encrypt(data, cipher, publicKey);
        System.out.println("Encrypted data: "
                + new String(encryptedData, "UTF-8"));
Dann hast du das verschlüsselte byte[] an der Hand, welches du nun zum Server senden kannst.
Auf dem Server musst du's dann wie gehabt mit deinem privaten Schlüssel (den du dir irgendwo (sicher) abgespeichert hast (der Beispielsweise in deinem lokalen KeyStore liegt)) wieder entschlüsseln.

Hier ein kleines Beispiel:
Java:
/**
 * 
 */
package de.tutorials;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;

import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;

/**
 * @author Tom
 * 
 */
public class PublicKeyExample {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {

        String algorithm = "RSA";
        KeyPair keyPair = KeyPairGenerator.getInstance(algorithm)
                .generateKeyPair();
        File publicKeyFile = new File("c:/public.key");
        writeKey(keyPair.getPublic(), publicKeyFile);
        PublicKey publicKey = readPublicKey(publicKeyFile);

        Cipher cipher = Cipher.getInstance(algorithm);
        
        String data = "www.tutorials.de";
        byte[] encryptedData = encrypt(data, cipher, publicKey);
        System.out.println("Encrypted data: "
                + new String(encryptedData, "UTF-8"));

        String decryptedData = decrypt(encryptedData, cipher, keyPair
                .getPrivate());
        System.out.println("Decrypted data: " + decryptedData);

    }

    private static String decrypt(byte[] encryptedData, Cipher cipher,
            PrivateKey privateKey) throws Exception {
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        CipherInputStream cis = new CipherInputStream(new ByteArrayInputStream(
                encryptedData), cipher);
        ByteArrayOutputStream baosDecryptedData = new ByteArrayOutputStream();
        byte[] buffer = new byte[8192];
        int len = 0;
        while ((len = cis.read(buffer)) > 0) {
            baosDecryptedData.write(buffer, 0, len);
        }
        baosDecryptedData.flush();
        cis.close();
        return new String(baosDecryptedData.toByteArray(), "UTF-8");
    }

    private static byte[] encrypt(String data, Cipher cipher,
            PublicKey publicKey) throws Exception {

        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        ByteArrayOutputStream baosEncryptedData = new ByteArrayOutputStream();
        CipherOutputStream cos = new CipherOutputStream(baosEncryptedData,
                cipher);
        cos.write(data.getBytes("UTF-8"));
        cos.flush();
        cos.close();
        return baosEncryptedData.toByteArray();
    }

    private static PublicKey readPublicKey(File file) throws Exception {
        ObjectInputStream objectInputStream = new ObjectInputStream(
                new FileInputStream(file));
        PublicKey publicKey = (PublicKey) objectInputStream.readObject();
        objectInputStream.close();
        return publicKey;
    }

    private static void writeKey(PublicKey publicKey, File file)
            throws Exception {
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(
                new FileOutputStream(file));
        objectOutputStream.writeObject(publicKey);
        objectOutputStream.close();
    }
}

Gruß Tom
 
Hi,
super dankeschön.
Jetzt hab ich nur noch eine Frage zur Sicherheit.
Wie lange kann ich ein Paar verwenden
Also bei jeder Nachricht eine neues(kann ich mir ja nicht vorstellen) oder für ein Jahr ein paar.
MfG bigboombang
 
Hallo,
ich habe dieses Beispiel auch verwendet. Allerdings habe ich jetzt ein Problem mit Windows Vista. Wenn ich ein Keypair erstelle und einen Text verschlüssele funktioniert die Entschlüsselung auf Windows XP normal. Auf Windows Vista allerdings nicht. Leider habe ich dazu keine Fehlermeldung da ich selber kein Vista habe. Aber ich habe diese Info von verschiedenen Vista Nutzern bekommen.
Kann sich jemand vorstellen, wo da das Problem liegt?

Grüße
Jean Luc
 
Hallo Thomas,

dein Beispiel finde ich sehr gut. Auf basis deines Beispieles habe ich mir ein kleines Tool gebastelt um Strings zu verschlüsseln. Ich habe dabei folgendes Problem. Es gibt bestimmte Strings wie z.B "CGO" die lassen sich zwar verschlüsseln, jedoch beim Entschlüsseln erscheint nur ein leerstring.

Ich habe auch schon andere Verschlüsselungsmethoden oder CharacterSets probiert. Das Problem ist das gleiche, nur dass die Strings die nicht verarbeitet werden können andere sind.

Jetzt stehe ich völlig auf dem Schlauch

Ich hoffe du kannst mir helfen.


Code:
public class PasswortCrypter {

	Cipher cipher;
	Key key;

	/**
	 * Standardkonstruktor
	 */
	public PasswortCrypter(){
		// Chipher und Key erzeugen
		try {
			setCipher(Cipher.getInstance("AES"));
			setKey(new SecretKeySpec( "3g06kg64öj923h46".getBytes(), "AES" ));

		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}


	public String encrypt(String data) {

		try {
			
			// Chipher auf Verschlüsselungsmodus setzen und Schlüssel festlegen
			getCipher().init(Cipher.ENCRYPT_MODE, getKey());

			
			ByteArrayOutputStream baosEncryptedData = new ByteArrayOutputStream();
			CipherOutputStream cos = new CipherOutputStream(baosEncryptedData,cipher);
			
			// Verschlüsseltes ByteArray schreiben
			cos.write(data.getBytes());
			cos.flush();
			cos.close();

			// String aus dem verschlüsselten Byte Array zurückliefern
			return new String(baosEncryptedData.toByteArray());

		} catch (InvalidKeyException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		} 

	}


	public String decrypt(String data) {

		try {
			
			// Chipher auf Entschlüsselungsmodus setzen und Schlüssel festlegen
			getCipher().init(Cipher.DECRYPT_MODE, getKey());

			CipherInputStream cis = new CipherInputStream(new ByteArrayInputStream(data.getBytes()), cipher);

			ByteArrayOutputStream baosDecryptedData = new ByteArrayOutputStream();

			

			int len = 0;

			while((len = cis.read())> 0){
				// Entschlüsseltes Byte Array schreiben
				baosDecryptedData.write(len);

			}

			baosDecryptedData.flush();

			cis.close();

			// String aus dem Entschlüsselten Byte Array zurückliefern
			return new String(baosDecryptedData.toByteArray());


		} catch (InvalidKeyException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		} 
	}



	// Getter und Setter Methoden
	private Cipher getCipher() {
		return cipher;
	}


	private void setCipher(Cipher cipher) {
		this.cipher = cipher;
	}


	private Key getKey() {
		return key;
	}


	private void setKey(Key key) {
		this.key = key;
	}


	/**
	 * Dies ist ein Programm womit der Anwender aus einem String ein Verschlüsseltes Passwort
	 * erstellen kann. (anhand von JOptionPane Input Dialogen)
	 * 
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {

		if(JOptionPane.showOptionDialog(null, "Möchten Sie ver- oder entschlüsseln?", "Crypt", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, new String[]{"Verschlüsseln","Entschlüsseln"}, null) == 0){
			// Benuter ein Passwort eingeben lassen
			String pw = JOptionPane.showInputDialog("Bitte geben Sie das zu verschlüsselnde Passwort ein");
			
			// Verschlüsseltes Passwort ausgeben
			JOptionPane.showInputDialog(null, "Dies ist das verschlüsselte Passwort", "", JOptionPane.INFORMATION_MESSAGE, null, null, new PasswortCrypter().encrypt(pw));
		}else{
			// Benuter ein Passwort eingeben lassen
			String pw = JOptionPane.showInputDialog("Bitte geben Sie das verschlüsselte Passwort ein");
			
			// Verschlüsseltes Passwort ausgeben
			JOptionPane.showInputDialog(null, "Dies ist das entschlüsselte Passwort", "", JOptionPane.INFORMATION_MESSAGE, null, null, new PasswortCrypter().decrypt(pw));
		}
	}
}
 
Servus,

ich muss mittelgroße xml-dateien verschlüsselt auf der Platte ablegen und zur Anzeige im Programm auch wieder entschlüsseln. Hab das beispiel von thomas darimont ausprobiert ausprobiert, scheint idiotensicher, läuft ohne Exceptions durch.

Mein Problem: Es kommt nichts raus, der ByteArrayOutputStream ist leer,
nichts drin, wird nicht gefüllt.

Mein Code zum Vergleich:

public byte[] encrypt(String Data){
try {
byte unverschlByte[]=Data.getBytes("UTF-8");
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
CipherOutputStream cos = new
CipherOutputStream(baos,cipher);
cos.write(unverschlByte);
cos.flush();
cos.close();
return baos.toByteArray();​
} catch (Exception e) {
System.out.println(e.getLocalizedMessage());
return null;​
}​
}


Kann es sein dass man nur sehr kurze Strings damit verschlüsseln kann?
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück