暗号化アルゴリズムの将来と現状の簡単な分析

暗号化アルゴリズムの将来と現状の簡単な分析

[[357912]]

現在最も一般的に使用されている暗号化アルゴリズムは、一方向暗号化と双方向暗号化にまとめることができます。実際、これらは非常にシンプルで理解しやすいものです。しかし、Xiaoyu は、開発を効率的に進めるためには、その原則を明確に理解することが依然として必要であると感じています。結局のところ、データ セキュリティは当社の研究開発にとって最優先事項であり、暗号化アルゴリズムはソフトウェア データ セキュリティの維持に重要な役割を果たします。 Xiaoyu に従って、これらのアルゴリズムがどこで使用され、どのように使用され、コードがどのように実装されているかを見てみましょう。ゆっくり読んでいくと、これらの小さなコードに対する理解が深まります。

序文

本日は、暗号化アルゴリズムの過去と現在についてお話します。

実際、人類は古代ギリシャの時代に換字式暗号を発明しました。 1881 年までに、秘密の電話接続に関する世界初の特許が取得されました。第二次世界大戦中、ドイツ軍はエニグマ暗号機を使用しており、暗号技術は戦争において非常に重要な役割を果たしました。

1997年、米国国立標準局は「アメリカデータ暗号化規格(DES)」の導入を発表し、民間勢力が暗号の研究と応用に本格的に介入し始めました。使用される暗号化アルゴリズムには、DES、RSA、SHAなどがあります。暗号化の強度に対する需要が高まるにつれて、最近では AES や ECC などが登場しています。

さて、歴史はこれで終わりにして、本文に入りましょう。まずは暗号化アルゴリズムを使用する利点について見てみましょう。

暗号化は、次の目的を達成するために使用できます。

機密性:ユーザーの ID またはデータが読み取られないようにします。

データの整合性: データの変更を防止します。

認証: データが特定の当事者から発信されたものであることを確認します。

  • 一方向暗号化
  • 簡単に言えば、データに対して要約計算を実行することによって暗号文が生成され、暗号文を元に戻して復元することはできません。代表的なアルゴリズム: MD5、SHA、HMAC など

一方向暗号化

MD5

MD5 - メッセージ ダイジェスト アルゴリズム 5 (情報ダイジェスト アルゴリズム) の略語。暗号化および復号化技術で広く使用され、ファイルの検証によく使用されます。ファイルのサイズに関係なく、MD5 を実行すると一意の MD5 値を生成できます。たとえば、現在の ISO 検証はすべて MD5 検証であり、ISO が MD5 を通過した後、MD5 値が生成されます。 Linux-ISO をダウンロードした友人は、通常、ダウンロード リンクの横に MD5 文字列が表示されています。ファイルの整合性を確認するために使用されます。

暗号化ツールのクラスは次のとおりです。

  1. /**
  2. * MD5暗号化
  3. *
  4. * @param データ
  5. * @戻る  
  6. * @例外をスローします
  7. */
  8. 公共 静的byte[] encryptMD5(byte[] data)は例外をスローします{
  9.    
  10. MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);
  11. md5.update (データ);
  12.    
  13. md5.digest()を返します
  14.    
  15. }

シャ

デジタル署名などの暗号化アプリケーションにおける重要なツールである SHA (Secure Hash Algorithm) は、電子商取引などの情報セキュリティ分野で広く使用されています。 SHA と MD5 は両方とも衝突法によって解読されていますが、SHA は依然として安全な暗号化アルゴリズムとして認識されており、MD5 よりも安全です。

暗号化ツールのクラスは次のとおりです。

  1. /**
  2. * SHA暗号化
  3. *
  4. * @param データ
  5. * @戻る  
  6. * @例外をスローします
  7. */
  8. 公共 静的byte[] encryptSHA(byte[] data)は例外をスローします{
  9.    
  10. MessageDigest sha = MessageDigest.getInstance(KEY_SHA);
  11. sha.update (データ);
  12.    
  13. sha.digest()を返します
  14.    
  15. }
  16. }

HMAC

HMAC(ハッシュメッセージ認証コード、ハッシュメッセージ認証コード、キーハッシュアルゴリズムに基づく認証プロトコル。メッセージ認証コードの原理は、公開関数とキーを使用して固定長の値を認証識別子として生成し、この識別子を使用してメッセージの整合性を識別することです。キーを使用して固定サイズの小さなデータブロック、つまりMACを生成し、それをメッセージに追加して送信します。受信者は、送信者と共有したキーを使用して認証などを行います。

暗号化ツールのクラスは次のとおりです。

  1. /**
  2. * HMACキーを初期化する
  3. *
  4. * @戻る  
  5. * @例外をスローします
  6. */
  7. 公共 静的文字列 initMacKey() は例外をスローします {
  8. キージェネレーター keyGenerator = KeyGenerator.getInstance(KEY_MAC);
  9.    
  10. 秘密キー secretKey = keyGenerator.generateKey();
  11. encryptBASE64(secretKey.getEncoded())を返します
  12. }
  13.    
  14. /**
  15. * HMAC暗号化
  16. *
  17. * @param データ
  18. * @paramキー  
  19. * @戻る  
  20. * @例外をスローします
  21. */
  22. 公共 静的byte[] encryptHMAC(byte[] data, String key )は例外をスローします {
  23.    
  24. SecretKey secretKey = new SecretKeySpec(decryptBASE64( key ), KEY_MAC);
  25. Mac mac = Mac.getInstance(secretKey.getAlgorithm());
  26. mac.init(秘密キー);
  27.    
  28. mac.doFinal(data)を返します
  29.    
  30. }
  • 双方向暗号化
  • 双方向暗号化は可逆暗号化とも呼ばれ、暗号文が生成された後、必要に応じて平文に復号化できることを意味します。双方向暗号化は、対称暗号化と非対称暗号化に分けられます。

対称暗号化アルゴリズム

対称暗号化アルゴリズムは、成熟した技術を備えた初期の暗号化アルゴリズムです。対称暗号化アルゴリズムでは、データ送信者は、特別な暗号化アルゴリズムを使用して平文(元のデータ)と暗号化キーを一緒に処理し、複雑に暗号化された暗号文に変換して送信します。対称暗号化アルゴリズムでは、使用されるキーは 1 つだけであり、送信者と受信者の両方がこのキーを使用してデータを暗号化および復号化するため、復号化側は事前に暗号化キーを知っている必要があります。対称暗号化アルゴリズムの特徴は、8 つのアルゴリズムの公開、計算量が少ない、暗号化速度が速い、暗号化効率が高いなどです。欠点は、取引の両当事者が同じキーを使用するため、セキュリティが保証されないことです*。対称暗号化アルゴリズムは、主にキー管理が難しく、使用コストが高いため、分散ネットワーク システムで使用するのは困難です。

データ暗号化プロセス: 対称暗号化アルゴリズムでは、データ送信者はプレーンテキスト (元のデータ) と暗号化キーに対して特別な暗号化処理を実行し、送信用の複雑な暗号化された暗号文を生成します。

データ復号化プロセス: データ受信者が暗号文を受け取った後、元のデータを読みたい場合は、暗号化キーと同じアルゴリズムの逆アルゴリズムを使用して暗号化された暗号文を復号化し、読み取り可能な平文に戻す必要があります。

一般的なアルゴリズム: DES、3DES、AES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、Skipjack など。以下では、主に一般的に使用される DES、3DES、AES 暗号化アルゴリズムについて説明します。


DES暗号化アルゴリズム

DES 暗号化アルゴリズムは、64 ビットのブロックでデータを暗号化するブロック暗号です。キーの長さは 56 ビットで、暗号化と復号化に同じアルゴリズムが使用されます。 DES 暗号化アルゴリズムは、暗号化アルゴリズムと復号化アルゴリズムを含むアルゴリズムを公開しながら、キーを秘密に保ちます。この方法では、送信者と同じキーを持つ人だけが、DES 暗号化アルゴリズムによって暗号化された暗号文データを復号化できます。したがって、DES 暗号化アルゴリズムを解読することは、実際にはキーのエンコードを検索することです。 56 ビットのキーの場合、網羅的な検索を使用すると、操作回数は 256 回になります。

コンピュータ システムの機能が進歩するにつれて、DES のセキュリティは最初に登場したときよりも大幅に弱くなりましたが、実用的かつ非クリティカルな観点からは、依然として十分であると考えられます。ただし、DES は現在、古いシステムの認証にのみ使用されており、暗号化標準として選択されることが多くなってきています。

暗号化ツールのクラスは次のとおりです。

  1. /**
  2. * 暗号化
  3. *
  4. * @param 暗号化するデータソースデータ
  5. * @paramキー 
  6. * @returnバイト配列
  7. */
  8. 公共  static byte[] enCrypto(byte[] datasource, String key ) は InvalidKeyException、NoSuchAlgorithmException、InvalidKeySpecException、NoSuchPaddingException、BadPaddingException、IllegalBlockSizeException をスローします {
  9.  
  10. SecureRandom ランダム = 新しい SecureRandom();
  11. DESKeySpec desKey = 新しい DESKeySpec( key .getBytes());
  12. // キーファクトリーを作成し、それを使用してDESKeySpecを
  13. SecretKeyFactory の keyFactory = SecretKeyFactory.getInstance( "DES" );
  14. 秘密キー securekey = keyFactory.generateSecret(desKey);
  15. // Cipherオブジェクトは実際に暗号化操作を完了します
  16. 暗号 cipher = Cipher.getInstance( "DES" );
  17. // Cipherオブジェクトをキーで初期化する
  18. cipher.init(Cipher.ENCRYPT_MODE、セキュアキー、ランダム);
  19. // 次にデータを取得して暗号化します
  20. //暗号化操作を正式に実行する
  21. cipher.doFinal(データソース)を返します
  22.  
  23. }

3DES暗号化アルゴリズム

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

3DES は、DES から AES に移行する暗号化アルゴリズムです。暗号化アルゴリズムの具体的な実装は次のとおりです。Ek() と Dk() は DES アルゴリズムの暗号化プロセスと復号化プロセスを表し、K は DES アルゴリズムで使用されるキーを表し、M は平文を表し、C は暗号文を表します。暗号化プロセスは次の通り: C=Ek3(Dk2(Ek1(M)))

暗号化ツールのクラスは次のとおりです。

  1. /**
  2. * 方式の説明: 3DES暗号化
  3. *
  4. * @param plainText プレーンテキスト
  5. * @param secretKey キー
  6. * @param iv 暗号化ベクトル
  7. * @return文字列暗号文
  8. * @例外をスローします
  9. */
  10. 公共 静的文字列エンコード(文字列プレーンテキスト、文字列シークレットキー、文字列iv)
  11. 例外をスローします {
  12. キーdeskey = null ;
  13. DESedeKeySpec 仕様 = 新しい DESedeKeySpec(secretKey.getBytes());
  14. SecretKeyFactory キーファクトリー = SecretKeyFactory.getInstance( "desede" );
  15. デスクキー = keyfactory.generateSecret(spec);
  16. 暗号 cipher = Cipher.getInstance( "desede/CBC/PKCS5Padding" );
  17. IvParameterSpec ips = 新しい IvParameterSpec(iv.getBytes());
  18. cipher.init(Cipher.ENCRYPT_MODE、deskey、ips);
  19. byte[] encryptData = cipher.doFinal(plainText.getBytes(encoding));
  20. Base64.encode(encryptData)を返します
  21. }

AES暗号化アルゴリズム

AES 暗号化アルゴリズムは、暗号学における高度な暗号化標準です。暗号化アルゴリズムは対称ブロック暗号システムを使用します。サポートされる最小キー長は 128、192、256 で、ブロック長は 128 ビットです。このアルゴリズムは、さまざまなハードウェアおよびソフトウェアに簡単に実装できます。この暗号化アルゴリズムは、米国連邦政府が採用したブロック暗号化標準です。この標準は、元の DES に代わるものです。多くの関係者によって分析されており、世界中で広く使用されています。

AES 暗号化アルゴリズムは、128/192/256 ビット (/32=nb) のデータ ブロック サイズ (つまり、パケット長) と、128/192/256 ビット (/32=nk) のパスワード長をサポートするように設計されています。これは、10 進数で 34×1038、62×1057、および 1.1×1077 のキーに相当します。

暗号化ツールのクラスは次のとおりです。

  1. /**
  2. * AES暗号化
  3. * @param data 暗号化する文字列
  4. * @param key暗号化キー 
  5. * @param iv パスワード暗号化アルゴリズムのIV
  6. * @return暗号化された文字列
  7. */
  8. 公共 静的文字列暗号化(文字列データ、文字列キー、文字列iv) {
  9. 試す {
  10.   
  11. 暗号 cipher = Cipher.getInstance( "AES/CBC/NoPadding" );
  12. intブロックサイズ = cipher.getBlockSize();
  13. byte[] dataBytes = data.getBytes();
  14. intプレーンテキストの長さ = dataBytes.length;
  15. if (プレーンテキストの長さ % ブロックサイズ != 0) {
  16. プレーンテキストの長さ = プレーンテキストの長さ + (ブロックサイズ - (プレーンテキストの長さ % ブロックサイズ));
  17. }
  18. byte[] プレーンテキスト = 新しい byte[プレーンテキストの長さ];
  19. System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);
  20. SecretKeySpec キースペック = 新しい SecretKeySpec(キー.getBytes(), Constant.STRING_AES);
  21. IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes(Constant.STRING_UTF_8));
  22. cipher.init(Cipher.ENCRYPT_MODE、キー仕様、ivspec);
  23. byte[] 暗号化 = cipher.doFinal(プレーンテキスト);
  24. String encrypt = Base64.getEncoder().encodeToString(encrypted); //BASE64 暗号化
  25. encrypt = encrypt.replaceAll(新しい文字列(Constant.STRING_CARRIAGE_RETURN), Constant.STRING_BLANK);
  26. encrypt = encrypt.replaceAll(新しい文字列(Constant.STRING_LINE_FEED), Constant.STRING_BLANK);
  27. 暗号化を返します
  28. } キャッチ (例外 e) {
  29. e.printStackTrace();
  30. 戻る ヌル;
  31. }
  32. }

対称暗号化アルゴリズムの比較

非対称暗号化アルゴリズム

非対称暗号化アルゴリズムでは、公開鍵と秘密鍵という、完全に異なるが完全に一致する 2 つの鍵のペアが使用されます。非対称暗号化アルゴリズムを使用してファイルを暗号化する場合、プレーンテキストの暗号化および復号化プロセスは、一致する公開キーと秘密キーのペアを使用することによってのみ完了できます。非対称暗号化アルゴリズムを使用する場合、送信者と受信者が通信する前に、受信者はランダムに生成された公開鍵を送信者に送信し、秘密鍵を自分で保持する必要があります。非対称アルゴリズムには 2 つのキーがあるため、分散システムでのデータ暗号化に特に適しています。広く使用されている非対称暗号化アルゴリズムには、RSA アルゴリズムや米国国立標準技術局が提案した DSA などがあります。非対称暗号化アルゴリズムに基づく暗号化技術が広く使用されています。

ワークフロー:

1. 当事者 B は鍵のペア(公開鍵と秘密鍵)を生成し、公開鍵を他の当事者に公開します。

2. 公開鍵を取得した当事者Aは、その鍵を使用して機密情報を暗号化し、当事者Bに送信します。

3. 次に、当事者 B は、自身が保持する別の専用キー (秘密鍵) を使用して、暗号化された情報を復号化します。当事者 B は、対応する公開鍵によって暗号化された情報を復号化するために、専用の鍵 (秘密鍵) のみを使用できます。

送信プロセス中に、攻撃者が送信された暗号文を傍受して B の公開鍵を入手したとしても、暗号文を解読できるのは B の秘密鍵だけなので、暗号文を解読することはできません。

同様に、B が A に暗号化されたメッセージを返信する場合、A はまず暗号化のために A の公開鍵を B に公開し、復号化のために A の秘密鍵を保持する必要があります。

RSA暗号化アルゴリズム

RSA 暗号化アルゴリズムは現在最も影響力のある公開鍵暗号化アルゴリズムであり、最も優れた公開鍵方式の 1 つとして広く認められています。 RSA は、暗号化とデジタル署名の両方に使用できる最初のアルゴリズムです。これまでに知られているすべての暗号化攻撃に抵抗することができ、公開鍵データ暗号化標準として ISO によって推奨されています。 RSA 暗号化アルゴリズムは、数論の非常に単純な事実に基づいています。つまり、2 つの大きな素数を掛け合わせるのは非常に簡単ですが、その積を因数分解するのは非常に難しいため、その積を暗号化キーとして公開することができます。

暗号化ツールのクラスは次のとおりです。

  1. /**
  2. * RSA公開鍵暗号化
  3. *
  4. * @param str 暗号化された文字列
  5. * @param publicKey 公開鍵
  6. * @return暗号文
  7. * @throws Exception 暗号化中の例外情報
  8. */
  9. 公共 静的文字列暗号化(文字列str、文字列publicKey)は例外をスローします{
  10. //base64エンコードされた公開鍵
  11. デコードされたバイト[] = Base64.decodeBase64(publicKey);
  12. RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance( "RSA" ).generatePublic(新しい X509EncodedKeySpec(デコード済み));
  13. //RSA暗号化
  14. 暗号 cipher = Cipher.getInstance( "RSA" );
  15. 暗号を初期化します(Cipher.ENCRYPT_MODE、pubKey);
  16. 文字列 outStr = Base64.encodeBase64String(cipher.doFinal(str.getBytes( "UTF-8" )));
  17. outStr を返します
  18. }

DSA暗号化アルゴリズム

DSA は整数の有限体上の離散対数問題に基づいており、そのセキュリティは RSA に匹敵します。 DSA の重要な特徴は、2 つの素数が公開されているため、他人の p と q を使用する場合、秘密鍵を知らなくても、それらがランダムに生成されたものか、改ざんされたものかを確認できることです。 RSA アルゴリズムではこれができません。 DSA は単なるアルゴリズムです。RSA との違いは、暗号化と復号化には使用できず、キー交換も実行できないことです。署名にのみ使用されます。RSA よりもはるかに高速です。

暗号化プロセスは次のとおりです。


ECC暗号化アルゴリズム

楕円暗号 (ECC) は、1985 年に Koblitz と Miller によって初めて提案された公開鍵暗号化システムです。その数学的基礎は、楕円曲線上の有理点を使用したアーベル加法群上の楕円離散対数の計算の難しさにあります。公開鍵暗号システムは、一般に、基盤となる問題に応じて、大きな整数の因数分解問題、離散対数問題、楕円曲線問題の 3 つのカテゴリに分類されます。楕円曲線は離散対数とグループ化されることがあります。楕円曲線暗号システムは、現在知られている公開鍵システムの中で、ビットあたりの暗号化強度が最も高いシステムです。楕円曲線上の離散対数問題を解くための最良のアルゴリズムは、時間の計算量が で、完全に指数関数的なポラード ロー法です。

暗号化ツールのクラスは次のとおりです。

  1. /**
  2. * 暗号化
  3. * @param データ
  4. * @param 公開キー
  5. * @戻る 
  6. * @例外をスローします
  7. */
  8. 公共 静的byte[]暗号化(byte[]データ、String公開鍵)
  9. 例外をスローします {
  10. byte[] keyBytes = BASE64Decoder.decodeBuffer(publicKey);
  11.   
  12. X509EncodedKeySpec x509KeySpec = 新しい X509EncodedKeySpec(keyBytes);
  13. KeyFactory は KeyFactory.getInstance(ECCEnum.ALGORITHM.value()) に格納されます。
  14.   
  15. ECPublicKey pubKey = (ECPublicKey) キーファクトリー
  16. .generatePublic(x509KeySpec);
  17.   
  18. 暗号 cipher = new NullCipher();
  19. 暗号を初期化します(Cipher.ENCRYPT_MODE、pubKey);
  20. cipher.doFinal(data)を返します
  21. }

非対称暗号化アルゴリズムの比較


要約する

対称暗号化と非対称暗号化の比較

実用例:

非対称暗号化アルゴリズムを使用して対称アルゴリズムのキーを管理し、対称暗号化アルゴリズムでデータを暗号化すると、暗号化速度が向上し、復号化のセキュリティが実現します。

RSAでは1024ビット、ECCでは160ビット、AESでは128ビットの使用が推奨されています。

その他の比較:

管理の観点では、公開鍵暗号化アルゴリズムは目標を達成するために必要なリソースが少なく、鍵配布の観点では、両者の違いは指数レベルです (一方が n で、もう一方が n2)。したがって、公開鍵暗号化アルゴリズムは広域ネットワークでの使用には適しておらず、さらに重要なことに、デジタル署名をサポートしていません。

セキュリティの観点では、公開鍵暗号化アルゴリズムは未解決の数学的な問題に基づいているため、解読することはほぼ不可能です。秘密鍵暗号化アルゴリズムの場合、AES は理論的には解読不可能ですが、コンピュータ開発の観点からは解読可能です。公開鍵の方が有利です。

<<:  フロントエンドアルゴリズムシステム演習:リンクリストの章が完了

>>:  自動運転は自動車産業の未来だが、これはドライバーが手を完全に自由にできることを意味するものではない。

ブログ    

推薦する

OpenAIがChatGPTをアップデート:画像と音声入力をサポート

最近、OpenAI は ChatGPT の新バージョンのリリースを発表し、音声入力と画像入力という ...

初心者のためのディープラーニングの10,000語レビュー

論文: ディープラーニングの最近の進歩: 概要論文アドレス: https://arxiv.org/p...

2020年の世界産業用ロボット業界の現在の市場状況と競争環境の分析

2020年の世界産業用ロボット産業の現状と競争環境の分析:アジア太平洋地域が世界最大の市場に1. 世...

...

...

AIがバリアフリー時代へ:手話認識・翻訳の応用が意味するものとは?

人々の印象では、AIは「多数派」に属する技術カテゴリーであると私は信じています。いわゆる多数とは、第...

5G悪報セキュリティ管理プラットフォームにおけるディープラーニングに基づくテキスト感情認識技術の応用

著者: Sun Yue、所属部署: 中国移動 (杭州) 情報技術有限公司 | 中国移動杭州 R&am...

なぜドローンが5Gの商用利用の第一選択肢なのでしょうか?その理由はこの3点です!

近年、私たちの生活におけるドローンの応用はますます一般的になっています。当初は軍事分野でしたが、その...

Aスターアルゴリズムの実装手順のJavaバージョン

スターアルゴリズムの手順: 1. 最初に、オープン リストに開始点を追加します。 2. オープンリス...

...

反論: AIに急いで取り組むべきではない5つの理由

[51CTO.com クイック翻訳] 今日、人工知能はもはやSFの中の漠然とした概念ではなく、私たち...

8つの一般的な確率分布の式と視覚化

現実の世界には、本質的に統計的であると考えられる現象がいくつかあります (気象データ、売上データ、財...

...

非人道的だ!人工知能はソーシャルエンジニアリングの天敵である

人工知能 (AI) はまだ初期段階ですが、AI は急速に企業が自らを守るための重要な手段になりつつあ...