Статьи

Шифрование и дешифрование AES в Java (режим CBC)

Передача конфиденциальных данных, таких как простой текстовый пароль, по проводам всегда уязвима для безопасности. Всегда рекомендуется шифровать такую ​​информацию и использовать SSL для передачи этих конфиденциальных данных. Для этого в Java предусмотрен несколько алгоритмов шифрования. В этом посте мы обсудим Алгоритм симметричного шифрования AES (Advanced Encryption Standard) в Java с режимом CBC, который работает быстрее и безопаснее, чем 3DES.

Тип шифрования

Как известно, существует 2 основных типа шифрования — асимметричное и симметричное шифрование. Асимметричное шифрование использует два разных ключа в качестве открытого и закрытого ключей. Здесь вы можете зашифровать конфиденциальную информацию с помощью открытого ключа, и для его расшифровки используется соответствующий закрытый ключ. Асимметричное шифрование обычно используется, когда задействованы 2 разные конечные точки, такие как VPN-клиент и сервер, SSH и т. Д.

Точно так же у нас есть другой метод шифрования, называемый симметричным шифрованием. Этот тип шифрования использует один ключ, известный как закрытый ключ или секретный ключ, для шифрования и дешифрования конфиденциальной информации. Этот тип шифрования очень быстр по сравнению с асимметричным шифрованием и используется в системы, такие как система баз данных. Некоторыми примерами симметричного шифрования являются Twofish, Blowfish, 3 DES, AES.

Что такое шифрование AES

AES расшифровывается как Advanced Encryption System и ее симметричный алгоритм шифрования. Это спецификация для шифрования электронных данных, созданная Национальным институтом стандартов и технологий США (NIST) в 2001 году. Вот ссылка на вики для AES. Движок AES требует простого текста и секретного ключа для шифрования, и тот же секретный ключ требуется для его повторной расшифровки.

Чтобы увидеть, как AES-шифрование работает на практике, вы можете проверить это — AES Encryption Tool

Входные данные могут быть 128-битными или 192-битными или 256-битными, и генерируется соответствующий бит шифрованного текста.

Шифрование AES на Java

Ниже приведен пример программы в Java, которая выполняет шифрование AES. Здесь мы используем AES с режимом CBC для шифрования сообщения, поскольку режим ECB не является семантически безопасным. Режим IV также должен быть рандомизирован для режима CBC.

Если один и тот же ключ используется для шифрования всего простого текста, и если злоумышленник находит этот ключ, то весь шифр может быть расшифрован аналогичным образом. Мы можем использовать соли и итерации для дальнейшего улучшения процесса шифрования. В следующем примере мы используя 128-битный ключ шифрования. Вот онлайн-инструмент для шифрования aes .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
private static final String key = "aesEncryptionKey";
private static final String initVector = "encryptionIntVec";
 
public static String encrypt(String value) {
    try {
        IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
        SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
 
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
 
        byte[] encrypted = cipher.doFinal(value.getBytes());
        return Base64.encodeBase64String(encrypted);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return null;
}
01
02
03
04
05
06
07
08
09
10
11
12
Other Interesting Posts
Spring Boot Security Password Encoding using Bcrypt Encoder
Spring Boot Security JWT Auth Example
Spring Boot Security OAuth2 Example
Spring Boot Security REST Basic Authentication
Spring Boot Actuator Complete Guide
Spring Boot Actuator  Rest Endpoints Example
Spring 5 Features and Enhancements
Spring Boot Thymeleaf Example
Spring Boot Security Hibernate Example with complete JavaConfig
Securing REST API with Spring Boot Security Basic Authentication
Websocket spring Boot Integration Without STOMP with complete JavaConfig

Расшифровка AES на Java

Ниже приведен обратный процесс расшифровки шифра. Код не требует пояснений.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
public static String decrypt(String encrypted) {
    try {
        IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
        SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
 
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
        cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
        byte[] original = cipher.doFinal(Base64.decodeBase64(encrypted));
 
        return new String(original);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
 
    return null;
}

Тестирование AES-шифрования и дешифрования

Ниже приведена реализация main () для тестирования нашей реализации AES.

1
2
3
4
5
6
7
8
public static void main(String[] args) {
    String originalString = "password";
    System.out.println("Original String to encrypt - " + originalString);
    String encryptedString = encrypt(originalString);
    System.out.println("Encrypted String - " + encryptedString);
    String decryptedString = decrypt(encryptedString);
    System.out.println("After decryption - " + decryptedString);
}

Ниже приводится результат.

Вывод

Я надеюсь, что эта статья послужила вам, что вы искали. Если у вас есть что-то, что вы хотите добавить или поделиться, пожалуйста, поделитесь этим ниже в разделе комментариев. В следующем посте мы будем обсуждать совместимость AES между javascript и java.

Смотрите оригинальную статью здесь: Шифрование и дешифрование AES в Java (режим CBC)

Мнения, высказанные участниками Java Code Geeks, являются их собственными.