シンプルな AES 暗号化と復号化のデモ - AES を理解するためのガイド

1. AES の概要

        AES の正式名称は Advanced Encryption Standard で、「高度な暗号化標準」を意味します。その登場は主に DES 暗号化アルゴリズムを置き換えることです。DES アルゴリズムのキーの長さは 56 ビットであるため、アルゴリズムの理論上のセキュリティ強度は 2 の 56 乗であることは誰もが知っているからです。しかし、20世紀半ばから後半にかけてコンピュータは急速に発展し、部品製造​​技術の進歩によりコンピュータの処理能力はますます強力になり、3DESという暗号化方式が登場しましたが、その暗号化時間は暗号化方式の3倍でした。 DES アルゴリズム 多くの場合、64 ビットのグループ サイズは比較的小さいため、依然としてセキュリティに対する人々の要件を満たすことができません。そこで 1997 年 1 月 2 日、国立標準技術研究所は、DES に代わる高度な暗号化標準を募集したいと発表しました。AES には世界中の多くの暗号学者からも回答が寄せられており、多くの人が独自のアルゴリズムを次々と提出しています。最終的に、Rijndael、Serpent、Twofish、RC6、MARS の 5 つのアルゴリズム候補が最終ラウンドに進出しました。最終的に、セキュリティ分析、ソフトウェアおよびハードウェアのパフォーマンス評価などの厳格な手順を経て、Rijndael アルゴリズムが勝利を収めました。

        暗号化標準の募集では、すべての AES 候補の提出物が次の基準を満たしている必要があります。

  • ブロックサイズが 128 ビットのブロック暗号。
  • 128 ビット、192 ビット、256 ビットの 3 つの暗号化標準をサポートする必要があります。
  • 提出された他のアルゴリズムよりも安全です。
  • ソフトウェアとハ​​ードウェアの両方の実装が効率的です。

        AES 暗号は基本的にブロック暗号 Rijndael と同じで、Rijndael のブロック サイズとキー サイズは 128 ビット、192 ビット、256 ビットです。ただし、AES は 128 ビットのパケット サイズのみを必要とするため、パケット長が 128 ビットの Rijndael のみが AES アルゴリズムと呼ばれます。この記事では、パケット サイズ 128 ビット、キー長 128 ビットの Rijndael アルゴリズムのみを分析します。192 ビットと 256 ビットの鍵長の処理方法は 128 ビットの場合と同様ですが、鍵の長さが 64 ビット増加するたびに、アルゴリズムのサイクル数が 2 ラウンド、128 ビット サイクル増加します。 10 ラウンド、192 ビット サイクル 12 ラウンド、256 ビット サイクル 14 ラウンド。

2. AES 特有の数学的知識

        ちょっと…興味のある学生は自分で情報を確認してみてください

3. AES 暗号化と復号化の重要なコンポーネント

1. キー

        キーは、暗号化と復号化のための AES アルゴリズムの基礎です。対称暗号化アルゴリズムは、平文の暗号化と復号化に同じキーを必要とするため、対称的です。AES は、128 ビット、192 ビット、256 ビットの 3 つのキー長をサポートします。通常、誰もが参照する AES128、AES192、および AES256 は、実際には、異なる長さのキーに対する AES アルゴリズムの使用を指します。

2.充填

        パディングの概念を理解するには、まず AES のブロック暗号化の特性を理解する必要があります。ブロック暗号化とは何ですか? 下の図を見てみましょう: AES アルゴリズムが平文を暗号化するとき、平文全体を暗号文全体に暗号化するのではなく、平文を独立した平文ブロックに分割します。各平文ブロックの長さは 128 ビットです。これらの平文ブロックは AES 暗号化装置によって処理されて独立した暗号文ブロックが生成され、これらの暗号文ブロックが結合されて最終的な AES 暗号化結果が形成されます。平文の長さが 192 ビットの場合、128 ビットごとに 1 つの平文ブロックに分割すると、2 番目の平文ブロックは 64 ビットのみとなり、128 ビット未満になります。この時、私たちは何をすべきでしょうか?平文ブロックをパディング(Padding)する必要があります。

        充填には、次の 3 つの充填モードが含まれます。

パディングなし:

        パディングは行われませんが、プレーンテキストは 16 バイトの整数倍である必要があります。

PKCS5Padding (デフォルト):

        平文ブロックが 16 バイト (128 ビット) 未満の場合、対応する数の文字が平文ブロックの最後に追加され、各バイトの値は欠落している文字の数と等しくなります。たとえば、平文: {1,2,3,4,5,a,b,c,d,e}、6 バイトが欠落している場合は、{1,2,3,4,5,a として完成します。 、b、c、d、e、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 として完成される可能性があります。 ,b,c,d,e,5,c,3,G,$,6}

4. Java コードのデモ

インターフェイス API コードは次のとおりです。

コントローラー層:

 

サービスインターフェース: 

impl 実装クラス: 

ツール:

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;
    }
}

 テストクラス:

結果は次のとおりです。 

サービスを開始します。郵便配達員を使用して確認します 

この先の紹介文は、Zhihu: Basics of Cryptography: AES Encryption Algorithm-Knowledgeからの抜粋です。

AES暗号化とは何ですか? AES暗号化アルゴリズムの原理プロセスを詳しく解説 - 知識 

元のコードは入力するのが簡単ではありません。ご清聴ありがとうございます

おすすめ

転載: blog.csdn.net/Lee_92/article/details/131087876