[[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 の依存関係をインポートします。 - <依存関係>
- <groupId>org.bouncycastle</groupId>
- <artifactId>bcprov-jdk15</artifactId>
- <バージョン>1.46</バージョン>
- </依存関係>
Commons Codec 依存関係を導入します。 - <依存関係>
- <groupId>コモンズコーデック</groupId>
- <artifactId>コモンズコーデック</artifactId>
- <バージョン>1.10</バージョン>
- </依存関係>
Java コードの実装: - java.security.Keyをインポートします。
- java.security.Security をインポートします。
- javax.crypto.Cipher をインポートします。
- javax.crypto.KeyGenerator をインポートします。
- javax.crypto.SecretKey をインポートします。
- javax.crypto.SecretKeyFactory をインポートします。
- javax.crypto.spec.DESKeySpec をインポートします。
- org.apache.commons.codec.binary.Hexをインポートします。
- org.bouncycastle.jce.provider.BouncyCastleProvider をインポートします。
-
- パブリッククラスDES{
-
- 公共 静的最終文字列 src = "des test" ;
-
- 公共 静的void main(String[] args) {
- jdkDES();
- bcDES();
- }
-
- // JDK で実装:
- 公共 静的void jdkDES() {
- 試す {
- //キーを生成する
- キージェネレーター keyGenerator = KeyGenerator.getInstance( "DES" );
- キージェネレータを初期化します(56);
- // キーを生成する
- 秘密キー secretKey = keyGenerator.generateKey();
- // キーを取得する
- byte[] bytesKey = secretKey.getEncoded();
-
- //キー変換
- DESKeySpec desKeySpec = 新しい DESKeySpec(bytesKey);
- SecretKeyFactory ファクトリー = SecretKeyFactory.getInstance( "DES" );
- キーconvertSecretKey = factory.generateSecret(desKeySpec);
-
- // 暗号化
- 暗号 cipher = Cipher.getInstance( "DES/ECB/PKCS5Padding" );
- cipher.init(Cipher.ENCRYPT_MODE、convertSecretKey);
- byte[] 結果 = cipher.doFinal(src.getBytes());
- System.out.println ( " jdk des encrypt:" + Hex.encodeHexString(result));
-
- // 復号化
- 暗号を初期化します(Cipher.DECRYPT_MODE、convertSecretKey);
- 結果 = cipher.doFinal(結果);
- System.out.println ( " jdk des decrypt:" + new String(result));
- } キャッチ (例外 e) {
- e.printStackTrace();
- }
- }
-
- // バウンシーキャッスルを使用して実装:
- 公共 静的voidbcDES() {
- 試す {
- セキュリティプロバイダを追加します(新しい BouncyCastleProvider());
-
- //キーを生成する
- キー ジェネレーター keyGenerator = KeyGenerator.getInstance( "DES" , "BC" );
- キージェネレーターの getProvider();
- キージェネレータを初期化します(56);
- // キーを生成する
- 秘密キー secretKey = keyGenerator.generateKey();
- // キーを取得する
- byte[] bytesKey = secretKey.getEncoded();
-
- //キー変換
- DESKeySpec desKeySpec = 新しい DESKeySpec(bytesKey);
- SecretKeyFactory ファクトリー = SecretKeyFactory.getInstance( "DES" );
- キーconvertSecretKey = factory.generateSecret(desKeySpec);
-
- // 暗号化
- 暗号 cipher = Cipher.getInstance( "DES/ECB/PKCS5Padding" );
- cipher.init(Cipher.ENCRYPT_MODE、convertSecretKey);
- byte[] 結果 = cipher.doFinal(src.getBytes());
- System.out.println ( "bc des encrypt:" + Hex.encodeHexString(result)) ;
-
- // 復号化
- 暗号を初期化します(Cipher.DECRYPT_MODE、convertSecretKey);
- 結果 = cipher.doFinal(結果);
- System.out.println ( "bc des decrypt :" + new String(result));
- } キャッチ (例外 e) {
- e.printStackTrace();
- }
- }
- }
アプリケーション例: 3. 対称暗号化アルゴリズム - 3DES 暗号化において、トリプル データ暗号化アルゴリズム (TDEA、トリプル DEA)、または 3DES (トリプル DES) は、対称キー暗号化ブロック暗号であり、各データ ブロックにデータ暗号化標準 (DES) アルゴリズムを 3 回適用することと同等です。コンピュータの計算能力の向上により、元の DES 暗号のキーの長さはブルートフォース攻撃によって簡単に解読できるようになりました。3DES は、まったく新しいブロック暗号アルゴリズムを設計するのではなく、DES のキーの長さを増やすことで同様の攻撃を回避する比較的簡単な方法を提供するように設計されています。 Java コードの実装: - java.security.Keyをインポートします。
- java.security.SecureRandom をインポートします。
- java.security.Security をインポートします。
- javax.crypto.Cipher をインポートします。
- javax.crypto.KeyGenerator をインポートします。
- javax.crypto.SecretKey をインポートします。
- javax.crypto.SecretKeyFactory をインポートします。
- javax.crypto.spec.DESedeKeySpec をインポートします。
- org.apache.commons.codec.binary.Hexをインポートします。
- org.bouncycastle.jce.provider.BouncyCastleProvider をインポートします。
-
- パブリッククラスDES3 {
-
- 公共 静的最終文字列 src = "3des テスト" ;
-
- 公共 静的void main(String[] args) {
- jdk3DES();
- bc3DES();
- }
-
- // JDK で実装:
- 公共 静的void jdk3DES() {
- 試す {
- //キーを生成する
- キージェネレーター keyGenerator = KeyGenerator.getInstance( "DESede" );
- // 必要な長さ: 112 または 168
- // キージェネレーターを初期化します(168);
- keyGenerator.init(新しいSecureRandom());
- // キーを生成する
- 秘密キー secretKey = keyGenerator.generateKey();
- // キーを取得する
- byte[] bytesKey = secretKey.getEncoded();
-
- //キー変換
- DESedeKeySpec desKeySpec = 新しい DESedeKeySpec(bytesKey);
- SecretKeyFactory ファクトリー = SecretKeyFactory.getInstance( "DESede" );
- キーconvertSecretKey = factory.generateSecret(desKeySpec);
-
- // 暗号化
- 暗号 cipher = Cipher.getInstance( "DESede/ECB/PKCS5Padding" );
- cipher.init(Cipher.ENCRYPT_MODE、convertSecretKey);
- byte[] 結果 = cipher.doFinal(src.getBytes());
- System.out.println ( "jdk 3des 暗号化: " + Hex.encodeHexString(result));
-
- // 復号化
- 暗号を初期化します(Cipher.DECRYPT_MODE、convertSecretKey);
- 結果 = cipher.doFinal(結果);
- System.out.println ( "jdk 3des 復号化:" +新しい文字列(結果));
-
- } キャッチ (例外 e) {
- e.printStackTrace();
- }
- }
-
- // バウンシーキャッスルを使用して実装:
- 公共 静的voidbc3DES() {
- 試す {
- セキュリティプロバイダを追加します(新しい BouncyCastleProvider());
-
- //キーを生成する
- キー ジェネレーター keyGenerator = KeyGenerator.getInstance( "DESede" , "BC" );
- キージェネレーターの getProvider();
- キージェネレータを初期化します(168);
- // キーを生成する
- 秘密キー secretKey = keyGenerator.generateKey();
- // キーを取得する
- byte[] bytesKey = secretKey.getEncoded();
-
- //キー変換
- DESedeKeySpec desKeySpec = 新しい DESedeKeySpec(bytesKey);
- SecretKeyFactory ファクトリー = SecretKeyFactory.getInstance( "DESede" );
- キーconvertSecretKey = factory.generateSecret(desKeySpec);
-
- // 暗号化
- 暗号 cipher = Cipher.getInstance( "DESede/ECB/PKCS5Padding" );
- cipher.init(Cipher.ENCRYPT_MODE、convertSecretKey);
- byte[] 結果 = cipher.doFinal(src.getBytes());
- System.out.println ( "bc 3des 暗号化:" + Hex.encodeHexString(result));
-
- // 復号化
- 暗号を初期化します(Cipher.DECRYPT_MODE、convertSecretKey);
- 結果 = cipher.doFinal(結果);
- システム.out.println ( "bc 3des 復号化:" + new String(result));
-
- } キャッチ (例外 e) {
- e.printStackTrace();
- }
- }
- }
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 コードの実装: - java.security.Keyをインポートします。
- java.security.Security をインポートします。
- javax.crypto.Cipher をインポートします。
- javax.crypto.KeyGenerator をインポートします。
- javax.crypto.SecretKey をインポートします。
- javax.crypto.spec.SecretKeySpec をインポートします。
- org.apache.commons.codec.binary.Hexをインポートします。
- org.bouncycastle.jce.provider.BouncyCastleProvider をインポートします。
-
- パブリッククラスAES {
-
- 公共 静的最終文字列 src = "aes テスト" ;
-
- 公共 静的void main(String[] args) {
- jdkAES();
- bcAES();
- }
-
- // JDK で実装:
- 公共 静的void jdkAES() {
- 試す {
- //キーを生成する
- キージェネレーター keyGenerator = KeyGenerator.getInstance( "AES" );
- キージェネレータを初期化します(128);
- // キーを生成する
- 秘密キー secretKey = keyGenerator.generateKey();
- // キーを取得する
- byte[] keyBytes = secretKey.getEncoded();
-
- //キー変換
- 鍵 キー= 新しい SecretKeySpec(keyBytes、 "AES" );
-
- // 暗号化
- 暗号 cipher = Cipher.getInstance( "AES/ECB/PKCS5Padding" );
- cipher.init(Cipher.ENCRYPT_MODE、キー);
- byte[] 結果 = cipher.doFinal(src.getBytes());
- System.out.println ( " jdk aes encrypt:" + Hex.encodeHexString(result));
-
- // 復号化
- cipher.init(Cipher.DECRYPT_MODE、キー);
- 結果 = cipher.doFinal(結果);
- システム.out.println ( "jdk aes decrypt:" + new String(result));
- } キャッチ (例外 e) {
- e.printStackTrace();
- }
- }
-
- // バウンシーキャッスルを使用して実装:
- 公共 静的voidbcAES() {
- 試す {
- セキュリティプロバイダを追加します(新しい BouncyCastleProvider());
-
- //キーを生成する
- キージェネレーター keyGenerator = KeyGenerator.getInstance( "AES" , "BC" );
- キージェネレーターの getProvider();
- キージェネレータを初期化します(128);
- // キーを生成する
- 秘密キー secretKey = keyGenerator.generateKey();
- // キーを取得する
- byte[] keyBytes = secretKey.getEncoded();
-
- //キー変換
- 鍵 キー= 新しい SecretKeySpec(keyBytes、 "AES" );
-
- // 暗号化
- 暗号 cipher = Cipher.getInstance( "AES/ECB/PKCS5Padding" );
- cipher.init(Cipher.ENCRYPT_MODE、キー);
- byte[] 結果 = cipher.doFinal(src.getBytes());
- System.out.println ( "bc aes encrypt :" + Hex.encodeHexString(result));
-
- // 復号化
- cipher.init(Cipher.DECRYPT_MODE、キー);
- 結果 = cipher.doFinal(結果);
- システム.out.println ( "bc aes decrypt:" +new String(result));
- } キャッチ (例外 e) {
- e.printStackTrace();
- }
- }
- }
5. 対称暗号化アルゴリズム - PBE PBEアルゴリズム(パスワードベースの暗号化)は、パスワードベースの暗号化アルゴリズムです。キーの代わりにパスワードが使用され、パスワードはユーザー自身によって制御されるという特徴があります。乱数ハッシュと複数の暗号化方法を使用して、データのセキュリティを確保します。 PBE アルゴリズムは、暗号化プロセス中にパスワードを直接暗号化に使用しません。代わりに、パスワードによって暗号化キーが生成されます。この機能は、PBE アルゴリズムの KDF 関数によって実行されます。 KDF 関数の実装プロセスは、まずユーザーが入力したパスワードを「ソルト」でスクランブルして準キーを生成し、次に準キーをハッシュ関数で複数回反復して最終的な暗号化キーを生成するというものです。キーが生成されると、PBE アルゴリズムは対称暗号化アルゴリズムを使用してデータを暗号化します。DES、3DES、RC5 などの対称暗号化アルゴリズムを選択できます。 具体的な実装は以下のとおりです。 Java コードの実装: - java.security.Keyをインポートします。
- java.security.SecureRandom をインポートします。
- javax.crypto.Cipher をインポートします。
- javax.crypto.SecretKeyFactory をインポートします。
- javax.crypto.spec.PBEKeySpec をインポートします。
- javax.crypto.spec.PBEParameterSpec をインポートします。
- org.apache.commons.codec.binary.Hexをインポートします。
-
- パブリッククラスPBE{
-
- 公共 静的最終文字列 src = "pbe テスト" ;
-
- 公共 静的void main(String[] args) {
- jdkPBE();
- }
-
- // JDK で実装:
- 公共 静的void jdkPBE() {
- 試す {
- // ソルトを初期化する
- SecureRandom ランダム = 新しい SecureRandom();
- byte[] salt = random.generateSeed(8);
-
- // パスワードとキー
- 文字列パスワード= "timliu" ;
- PBEKeySpec pbeKeySpec = 新しい PBEKeySpec(パスワード.toCharArray());
- SecretKeyFactory ファクトリー = SecretKeyFactory.getInstance( "PBEWITHMD5andDES" );
- 鍵 キー= factory.generateSecret(pbeKeySpec);
-
- // 暗号化
- PBEParameterSpec pbeParameterSpac = 新しい PBEParameterSpec(salt, 100);
- 暗号 cipher = Cipher.getInstance( "PBEWITHMD5andDES" );
- cipher.init(Cipher.ENCRYPT_MODE、キー、pbeParameterSpac);
- byte[] 結果 = cipher.doFinal(src.getBytes());
- システム.out.println ( "jdk pbe encrypt: " + Hex.encodeHexString(result));
-
- // 復号化
- cipher.init(Cipher.DECRYPT_MODE、キー、pbeParameterSpac);
- 結果 = cipher.doFinal(結果);
- System.out.println ( "jdk pbe復号化:" + 新しい文字列(結果));
- } キャッチ (例外 e) {
- e.printStackTrace();
- }
- }
- }
アプリケーション例: |