Рубрики
Без рубрики

Пример криптографии с симметричным ключом на Java

– Java – Пример криптографии с симметричным ключом

Криптография с симметричным ключом – это система шифрования, в которой один и тот же ключ используется для кодирования и декодирования данных. Безопасное распространение ключа является одним из недостатков этого метода, но то, чего ему не хватает в плане безопасности, он приобретает во времени сложность.

Всегда следует исходить из того, что алгоритмы шифрования общеизвестны и не полагаются на “Безопасность через неизвестность”. Наиболее популярными симметричными алгоритмами являются DES, Triple-DES, AES, Blowfish, RC2, RC4(ARCFOUR), RC5, RC6.

1. Пример использования криптографии с симметричным ключом

Ниже вы можете увидеть код приложения, которое использует криптографию с симметричным ключом для шифрования или расшифровки предварительно установленного каталога. Конструктор инициализируется паролем, длиной ключа и алгоритмом, который будет использоваться для шифрования. Чтобы узнать больше о длинах ключей для каждого алгоритма, обратитесь к Ограничения на импорт криптографических алгоритмов .

В этом примере мы используем AES, поскольку это считается золотым знаком между скоростью и безопасностью.

package com.mkyong.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());
		}
	}
}

Выход

При нажатии кнопки “Зашифровать все”.

Encrypting file: Hello world.docx
Encrypting file: Hello world.pdf
Encrypting file: Smiley.png
Encrypting file: Text.txt
Files encrypted successfully

При нажатии кнопки “Расшифровать все”.

Decrypting file: Hello world.docx
Decrypting file: Hello world.pdf
Decrypting file: Smiley.png
Decrypting file: Text.txt
Files decrypted successfully

Исходный текстовый файл.

This is a text file.

Текстовый файл зашифрован.

‡(?ê?z@ou7ÿ—pø"é³.Õ0Ò;jVi¶'

Имейте в виду: Перед запуском этого кода создается отдельный каталог с файлами только для целей этого примера. Загрузите исходный код ниже, если вы точно не знаете, что делаете.

2. Каталог проектов

Скачать Исходный Код

Рекомендации

  1. Безопасность через неизвестность
  2. Анализ производительности алгоритмов шифрования данных: 2.5 Сравниваемые алгоритмы
  3. Ограничения на импорт криптографических алгоритмов
  4. Алгоритмы Шифрования

Оригинал: “https://mkyong.com/java/java-symmetric-key-cryptography-example/”