Java - Beispiel für eine Kryptografie mit symmetrischen Schlüsseln
Symmetric-Key Cryptography ist ein Verschlüsselungssystem, bei dem derselbe Schlüssel für die Codierung und Decodierung der Daten verwendet wird. Die sichere Verteilung des Schlüssels ist einer der Nachteile dieser Methode, aber was ihm an Sicherheit fehlt, gewinnt an Zeitkomplexität.
Man sollte immer davon ausgehen, dass die Verschlüsselungsalgorithmen öffentlich bekannt sind und nicht auf „Sicherheit durch Dunkelheit“ beruhen. Die beliebtesten symmetrischen Algorithmen sind DES, Triple-DES, AES, Blowfish, RC2, RC4 (ARCFOUR), RC5, RC6.
1. Anwendungsfall der Kryptographie mit symmetrischen Schlüsseln
Unten sehen Sie den Code einer Anwendung, die Symmetric-Key Cryptography zum Ver- oder Entschlüsseln eines voreingestellten Verzeichnisses verwendet. Der Konstruktor wird mit dem Kennwort, der Länge des Schlüssels und dem Algorithmus initialisiert, der für die Verschlüsselung verwendet wird. Weitere Informationen zu den Schlüssellängen für jeden Algorithmus finden Sie unterImport Limits on Cryptographic Algorithms.
Note
Wenn Sie mehr über Verschlüsselungsalgorithmen erfahren möchten, lesen SiePerformance
Analysis of Data Encryption Algorithms: 2.5 Compared Algorithms
In diesem Beispiel verwenden wir AES, da es als der Silberstreifen zwischen Geschwindigkeit und Sicherheit angesehen wird.
SymmetricKeyExample.java
package com.techfou.symmetric; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.Arrays; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.crypto.spec.SecretKeySpec; import javax.swing.JOptionPane; public class SymmetricKeyExample { private SecretKeySpec secretKey; private Cipher cipher; public SymmetricKeyExample(String secret, int length, String algorithm) throws UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchPaddingException { byte[] key = new byte[length]; key = fixSecret(secret, length); this.secretKey = new SecretKeySpec(key, algorithm); this.cipher = Cipher.getInstance(algorithm); } private byte[] fixSecret(String s, int length) throws UnsupportedEncodingException { if (s.length() < length) { int missingLength = length - s.length(); for (int i = 0; i < missingLength; i++) { s += " "; } } return s.substring(0, length).getBytes("UTF-8"); } public void encryptFile(File f) throws InvalidKeyException, IOException, IllegalBlockSizeException, BadPaddingException { System.out.println("Encrypting file: " + f.getName()); this.cipher.init(Cipher.ENCRYPT_MODE, this.secretKey); this.writeToFile(f); } public void decryptFile(File f) throws InvalidKeyException, IOException, IllegalBlockSizeException, BadPaddingException { System.out.println("Decrypting file: " + f.getName()); this.cipher.init(Cipher.DECRYPT_MODE, this.secretKey); this.writeToFile(f); } public void writeToFile(File f) throws IOException, IllegalBlockSizeException, BadPaddingException { FileInputStream in = new FileInputStream(f); byte[] input = new byte[(int) f.length()]; in.read(input); FileOutputStream out = new FileOutputStream(f); byte[] output = this.cipher.doFinal(input); out.write(output); out.flush(); out.close(); in.close(); } public static void main(String[] args) { File dir = new File("src/cryptodir"); File[] filelist = dir.listFiles(); SymmetricKeyExample ske; try { ske = new SymmetricKeyExample("!@#$MySecr3tPassw0rd", 16, "AES"); int choice = -2; while (choice != -1) { String[] options = { "Encrypt All", "Decrypt All", "Exit" }; choice = JOptionPane.showOptionDialog(null, "Select an option", "Options", 0, JOptionPane.QUESTION_MESSAGE, null, options, options[0]); switch (choice) { case 0: Arrays.asList(filelist).forEach(file -> { try { ske.encryptFile(file); } catch (InvalidKeyException | IllegalBlockSizeException | BadPaddingException | IOException e) { System.err.println("Couldn't encrypt " + file.getName() + ": " + e.getMessage()); } }); System.out.println("Files encrypted successfully"); break; case 1: Arrays.asList(filelist).forEach(file -> { try { ske.decryptFile(file); } catch (InvalidKeyException | IllegalBlockSizeException | BadPaddingException | IOException e) { System.err.println("Couldn't decrypt " + file.getName() + ": " + e.getMessage()); } }); System.out.println("Files decrypted successfully"); break; default: choice = -1; break; } } } catch (UnsupportedEncodingException ex) { System.err.println("Couldn't create key: " + ex.getMessage()); } catch (NoSuchAlgorithmException | NoSuchPaddingException e) { System.err.println(e.getMessage()); } } }
Ausgabe
Wenn Sie auf die Schaltfläche "Alle verschlüsseln" klicken.
Encrypting file: Hello world.docx Encrypting file: Hello world.pdf Encrypting file: Smiley.png Encrypting file: Text.txt Files encrypted successfully
Wenn Sie auf die Schaltfläche "Alle entschlüsseln" klicken.
Decrypting file: Hello world.docx Decrypting file: Hello world.pdf Decrypting file: Smiley.png Decrypting file: Text.txt Files decrypted successfully
Originaltextdatei.
src/Text.txt
This is a text file.
Textdatei ist verschlüsselt.
src/Text.txt
‡(?ê?z@ou7ÿ—pø"é³.Õ0Ò;jVi¶‚
Beachten Sie: Bevor Sie diesen Code ausführen, wird nur für die Zwecke dieses Beispiels ein separates Verzeichnis mit Dateien erstellt. Laden Sie den folgenden Quellcode herunter, wenn Sie nicht genau wissen, was Sie tun.
2. Projektverzeichnis
Quellcode herunterladen
Laden Sie es herunter -SymmetricCryptographyExample.zip (133 KB)