Java - Symmetric-Key Cryptography-Beispiel

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

java-symmetrickey-output-1

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

java-symmetrickey-example

Quellcode herunterladen