素晴らしい安全な旅行AESアルゴリズム

こんにちは、皆さん、今日は対称暗号化アルゴリズムにAESアルゴリズムを紹介します。

AESの概要

AES(英語:Advanced Encryption Standard、略称:AES)は、暗号化ではRijndael暗号化とも呼ばれ、米国連邦政府によって採用されているブロック暗号化標準です。この標準は、元のDESを置き換えるために使用され、多くの関係者によって分析されており、世界中で広く使用されています。5年間の選択プロセスの後、Advanced Encryption Standardは、米国国立標準技術研究所(NIST)によって2001年11月26日にFIPS PUB 197で公開され、2002年5月26日に有効な標準になりました。2006年、AESアルゴリズムは、対称鍵暗号化で最も人気のあるアルゴリズムの1つになりました。厳密に言えば、AESは一般的な暗号化標準です。通常、私たちがよく言うAESアルゴリズムは、AES標準の実装アルゴリズムであるRijndaelアルゴリズムを指します。

Rijndaelアルゴリズム

NISTは、1997年9月12日に、より効率的で安全な代替DES暗号化アルゴリズムを公に求めました。最初のラウンドで合計15のアルゴリズムが選択され、そのうち5つがファイナリスト、つまりRijndael、Serpent、Twofish、RC6、MARSでした。3年間の検証、評価、公開討論の後、Rijndaelアルゴリズムが最終的に選択されました。

Rijndaelアルゴリズムは、ブロック暗号アルゴリズムのファミリーです。そのブロック長には、128ビット、160ビット、192ビット、224ビット、および256ビットが含まれます。キー長には、これら5つの長さも含まれます。AES標準アルゴリズムは、パケット長が128ビット、キー長が128ビット、192ビット、256ビットの3つのバージョンを選択することです。名前はそれぞれAES-128、AES-196、AES-256です。これらの3つのバージョンは次のとおりです。暗号化されています。基本的に同じですが、キー拡張アルゴリズムのプロセスが少し異なります。

AESの基本構造

AESはブロック暗号です。ブロック暗号は、平文を同じ長さのグループに分割することです。データの各グループは、すべてのグループが暗号化されるまで暗号化されます。AES標準仕様では、パケット長は128ビットのみです。つまり、各パケットは16バイトです。キーの長さは、128ビット、192ビット、または256ビットにすることができます。キーの長さが異なり、推奨される暗号化ラウンドの数も異なります。次の表に示すように:

アルゴリズム キーの長さ(ビット) パケット長(ビット) 暗号化ラウンド
AES-128 128 128 10
AES-192 192 128 12
AES-256 256 128 14

AESアルゴリズムの原則

AESアルゴリズムには、主に4種類の操作処理があります。

  • キー追加レイヤー(ラウンドキー追加、英語追加ラウンドキーとも呼ばれます)
  • バイト置換レイヤー(SubByte)
  • OKディスプレイスメントレイヤー(Shift行)
  • カラム混同層(混合カラム)

AESアルゴリズムのプレーンテキストとキーは、16バイトで構成されるデータです(もちろん、キーは、ここでは説明されていない192ビットと256ビットの長さもサポートします)。上から下にバイトの順序で、左から右に配置。暗号化された暗号文の読み取り順序もこの順序で読み取られます。これは、配列を文字列の外観に復元するのと同じであり、復号化時に4x4配列に従って処理されます。AESアルゴリズムによって処理されるラウンド数では、最後のラウンド操作のみが前のラウンド処理とわずかに異なり(最後のラウンドでは列の混乱処理が欠落しているだけです)、ラウンド処理の前に別のラウンドキー追加処理が実行されます開始します。処理ラウンド数に関しては、128ビットキーを使用した10ラウンドの処理のみを考慮します。次に、AESアルゴリズムの処理フローを段階的に紹介します。

AESアルゴリズムのフローチャート

キー追加レイヤー(ラウンドキーの追加)

キー追加レイヤーには、プレーンテキストとサブキーk [0]の2つの入力パラメーターがあり、両方の入力は128ビットです。k [0]は実際にはキーkと同等であり、特定の理由はキー拡張の生成で導入されます。拡張フィールドの加算と減算の導入で前述したように、拡張フィールドでの加算と減算の演算はXOR演算と同等であるため、ここでの処理は非常に簡単です。2つの入力データを押すだけで済みます。バイトXOR操作は、操作の結果を取得します。アイコン:

バイト置換レイヤー(SubByte)

バイト置換層の主な機能は、入力データがS_boxテーブルを介して1バイトから別のバイトへのマッピングを完了できるようにすることです。ここでのS_boxテーブルは特定の方法で計算され、特定の計算方法はここでは行われません。詳細については、S_boxの結果の使用方法を知る必要があります。S_boxテーブルは256バイトの要素を持つ配列です。1次元配列または16・16の2次元配列として定義できます。2次元配列として定義されている場合、S_boxデータが読み取られます。メソッドは次のとおりです。入力データの各バイトの上位4ビットを最初の添え字として使用し、4番目のビットを2番目の添え字として使用するのは少し面倒です。1次元配列として扱うことをお勧めします。逆SボックスはSボックスに対応し、復号化時のデータ処理に使用されます。復号化時のプログラム処理は逆バイト置換と呼ばれますが、暗号化時の置換ボックスは異なります。

Sボックス

逆Sボックス

暗号化アイコン

行をシフト

行シフト演算は最も単純で、入力データを4.4バイトの行列として処理し、この行列のバイトの位置置換を実行するために使用されます。ShiftRowsサブレイヤーはAES手動拡散レイヤーに属しており、アバランシェ効果を実現するために、変換を1ビットで拡散して状態全体に影響を与えることを目的としています。暗号化時の変位処理は、復号化時の処理と逆になります。ここでは、復号化時の処理を逆行変位と呼びます。4.4マトリックスの行間でのみ動作し、各行に4バイトのデータが含まれるため、行シフトと呼ばれます。

**暗号化する場合:**行列の最初の行を変更せずに、2番目の行を8ビット(1バイト)左に移動し、3番目の行を2バイト左に移動し、4番目の行を3バイト左に移動します。

**復号化中:**行列の最初の行を変更せずに、2番目の行を8ビット(1バイト)右に、3番目の行を2バイト右に、4番目の行を3バイト右に移動します。 。

前方変位の図

逆変位図

列の混乱(MixColumn)

列混同サブレイヤーはAESアルゴリズムの最も複雑な部分であり、拡散レイヤーに属します。列混同操作はAESアルゴリズムの主要な拡散要素であり、入力マトリックスの各列を混同するため、入力の各バイトが混同されます。 4出力バイトに影響します。行変位サブレイヤーと列混乱サブレイヤーの組み合わせにより、3ラウンドの処理後、マトリックスの各バイトが16の平文バイトに依存することが可能になります。ガロア体における行列の乗算、加算、乗算の知識が含まれています。

AESアルゴリズムの実装

AESキーをランダムに生成します。

/**
  * 生成随机AES密钥,密钥长度128位
  *
  * @return AES明文密钥Base64字符串
  */
public static String genAesRandomKey2Base64Str() {
    
    
    return Base64.encodeBase64String(genAesRandomKey());
}

/**
  * 生成随机AES密钥,密钥长度128位
  *
  * @return AES明文密钥字节数组
  */
public static byte[] genAesRandomKey() {
    
    
    KeyGenerator keygen = null;
    try {
    
    
        keygen = KeyGenerator.getInstance(AES_ALGORITHM);
    } catch (NoSuchAlgorithmException e) {
    
    
        throw new RuntimeException("genarateRandomKey fail!", e);
    }
    SecureRandom random = new SecureRandom();
    keygen.init(random);
    Key key = keygen.generateKey();

    return key.getEncoded();
}

AES暗号化:

/**
  * AES 加密
  *
  * @param data 待加密密内容
  * @param key  加密密钥
  * @return
  */
public static byte[] encrypt(byte[] data, byte[] key) {
    
    
    if (key.length != 16) {
    
    
        throw new RuntimeException("Invalid AES key length (must be 16 bytes)");
    }
    try {
    
    
        SecretKeySpec secretKey = new SecretKeySpec(key, AES_ALGORITHM);
        // 创建密码器
        Cipher cipher = Cipher.getInstance(AES_CIPTHER);
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] result = cipher.doFinal(data);

        return result;
    } catch (Exception e) {
    
    
        throw new RuntimeException("encrypt fail!", e);
    }
}

AES復号化:

/**
  * AES 解密
  *
  * @param data 待解密内容
  * @param key  解密密钥
  * @return
  */
public static byte[] decrypt(byte[] data, byte[] key) {
    
    
    if (key.length != 16) {
    
    
        throw new RuntimeException("Invalid AES key length (must be 16 bytes)");
    }
    try {
    
    
        SecretKeySpec secretKey = new SecretKeySpec(key, AES_ALGORITHM);
        // 创建密码器
        Cipher cipher = Cipher.getInstance(AES_CIPTHER);
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] result = cipher.doFinal(data);

        return result;
    } catch (Exception e) {
    
    
        throw new RuntimeException("decrypt fail!", e);
    }
}

完全なコードを表示するには、次のサイトにアクセスしてください。

https://github.com/ForTheDevelopers/JavaSecurity

アプリケーションシナリオ

AESアルゴリズムは効率が高いため、一般的に効率が要求されるリアルタイムのデータ暗号化通信に使用されます。たとえば、暗号化通信にVPNまたはプロキシを使用する場合、データの機密性を確保し、高遅延が発生しないようにする必要があるため、通常はAESアルゴリズムが使用されます。

さらに、実際のアプリケーションでは、通常、AESアルゴリズムとRSAアルゴリズムを組み合わせて、一方ではキーのセキュリティを確保し、他方では暗号化の効率を確保します。この部分については、後で詳しく説明します。

総括する

AESアルゴリズムは、セキュリティが高く、暗号化速度が速く、大量の暗号化データを処理できるため、広く使用されています。AESは対称暗号化アルゴリズムでもあるため、グループ化モードとパディングモードの選択も含まれます。前の記事。また、このシリーズのすべてのソースコードを入手するには、公式アカウントに注意を払い、[暗号化と復号化]に返信してください。

参照

1. AESアルゴリズムの詳細説明

整合性が高く、暗号化速度が速く、大量の暗号化データを処理できるため、広く使用されています。AESは対称暗号化アルゴリズムでもあるため、グループ化モードとパディングモードの選択も含まれます。前の記事。また、このシリーズのすべてのソースコードを入手するには、公式アカウントに注意を払い、[暗号化と復号化]に返信してください。

参照

1. AESアルゴリズムの詳細説明

作成するのは簡単ではありません。この記事が気に入ったら、気に入って転送してください。あなたの注意は、私たちが前進する原動力です_

著者について
著者に連絡する
  • WeChat ID:ForTheDeveloper

  • 公開番号:ForTheDevelopers

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/ForTheDevelopers/article/details/112726902