== Grundlagen ==
Ich möchte eine Datei verschlüsseln dessen Inhalt mit AES geschützt ist und die Datei mit RSA. Wie man zu dem Key kommt, steht im vorherigem Eintrag. Allerdings ist dort nur die Generierung des Schlüsselpaars angegeben, nicht aber einen Code für einen solchen Key. Normalerweise wird AES für eine Verschlüsselung benutzt und dieser Key wird an eine Datei angehängt, welche verschlüsselt werden soll. Um nun den Key zurück zu bekommen, muss man die Schlüsselgröße erkennen können, dazu schreibt man einfach die Schlüssellänge vor den Inhalt der Datei. Das kann man z. B. mit „integer – object“ machen.
== Verschlüsselung ==
Alles anzeigen
Dieser Code zeigt, wie man eine Datei verschlüsseln kann. Dazu trägt man den schon generierten „public – key“, eine Datei die man verschlüsseln will und den Namen der Datei (als Parameter), die entstehen soll ein. Im „Chiffre – Object“ gibt es alle notwendigen Modifikationen die man zum Verschlüsseln und Verpacken benötigt.
== Entschlüsselung ==
Alles anzeigen
Im nächsten Schritt, schreiben wir eine Funktion für eine Entschlüsselung. Hier wird nun der „private – key“ benötigt. Es muss definiert werden, dass die erstellte Funktion eine verschlüsselte Datei nimmt und diese in einem beliebigen Verzeichnis abspeichert. Auch der verpackte Key, wird wieder extrahiert.
== Der Key File Transformer ==
Als nächstes, möchte ich irgendwie dazu kommen, dass ich nicht immer wieder die Key – Dateien benutzen muss. Hier kann man sich mit einem „Key – File – Transformer“ behelfen. Es wird ein Bytecode ausgegeben, welcher in einem Paket, sowie in einer Klasse eingebettet werden kann. Jetzt stellt sich aber doch die Frage, warum mache ich das Ganze? Nun, der Grund ist, dass ich nie der alleinige Benutzer eines Verzeichnisses in einem Netzwerk bin. Auch andere Person haben Zugriff auf den Server. Die private Schlüsseldatei, darf nicht veröffentlicht werden, da sonst meine Dateien (Cache) entschlüsselt werden könnten. Schlimm wäre es auch, wenn der von mir gelöschte „private – key“ wiederhergestellt werden kann.
Alles anzeigen
== Bit Array ==
Meine Schlüsseldatei, kann ich nun in einem nicht lesbaren Code einbetten, damit gewährleistet ist, dass er während der Ver – und Entschlüsselung verwendet werden kann. Nun haben wir eine Funktion, mit der ein „private-“ oder „public – key“ in eine so genannte Bitmap oder Bit – Array umgewandelt werden kann. Der verschlüsselte Hash – Code aus der Schlüsseldatei muss in Hex umgewandelt werden.
Um das eingebettete Bit – Array benutzen zu können, muss die Ver – und Entschlüsselungs Funktion geändert werden. Zuerst muss man die Eingabeparameter anpassen.
Jetzt muss die Entschlüsselungs Funktion angepasst werden.
Man kann die Funktion so anpassen, wie man sie haben will, z. B. kann man die Zeichenfolge in der Befehlszeile verschlüsseln.
== PKCS8 und X.509 ==
Als nächstes verteilen wir an unseren Arbeitsplatz einen Key, dazu muss man wissen, wie „private – key“ bzw. „public – key“ verschlüsselt werden.
Liste private Schlüssel → de.wikipedia.org/wiki/PKCS
Der öffentlicher Schlüssel X.509 → de.wikipedia.org/wiki/X.509
== Interpretation des Bit Array ==
Wir brauchen nun einen Code der das Bit – Array interpretieren kann. Den privaten Schlüssel, lesen wir über ein „Object – Stream“, so kann sofort ein zentrales Objekt im Code erklärt werden.
Java bietet uns drei Pakete, welche wir benötigen, um einen Key aus dem (Hash) – Byte – Array zu erstellen.
Benötigte Pakte: → PrivateKey download.oracle.com/docs/cd/B3…kms/xkrss/PrivateKey.html
→ KeyFactory download.oracle.com/javase/1.4…/security/KeyFactory.html
→ PKCS8EncodedKeySpec download.oracle.com/javase/1.4…/PKCS8EncodedKeySpec.html
== Erstellung von PKCS8EncodedKeySpec – Objekt ==
Jetzt erstellen wir PKCS8EncodedKeySpec – Objekt, welches ein Array als Parameter bekommt, um eine RSA Instanz zu definieren, muss ein KeyFactory – Objekt erstellt werden. Zum Schluss kann man nun beide erstellten Objekte benutzen, um einen „private – key“ zu generieren.
Das gleiche gilt auch für den „public – key“.
== Quellen: ==
de.wikipedia.org/wiki/RSA-Kryptosystem
de.wikipedia.org/wiki/Advanced_Encryption_Standard
de.wikipedia.org/wiki/Elliptic_Curve_Cryptography
http://de.wikipedia.org/wiki/Diffie-Hellman-Schlüsselaustausch
codeplanet.eu/
codeplanet.eu/tutorials/cpp/3-…-encryption-standard.html
forums.oracle.com/forums/main.…haMaxuObN10?categoryID=84
Ich möchte eine Datei verschlüsseln dessen Inhalt mit AES geschützt ist und die Datei mit RSA. Wie man zu dem Key kommt, steht im vorherigem Eintrag. Allerdings ist dort nur die Generierung des Schlüsselpaars angegeben, nicht aber einen Code für einen solchen Key. Normalerweise wird AES für eine Verschlüsselung benutzt und dieser Key wird an eine Datei angehängt, welche verschlüsselt werden soll. Um nun den Key zurück zu bekommen, muss man die Schlüsselgröße erkennen können, dazu schreibt man einfach die Schlüssellänge vor den Inhalt der Datei. Das kann man z. B. mit „integer – object“ machen.
== Verschlüsselung ==
Quellcode
- public void enceyptToOutputFile(String publicKeyFile, String inputFile, String outputFile) throws FileNotFoundException, I0Exception, ClassNotFoundException, GeneralSecurityException {
- KeyGenerator keygen = KeyGenerator.getInstance("AES");
- SecureRandom random = new SecureRandom();
- keygen.init(random);
- SecretKey key = keygen.generateKey();
- ObjectInputStream keyIn = new ObjectInputStream(new FileInputStream(publicKeyFile));
- Key publicKey = (Key) keyIn.readObject();
- keyIn.close();
- Cipher cipher = Cipher.getInstance("RSA");
- cipher.init(Cipher.WRAP_MODE, publicKey);
- byte[] wrappedKey = cipher.wrap(key);
- DataOutputStream out = new DataOutputStream(new FileOutputStream(outputFile));
- out.writeInt(wrappedKey.lenth);
- out.write(wrappedKey);
- InputStream in = new FileInputStream(inputFile);
- cipher = Cipher.getInstance("AES");
- cipher.init(Cipher.ENCRYPT_MODE, key);
- in.close();
- out.close();
- }
Dieser Code zeigt, wie man eine Datei verschlüsseln kann. Dazu trägt man den schon generierten „public – key“, eine Datei die man verschlüsseln will und den Namen der Datei (als Parameter), die entstehen soll ein. Im „Chiffre – Object“ gibt es alle notwendigen Modifikationen die man zum Verschlüsseln und Verpacken benötigt.
== Entschlüsselung ==
Quellcode
- public void decryptFromOuntputFile(String privatecKeyFile, String inputFile, String outputFile) throws I0Exception, ClassNotFoundException, GeneralSecurityException {
- DateInputStream in = new DataInputStream(new FileInputStream(inputFile));
- int length = in.readInt();
- byte[] wrappedKey = new byte[length];
- in.read(wrappedKey, 0, length);
- ObjectInputStream keyIn = new ObjectInputStream(new FileInputStream(privatecKeyFile));
- Key privateKey = (Key) keyIn.readObject();
- keyIn.close();
- Cipher cipher = Cipher.getInstance("RSA");
- cipher.init(Cipher.UNWRAP_MODE, privateKey);
- Key key = cipher.unwrap(wrappedKey, "AES", Cipher.SECRET_KEY);
- OutputStream out = new FileOutputStream(outputFile);
- cipher = Cipher.getInstance("AES");
- cipher.init(Cipher.DECRYPT_MODE, key);
- crypt(in, out, cipher);
- in.close();
- out.close();
- }
Im nächsten Schritt, schreiben wir eine Funktion für eine Entschlüsselung. Hier wird nun der „private – key“ benötigt. Es muss definiert werden, dass die erstellte Funktion eine verschlüsselte Datei nimmt und diese in einem beliebigen Verzeichnis abspeichert. Auch der verpackte Key, wird wieder extrahiert.
== Der Key File Transformer ==
Als nächstes, möchte ich irgendwie dazu kommen, dass ich nicht immer wieder die Key – Dateien benutzen muss. Hier kann man sich mit einem „Key – File – Transformer“ behelfen. Es wird ein Bytecode ausgegeben, welcher in einem Paket, sowie in einer Klasse eingebettet werden kann. Jetzt stellt sich aber doch die Frage, warum mache ich das Ganze? Nun, der Grund ist, dass ich nie der alleinige Benutzer eines Verzeichnisses in einem Netzwerk bin. Auch andere Person haben Zugriff auf den Server. Die private Schlüsseldatei, darf nicht veröffentlicht werden, da sonst meine Dateien (Cache) entschlüsselt werden könnten. Schlimm wäre es auch, wenn der von mir gelöschte „private – key“ wiederhergestellt werden kann.
Quellcode
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.I0Exception;
- import java.io.ObjectInputStream;
- import java.security.GeneralSecurtityException;
- import java.security.Key;
- public class KeyToByteArray {
- public static void mein(String[] args) throws FileNotFoundException, I0Exception, ClassNotFoundException, GeneralSecurityException {
- ObjectInputStream keyIn = new ObjectInputStream(new FileInputStream("RSA_private.key"));
- Key privateKey = (Key) keyIn.readObject();
- keyIn,close();
- byte[] k = privateKey.getEncoded();
- System.out.printIn(privateKey.getFormat());
- System.out.printIn(k.length);
- for(int i = 0; i < k.length; i++) {
- System.out.print(k[i]);
- }
- System.out.printIn();
- System.out.printIn("Create byte[] of length : " + k.length);
- System.out.printIn("Convert byte[] to String : " + bytesToHex(k));
- System.out.printIn("---------------------------------");
- System.out.printIn();
- System.out.print("byte[] encPKe = { ");
- int j = 0;
- for (int i = 0 < k.length; i++) {
- if(i == k.length-1)
- System.out.print("(byte)0x" + byteToHex(k[i]) + " ");
- else
- System.out.print("(byte)0x" + byteToHex(k[i]) + ", ");
- }
- }
- System.out.printIn("};");
- System.out.printIn();
- }
- public static String bytesToHex(byte[] data) {
- StringBuffer buf = new StringBuffer();
- for (int i = 0; i < data.length; i++) {
- buf.append(byteToHex(data[i]).toUpperCase());
- }
- return (buf.toString());
- }
- public static String byteToHex(byte data) {
- StringBuffer buf = new StringBuffer();
- buf.append(toHexChar((data >>> 4) & 0x0F));
- buf.append(toHexChar(data & 0x0F));
- return buf.toString();
- }
- public static char toHexChar(int i) {
- if ((0 <= i) && (i <= 9)) {
- return (char) ('0' + i)
- } else {
- return (char) ('a' + (i - 10));
- }
- }
- }
== Bit Array ==
Meine Schlüsseldatei, kann ich nun in einem nicht lesbaren Code einbetten, damit gewährleistet ist, dass er während der Ver – und Entschlüsselung verwendet werden kann. Nun haben wir eine Funktion, mit der ein „private-“ oder „public – key“ in eine so genannte Bitmap oder Bit – Array umgewandelt werden kann. Der verschlüsselte Hash – Code aus der Schlüsseldatei muss in Hex umgewandelt werden.
Um das eingebettete Bit – Array benutzen zu können, muss die Ver – und Entschlüsselungs Funktion geändert werden. Zuerst muss man die Eingabeparameter anpassen.
Jetzt muss die Entschlüsselungs Funktion angepasst werden.
Man kann die Funktion so anpassen, wie man sie haben will, z. B. kann man die Zeichenfolge in der Befehlszeile verschlüsseln.
== PKCS8 und X.509 ==
Als nächstes verteilen wir an unseren Arbeitsplatz einen Key, dazu muss man wissen, wie „private – key“ bzw. „public – key“ verschlüsselt werden.
Liste private Schlüssel → de.wikipedia.org/wiki/PKCS
Der öffentlicher Schlüssel X.509 → de.wikipedia.org/wiki/X.509
== Interpretation des Bit Array ==
Wir brauchen nun einen Code der das Bit – Array interpretieren kann. Den privaten Schlüssel, lesen wir über ein „Object – Stream“, so kann sofort ein zentrales Objekt im Code erklärt werden.
Java bietet uns drei Pakete, welche wir benötigen, um einen Key aus dem (Hash) – Byte – Array zu erstellen.
Benötigte Pakte: → PrivateKey download.oracle.com/docs/cd/B3…kms/xkrss/PrivateKey.html
→ KeyFactory download.oracle.com/javase/1.4…/security/KeyFactory.html
→ PKCS8EncodedKeySpec download.oracle.com/javase/1.4…/PKCS8EncodedKeySpec.html
== Erstellung von PKCS8EncodedKeySpec – Objekt ==
Jetzt erstellen wir PKCS8EncodedKeySpec – Objekt, welches ein Array als Parameter bekommt, um eine RSA Instanz zu definieren, muss ein KeyFactory – Objekt erstellt werden. Zum Schluss kann man nun beide erstellten Objekte benutzen, um einen „private – key“ zu generieren.
Das gleiche gilt auch für den „public – key“.
== Quellen: ==
de.wikipedia.org/wiki/RSA-Kryptosystem
de.wikipedia.org/wiki/Advanced_Encryption_Standard
de.wikipedia.org/wiki/Elliptic_Curve_Cryptography
http://de.wikipedia.org/wiki/Diffie-Hellman-Schlüsselaustausch
codeplanet.eu/
codeplanet.eu/tutorials/cpp/3-…-encryption-standard.html
forums.oracle.com/forums/main.…haMaxuObN10?categoryID=84
15.555 mal gelesen