DES、3DES、AES、PBE対称暗号化アルゴリズムの実装と応用

DES、3DES、AES、PBE対称暗号化アルゴリズムの実装と応用

  [[272601]]

1. 対称暗号化アルゴリズムの概要

対称暗号化アルゴリズムは、成熟した技術を備えた初期の暗号化アルゴリズムです。対称暗号化アルゴリズムでは、データ送信者は特別な暗号化アルゴリズムを使用して平文と暗号化キーを一緒に処理し、複雑な暗号化された暗号文に変換して送信します。受信者が暗号文を受け取った後、元のテキストを解読したい場合は、暗号化キーと同じアルゴリズムの逆アルゴリズムを使用して暗号文を解読し、読み取り可能な平文に戻す必要があります。

対称暗号化アルゴリズムでは、使用されるキーは 1 つだけであり、送信者と受信者の両方がこのキーを使用してデータを暗号化および復号化するため、復号化側は事前に暗号化キーを知っている必要があります。

対称暗号化アルゴリズムの特徴は、オープンアルゴリズム、計算量が少ない、暗号化速度が速い、暗号化効率が高いなどです。

欠点は、取引の両当事者が同じキーを使用するため、セキュリティが保証されないことです。

コンピュータ システムで広く使用されている対称暗号化アルゴリズムには、DES や IDEA などがあります。近年DESが度々解読されたため、米国国立標準局が提唱するAESが新たな標準としてDESに取って代わろうとしている。

2. 対称暗号化アルゴリズム - DES

DES アルゴリズムは対称暗号システムであり、American Data Encryption Standard とも呼ばれます。これは、1972 年に米国の IBM によって開発された対称暗号システムの暗号化アルゴリズムです。

平文は 64 ビットにグループ化され、キーの長さは 64 ビットです。実際、DES 操作に関係するキーは 56 ビットです (8 番目、16 番目、24 番目、32 番目、40 番目、48 番目、56 番目、および 64 番目のビットはチェック ビットであるため、各キーには奇数の 1 が含まれます)。グループ化された平文グループと 56 ビットのキーは、ビットごとに置き換えられるか交換され、暗号文グループの暗号化方式を形成します。

Bouncy Castle の依存関係をインポートします。

  1. <依存関係>
  2. <groupId>org.bouncycastle</groupId>
  3. <artifactId>bcprov-jdk15</artifactId>
  4. <バージョン>1.46</バージョン>
  5. </依存関係>

Commons Codec 依存関係を導入します。

  1. <依存関係>
  2. <groupId>コモンズコーデック</groupId>
  3. <artifactId>コモンズコーデック</artifactId>
  4. <バージョン>1.10</バージョン>
  5. </依存関係>

Java コードの実装:

  1. java.security.Keyをインポートします
  2. java.security.Security をインポートします。
  3. javax.crypto.Cipher をインポートします。
  4. javax.crypto.KeyGenerator をインポートします。
  5. javax.crypto.SecretKey をインポートします。
  6. javax.crypto.SecretKeyFactory をインポートします。
  7. javax.crypto.spec.DESKeySpec をインポートします。
  8. org.apache.commons.codec.binary.Hexインポートします
  9. org.bouncycastle.jce.provider.BouncyCastleProvider をインポートします。
  10.  
  11. パブリッククラスDES{
  12.  
  13. 公共 静的最終文字列 src = "des test" ;
  14.  
  15. 公共 静的void main(String[] args) {
  16. jdkDES();
  17. bcDES();
  18. }
  19.  
  20. // JDK で実装:
  21. 公共 静的void jdkDES() {
  22. 試す {
  23. //キーを生成する 
  24. キージェネレーター keyGenerator = KeyGenerator.getInstance( "DES" );
  25. キージェネレータを初期化します(56);
  26. // キーを生成する
  27. 秘密キー secretKey = keyGenerator.generateKey();
  28. // キーを取得する
  29. byte[] bytesKey = secretKey.getEncoded();
  30.  
  31. //キー変換
  32. DESKeySpec desKeySpec = 新しい DESKeySpec(bytesKey);
  33. SecretKeyFactory ファクトリー = SecretKeyFactory.getInstance( "DES" );
  34. キーconvertSecretKey = factory.generateSecret(desKeySpec);
  35.  
  36. // 暗号化
  37. 暗号 cipher = Cipher.getInstance( "DES/ECB/PKCS5Padding" );
  38. cipher.init(Cipher.ENCRYPT_MODE、convertSecretKey);
  39. byte[] 結果 = cipher.doFinal(src.getBytes());
  40. System.out.println ( " jdk des encrypt:" + Hex.encodeHexString(result));
  41.  
  42. // 復号化
  43. 暗号を初期化します(Cipher.DECRYPT_MODE、convertSecretKey);
  44. 結果 = cipher.doFinal(結果);
  45. System.out.println ( " jdk des decrypt:" + new String(result));
  46. } キャッチ (例外 e) {
  47. e.printStackTrace();
  48. }
  49. }
  50.  
  51. // バウンシーキャッスルを使用して実装:
  52. 公共 静的voidbcDES() {
  53. 試す {
  54. セキュリティプロバイダを追加します(新しい BouncyCastleProvider());
  55.  
  56. //キーを生成する 
  57. キー ジェネレーター keyGenerator = KeyGenerator.getInstance( "DES" , "BC" );
  58. キージェネレーターの getProvider();
  59. キージェネレータを初期化します(56);
  60. // キーを生成する
  61. 秘密キー secretKey = keyGenerator.generateKey();
  62. // キーを取得する
  63. byte[] bytesKey = secretKey.getEncoded();
  64.  
  65. //キー変換
  66. DESKeySpec desKeySpec = 新しい DESKeySpec(bytesKey);
  67. SecretKeyFactory ファクトリー = SecretKeyFactory.getInstance( "DES" );
  68. キーconvertSecretKey = factory.generateSecret(desKeySpec);
  69.  
  70. // 暗号化
  71. 暗号 cipher = Cipher.getInstance( "DES/ECB/PKCS5Padding" );
  72. cipher.init(Cipher.ENCRYPT_MODE、convertSecretKey);
  73. byte[] 結果 = cipher.doFinal(src.getBytes());
  74. System.out.println ( "bc des encrypt:" + Hex.encodeHexString(result)) ;
  75.  
  76. // 復号化
  77. 暗号を初期化します(Cipher.DECRYPT_MODE、convertSecretKey);
  78. 結果 = cipher.doFinal(結果);
  79. System.out.println ( "bc des decrypt :" + new String(result));
  80. } キャッチ (例外 e) {
  81. e.printStackTrace();
  82. }
  83. }
  84. }

アプリケーション例:

3. 対称暗号化アルゴリズム - 3DES

暗号化において、トリプル データ暗号化アルゴリズム (TDEA、トリプル DEA)、または 3DES (トリプル DES) は、対称キー暗号化ブロック暗号であり、各データ ブロックにデータ暗号化標準 (DES) アルゴリズムを 3 回適用することと同等です。コンピュータの計算能力の向上により、元の DES 暗号のキーの長さはブルートフォース攻撃によって簡単に解読できるようになりました。3DES は、まったく新しいブロック暗号アルゴリズムを設計するのではなく、DES のキーの長さを増やすことで同様の攻撃を回避する比較的簡単な方法を提供するように設計されています。

Java コードの実装:

  1. java.security.Keyをインポートします
  2. java.security.SecureRandom をインポートします。
  3. java.security.Security をインポートします。
  4. javax.crypto.Cipher をインポートします。
  5. javax.crypto.KeyGenerator をインポートします。
  6. javax.crypto.SecretKey をインポートします。
  7. javax.crypto.SecretKeyFactory をインポートします。
  8. javax.crypto.spec.DESedeKeySpec をインポートします。
  9. org.apache.commons.codec.binary.Hexインポートします
  10. org.bouncycastle.jce.provider.BouncyCastleProvider をインポートします。
  11.  
  12. パブリッククラスDES3 {
  13.  
  14. 公共 静的最終文字列 src = "3des テスト" ;
  15.  
  16. 公共 静的void main(String[] args) {
  17. jdk3DES();
  18. bc3DES();
  19. }
  20.  
  21. // JDK で実装:
  22. 公共 静的void jdk3DES() {
  23. 試す {
  24. //キーを生成する 
  25. キージェネレーター keyGenerator = KeyGenerator.getInstance( "DESede" );
  26. // 必要な長さ: 112 または 168
  27. // キージェネレーターを初期化します(168);
  28. keyGenerator.init(新しいSecureRandom());
  29. // キーを生成する
  30. 秘密キー secretKey = keyGenerator.generateKey();
  31. // キーを取得する
  32. byte[] bytesKey = secretKey.getEncoded();
  33.  
  34. //キー変換
  35. DESedeKeySpec desKeySpec = 新しい DESedeKeySpec(bytesKey);
  36. SecretKeyFactory ファクトリー = SecretKeyFactory.getInstance( "DESede" );
  37. キーconvertSecretKey = factory.generateSecret(desKeySpec);
  38.  
  39. // 暗号化
  40. 暗号 cipher = Cipher.getInstance( "DESede/ECB/PKCS5Padding" );
  41. cipher.init(Cipher.ENCRYPT_MODE、convertSecretKey);
  42. byte[] 結果 = cipher.doFinal(src.getBytes());
  43. System.out.println ( "jdk 3des 暗号: " + Hex.encodeHexString(result));
  44.  
  45. // 復号化
  46. 暗号を初期化します(Cipher.DECRYPT_MODE、convertSecretKey);
  47. 結果 = cipher.doFinal(結果);
  48. System.out.println ( "jdk 3des 復号化:" +新しい文字列(結果));
  49.  
  50. } キャッチ (例外 e) {
  51. e.printStackTrace();
  52. }
  53. }
  54.  
  55. // バウンシーキャッスルを使用して実装:
  56. 公共 静的voidbc3DES() {
  57. 試す {
  58. セキュリティプロバイダを追加します(新しい BouncyCastleProvider());
  59.  
  60. //キーを生成する 
  61. キー ジェネレーター keyGenerator = KeyGenerator.getInstance( "DESede" , "BC" );
  62. キージェネレーターの getProvider();
  63. キージェネレータを初期化します(168);
  64. // キーを生成する
  65. 秘密キー secretKey = keyGenerator.generateKey();
  66. // キーを取得する
  67. byte[] bytesKey = secretKey.getEncoded();
  68.  
  69. //キー変換
  70. DESedeKeySpec desKeySpec = 新しい DESedeKeySpec(bytesKey);
  71. SecretKeyFactory ファクトリー = SecretKeyFactory.getInstance( "DESede" );
  72. キーconvertSecretKey = factory.generateSecret(desKeySpec);
  73.  
  74. // 暗号化
  75. 暗号 cipher = Cipher.getInstance( "DESede/ECB/PKCS5Padding" );
  76. cipher.init(Cipher.ENCRYPT_MODE、convertSecretKey);
  77. byte[] 結果 = cipher.doFinal(src.getBytes());
  78. System.out.println ( "bc 3des 暗号:" + Hex.encodeHexString(result));
  79.  
  80. // 復号化
  81. 暗号を初期化します(Cipher.DECRYPT_MODE、convertSecretKey);
  82. 結果 = cipher.doFinal(結果);
  83. システム.out.println ( "bc 3des 復号化:" + new String(result));
  84.  
  85. } キャッチ (例外 e) {
  86. e.printStackTrace();
  87. }
  88. }
  89. }

4. 対称暗号化アルゴリズム - AES

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

このアルゴリズムは、ベルギーの暗号学者ジョアン・デーメンとヴィンセント・ライメンによって設計され、2人の著者の名前を組み合わせた「Rijndael」という名前でAdvanced Encryption Standardの選定プロセスに提出されました。 (Rijndael は「Rhine doll」と似た発音です)

Java コードの実装:

  1. java.security.Keyをインポートします
  2. java.security.Security をインポートします。
  3. javax.crypto.Cipher をインポートします。
  4. javax.crypto.KeyGenerator をインポートします。
  5. javax.crypto.SecretKey をインポートします。
  6. javax.crypto.spec.SecretKeySpec をインポートします。
  7. org.apache.commons.codec.binary.Hexインポートします
  8. org.bouncycastle.jce.provider.BouncyCastleProvider をインポートします。
  9.  
  10. パブリッククラスAES {
  11.  
  12. 公共 静的最終文字列 src = "aes テスト" ;
  13.  
  14. 公共 静的void main(String[] args) {
  15. jdkAES();
  16. bcAES();
  17. }
  18.  
  19. // JDK で実装:
  20. 公共 静的void jdkAES() {
  21. 試す {
  22. //キーを生成する 
  23. キージェネレーター keyGenerator = KeyGenerator.getInstance( "AES" );
  24. キージェネレータを初期化します(128);
  25. // キーを生成する
  26. 秘密キー secretKey = keyGenerator.generateKey();
  27. // キーを取得する
  28. byte[] keyBytes = secretKey.getEncoded();
  29.  
  30. //キー変換
  31.  キー= 新しい SecretKeySpec(keyBytes、 "AES" );
  32.  
  33. // 暗号化
  34. 暗号 cipher = Cipher.getInstance( "AES/ECB/PKCS5Padding" );
  35. cipher.init(Cipher.ENCRYPT_MODE、キー);
  36. byte[] 結果 = cipher.doFinal(src.getBytes());
  37. System.out.println ( " jdk aes encrypt:" + Hex.encodeHexString(result));
  38.  
  39. // 復号化
  40. cipher.init(Cipher.DECRYPT_MODE、キー);
  41. 結果 = cipher.doFinal(結果);
  42. システム.out.println ( "jdk aes decrypt:" + new String(result));
  43. } キャッチ (例外 e) {
  44. e.printStackTrace();
  45. }
  46. }
  47.  
  48. // バウンシーキャッスルを使用して実装:
  49. 公共 静的voidbcAES() {
  50. 試す {
  51. セキュリティプロバイダを追加します(新しい BouncyCastleProvider());
  52.  
  53. //キーを生成する 
  54. キージェネレーター keyGenerator = KeyGenerator.getInstance( "AES" , "BC" );
  55. キージェネレーターの getProvider();
  56. キージェネレータを初期化します(128);
  57. // キーを生成する
  58. 秘密キー secretKey = keyGenerator.generateKey();
  59. // キーを取得する
  60. byte[] keyBytes = secretKey.getEncoded();
  61.  
  62. //キー変換
  63.  キー= 新しい SecretKeySpec(keyBytes、 "AES" );
  64.  
  65. // 暗号化
  66. 暗号 cipher = Cipher.getInstance( "AES/ECB/PKCS5Padding" );
  67. cipher.init(Cipher.ENCRYPT_MODE、キー);
  68. byte[] 結果 = cipher.doFinal(src.getBytes());
  69. System.out.println ( "bc aes encrypt :" + Hex.encodeHexString(result));
  70.  
  71. // 復号化
  72. cipher.init(Cipher.DECRYPT_MODE、キー);
  73. 結果 = cipher.doFinal(結果);
  74. システム.out.println ( "bc aes decrypt:" +new String(result));
  75. } キャッチ (例外 e) {
  76. e.printStackTrace();
  77. }
  78. }
  79. }

5. 対称暗号化アルゴリズム - PBE

PBEアルゴリズム(パスワードベースの暗号化)は、パスワードベースの暗号化アルゴリズムです。キーの代わりにパスワードが使用され、パスワードはユーザー自身によって制御されるという特徴があります。乱数ハッシュと複数の暗号化方法を使用して、データのセキュリティを確保します。

PBE アルゴリズムは、暗号化プロセス中にパスワードを直接暗号化に使用しません。代わりに、パスワードによって暗号化キーが生成されます。この機能は、PBE アルゴリズムの KDF 関数によって実行されます。 KDF 関数の実装プロセスは、まずユーザーが入力したパスワードを「ソルト」でスクランブルして準キーを生成し、次に準キーをハッシュ関数で複数回反復して最終的な暗号化キーを生成するというものです。キーが生成されると、PBE アルゴリズムは対称暗号化アルゴリズムを使用してデータを暗号化します。DES、3DES、RC5 などの対称暗号化アルゴリズムを選択できます。

具体的な実装は以下のとおりです。

Java コードの実装:

  1. java.security.Keyをインポートします
  2. java.security.SecureRandom をインポートします。
  3. javax.crypto.Cipher をインポートします。
  4. javax.crypto.SecretKeyFactory をインポートします。
  5. javax.crypto.spec.PBEKeySpec をインポートします。
  6. javax.crypto.spec.PBEParameterSpec をインポートします。
  7. org.apache.commons.codec.binary.Hexインポートします
  8.  
  9. パブリッククラスPBE{
  10.  
  11. 公共 静的最終文字列 src = "pbe テスト" ;
  12.  
  13. 公共 静的void main(String[] args) {
  14. jdkPBE();
  15. }
  16.  
  17. // JDK で実装:
  18. 公共 静的void jdkPBE() {
  19. 試す {
  20. // ソルトを初期化する
  21. SecureRandom ランダム = 新しい SecureRandom();
  22. byte[] salt = random.generateSeed(8);
  23.  
  24. // パスワードとキー
  25. 文字列パスワード= "timliu" ;
  26. PBEKeySpec pbeKeySpec = 新しい PBEKeySpec(パスワード.toCharArray());
  27. SecretKeyFactory ファクトリー = SecretKeyFactory.getInstance( "PBEWITHMD5andDES" );
  28.  キー= factory.generateSecret(pbeKeySpec);
  29.  
  30. // 暗号化
  31. PBEParameterSpec pbeParameterSpac = 新しい PBEParameterSpec(salt, 100);
  32. 暗号 cipher = Cipher.getInstance( "PBEWITHMD5andDES" );
  33. cipher.init(Cipher.ENCRYPT_MODE、キー、pbeParameterSpac);
  34. byte[] 結果 = cipher.doFinal(src.getBytes());
  35. システム.out.println ( "jdk pbe encrypt: " + Hex.encodeHexString(result));
  36.  
  37. // 復号化
  38. cipher.init(Cipher.DECRYPT_MODE、キー、pbeParameterSpac);
  39. 結果 = cipher.doFinal(結果);
  40. System.out.println ( "jdk pbe復号化:" + 新しい文字列(結果));
  41. } キャッチ (例外 e) {
  42. e.printStackTrace();
  43. }
  44. }
  45. }

アプリケーション例:

<<:  AIによる顔を変える技術によって危害を受けるのではないかと心配ですか?怖がらないで!ディープフェイク偽造対策チームが到着

>>:  エキサイティング!中国は人工知能とチップという2つの主要分野で新たな大きな進歩を遂げた。

ブログ    
ブログ    

推薦する

...

新しいディープラーニング プログラムは、ロボット工学の課題をどのように克服できるのでしょうか?

データ サイエンティストがディープラーニングについて話すとき、通常は画像の生成、検出、分類、回帰タス...

アルゴリズムの旅について話しましょう:スタック

[[379190]]スタックの本質は、特殊なデータ構造です。その特殊な構造は、データのエントリと終了...

...

位相データ解析を使用して畳み込みニューラルネットワークモデルの動作プロセスを理解する

1. はじめにニューラル ネットワークは、画像、テキスト、時系列などのさまざまなデータの処理において...

救世主か、それとも公敵か? 人工知能の現在と未来を説明する記事

囲碁チャンピオンのイ・セドルを破ったロボット「アルファ碁」から、卓球ができるKUKAロボット、遠隔手...

Google DeepMindは少なくとも21の新しい生成AI機能を開発中

Google は、人生アドバイスや予算作成などのタスクを実行できるさまざまな生成 AI 機能を開発し...

2021 年の AI サイバーセキュリティ開発の動向

AI の安全性は、サイバーセキュリティの脅威やデータ侵害を阻止する上でさらに重要であることが証明され...

データ分析 機械学習 タイタニック号事件 - 裁判

私は51CTOアカデミー講師の唐玉迪です。51CTOアカデミーの「4.20 ITリチャージフェスティ...

ByteDance、最大6.9倍のパフォーマンス向上を実現した大規模モデルトレーニングフレームワークveGiantModelをオープンソース化

背景近年、NLPの応用分野では大きな進歩がありました。Bert、GPT、GPT-3などの超大規模モデ...

ドローンは5G開発をフィードバックし、インテリジェントな運用と保守の新たなアップグレードを促進する

近年、民生用ドローンの急速な発展と5G商用化の段階的な深化に伴い、ドローンと5Gの関係はますます密接...

...

回答者の半数以上が顔認識技術の使用に懸念を抱いている

近年最も注目されている新技術の一つとして、顔認識技術が広く利用されています。人々の生活は便利になった...