Простая демонстрация шифрования и дешифрования AES — познакомьте вас с AES

1. Введение в AES

        Полное название AES — Advanced Encryption Standard, что означает Advanced Encryption Standard. Его появление в основном связано с заменой алгоритма шифрования DES, потому что все мы знаем, что длина ключа алгоритма DES составляет 56 бит, поэтому теоретическая надежность алгоритма равна 2 в 56-й степени. Однако середина и конец двадцатого века были этапом быстрого развития компьютеров. Прогресс технологии производства компонентов делал вычислительные возможности компьютеров все более и более сильными. Хотя появился метод шифрования 3DES, время его шифрования было в три раза больше, чем у обычного. Алгоритм DES.Многие, размер группы 64Bit относительно невелик, поэтому он все еще не может удовлетворить требования людей к безопасности. Поэтому 2 января 1997 г. Национальный институт стандартов и технологий объявил, что надеется получить усовершенствованные стандарты шифрования для замены DES. AES также получил ответы от многих криптографов со всего мира, и многие люди последовательно представили свои собственные алгоритмы. В итоге в финал вышли 5 алгоритмов-кандидатов: Rijndael, Serpent, Twofish, RC6 и MARS. Наконец, после тщательных шагов, таких как анализ безопасности и оценка производительности программного и аппаратного обеспечения, победил алгоритм Rijndael.

        В Призыве к стандартам криптографии все заявки-кандидаты AES должны соответствовать следующим критериям:

  • Блочный шифр с размером блока 128 бит.
  • Должны поддерживаться три криптографических стандарта: 128-битный, 192-битный и 256-битный.
  • Безопаснее, чем другие представленные алгоритмы.
  • Эффективен как в программной, так и в аппаратной реализации.

        Шифр AES в основном такой же, как блочный шифр Rijndael, а размер блока Rijndael и размер ключа могут быть 128 бит, 192 бит и 256 бит. Однако для AES требуется только размер пакета 128 бит, поэтому только Rijndael с длиной пакета 128 бит называется алгоритмом AES. В этой статье анализируется только алгоритм Rijndael с размером пакета 128 бит и длиной ключа 128 бит. Метод обработки ключа длиной 192 бита и 256 бит аналогичен 128-битному, за исключением того, что каждый раз, когда длина ключа увеличивается на 64 бита, количество циклов алгоритма будет увеличиваться на 2 раунда, 128-битный цикл 10 раундов, 192-битный цикл 12 раундов, 256-битный цикл 14 раундов.

2. Специальные математические знания AES

        Немного... Заинтересованные студенты могут проверить информацию самостоятельно

3. Важные компоненты шифрования и дешифрования AES

1. ключ

        Ключ является основой алгоритма AES для шифрования и дешифрования. Алгоритмы симметричного шифрования симметричны, потому что они требуют одного и того же ключа для шифрования и дешифрования открытого текста. AES поддерживает три длины ключа: 128-битную, 192-битную и 256-битную. AES128, AES192 и AES256, на которые все обычно ссылаются, на самом деле относятся к использованию алгоритма AES для ключей разной длины.

2. Заполнение

        Чтобы понять концепцию заполнения, мы должны сначала понять характеристики блочного шифрования AES. Что такое блочное шифрование? Давайте взглянем на картинку ниже: Когда алгоритм AES шифрует открытый текст, он не шифрует весь открытый текст в целый фрагмент зашифрованного текста, а разбивает открытый текст на независимые блоки открытого текста.Длина каждого блока открытого текста составляет 128 бит. Эти блоки открытого текста обрабатываются шифровальщиком AES для создания независимых блоков зашифрованного текста, и эти блоки зашифрованного текста соединяются вместе для формирования окончательного результата шифрования AES. Если длина фрагмента открытого текста составляет 192 бита, если он разделен на один блок открытого текста на каждые 128 бит, второй блок открытого текста будет только 64-битным, что меньше 128-битного. Что нам делать в это время? Необходимо дополнить блок открытого текста (Padding).

        Заполнение включает следующие три режима заполнения:

Нет заполнения:

        Заполнение не выполняется, но открытый текст должен быть целым числом, кратным 16 байтам.

PKCS5Padding (по умолчанию):

        Если блок открытого текста меньше 16 байт (128 бит), соответствующее количество символов добавляется в конец блока открытого текста, а значение каждого байта равно количеству пропущенных символов. Например, открытый текст: {1,2,3,4,5,a,b,c,d,e}, если не хватает 6 байт, он будет завершен как {1,2,3,4,5,a ,б,в,г,д,6,6,6,6,6,6}

ISO10126Заполнение:

        Если блок открытого текста меньше 16 байт (128 бит), соответствующее количество байтов добавляется в конец блока открытого текста, значение последнего символа равно количеству пропущенных символов, а остальные символы заполняются случайными числами. Например, открытый текст: {1,2,3,4,5,a,b,c,d,e}, если не хватает 6 байт, он может быть дополнен как {1,2,3,4,5,a ,б,в,г,д,5,в,3,G,$,6}

4. Демонстрация Java-кода

API-код интерфейса выглядит следующим образом:

уровень контроллера:

 

сервисный интерфейс: 

импл класс реализации: 

Инструменты:

package com.example.demo.utils;

import org.springframework.stereotype.Component;
import sun.misc.BASE64Encoder;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;


@Component
public class AESUtil {
    private static final String IV = "3412566146136412";
    private static final String ENCODING = "UTF-8";
    private static final String SECRET_KEY = "1234234234234112";

    /**
    * AES Decrypt Method
    *
     * @param ciphertext the text need to decrypt
     * @return cleartext
    * */
    public static String decrypt(String ciphertext) {
        byte[] buffer;
        byte[] bytes = Base64.getDecoder().decode(ciphertext);
        IvParameterSpec ivParameterSpec = new IvParameterSpec(IV.getBytes(StandardCharsets.UTF_8));
        SecretKeySpec secretKeySpec = new SecretKeySpec(AESUtil.SECRET_KEY.getBytes(StandardCharsets.UTF_8), "AES");
        Cipher cipher;
        try {
            cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE,secretKeySpec,ivParameterSpec);
            buffer = cipher.doFinal(bytes);
            return new String(buffer,ENCODING);
        } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidAlgorithmParameterException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException | UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * AES Encrypt Method
     *
     * @param cleartext the text need to decrypt
     * @return ciphertext
     * */
    public static String encrypt(String cleartext){
        try{
            byte[] raw = AESUtil.SECRET_KEY.getBytes(StandardCharsets.UTF_8);
            SecretKeySpec keySpec = new SecretKeySpec(raw, "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            IvParameterSpec ivParameterSpec = new IvParameterSpec(AESUtil.IV.getBytes(StandardCharsets.UTF_8));
            cipher.init(Cipher.ENCRYPT_MODE,keySpec,ivParameterSpec);
            byte[] bytes = cipher.doFinal(cleartext.getBytes(StandardCharsets.UTF_8));
            return new BASE64Encoder().encode(bytes);
        } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidAlgorithmParameterException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) {
            e.printStackTrace();
        }
        return null;
    }
}

 Тестовый класс:

Результат выглядит следующим образом: 

Запускаем сервис, используем postman для проверки 

Предварительный вводный текст взят из Zhihu: Basics of Cryptography: AES Encryption Algorithm-Knowledge.

Что такое шифрование AES? Подробное объяснение принципа алгоритма шифрования AES-Knowledge 

Оригинальный код не так просто набрать, спасибо за внимание

Supongo que te gusta

Origin blog.csdn.net/Lee_92/article/details/131087876
Recomendado
Clasificación