Java における 4 つの基本的な暗号化アルゴリズムの分析

Java における 4 つの基本的な暗号化アルゴリズムの分析

シンプルな Java 暗号化アルゴリズムは次のとおりです。

  1. 厳密に言えば、BASE64 は暗号化アルゴリズムではなく、エンコード形式です。
  2. MD5 (メッセージダイジェストアルゴリズム5)
  3. SHA (セキュアハッシュアルゴリズム)
  4. HMAC (ハッシュメッセージ認証コード)

[[137564]]

1. BASE64

Base64 は、インターネット上で 8 ビットバイトコードを伝送するための最も一般的なエンコード方式の 1 つです。MIME の詳細な仕様については、RFC2045 ~ RFC2049 を参照してください。 HTTP 環境でより長い識別情報を送信するには、Base64 エンコーディングを使用できます。たとえば、Java Persistence システムの Hibernate では、Base64 を使用して、より長い一意の識別子 (通常は 128 ビットの UUID) を文字列にエンコードし、HTTP フォームや HTTP GET URL のパラメータとして使用します。他のアプリケーションでは、バイナリ データを URL に配置するのに適した形式 (非表示のフォーム フィールドを含む) にエンコードする必要があることがよくあります。現時点では、Base64 エンコードは判読不可能であり、エンコードされたデータを肉眼で直接見ることはできません。 (出典:百度百科事典)

Java実装コード:

パッケージ com.cn.一方向暗号化;

sun.misc.BASE64Decoder をインポートします。
sun.misc.BASE64Encoder をインポートします。
/*
BASE64 暗号化と復号化は双方向であり、逆も可能です。
BASE64Encoder と BASE64Decoder は非公式の JDK 実装クラスです。 JDK では見つかり、使用できますが、API では見つかりません。
JRE の sun および com.sun で始まるパッケージ内のクラスはドキュメント化されていません。これらは java および javax クラス ライブラリの基礎であり、その実装のほとんどは基礎となるプラットフォームに関連しています。
一般的に言えば、それは推奨されません。 
厳密に言えば、BASE64 は暗号化アルゴリズムではなくコーディング形式です。主に BASE64Encoder と BASE64Decoder の 2 つのクラスで構成されます。必要なのは、対応するメソッドの使い方だけです。
また、BASE暗号化後に生成されるバイト数は8の倍数です。足りない場合は=記号で埋められます。 
BASE64 
RFC2045 の定義によると、Base64 は次のように定義されています: Base64 コンテンツ転送エンコーディングは、人間が直接認識しにくい形式で 8 ビット バイトのシーケンスを記述するように設計されています。
(Base64 コンテンツ転送エンコーディングは、人間が判読する必要のない形式で任意のオクテットのシーケンスを表すように設計されています。) 
これは電子メールや http 暗号化では一般的です。http 情報を傍受すると、ログイン操作のユーザー名とパスワードのフィールドが BASE64 を使用して暗号化されていることがわかります。
*/

パブリッククラス BASE64 {
    /**  
     * BASE64復号化 *   
     * @param キー  
     * @戻る  
     * @例外をスローします  
     */  
    パブリック静的byte[] decryptBASE64(String key)は例外をスローします{   
        (新しい BASE64Decoder()).decodeBuffer(key) を返します。   
    }   

    /**  
     *BASE64暗号化*   
     * @param キー  
     * @戻る  
     * @例外をスローします  
     */  
    パブリック静的文字列encryptBASE64(byte[] key)は例外をスローします{   
        (新しい BASE64Encoder()).encodeBuffer(key) を返します。   
    }  

    パブリック静的voidメイン(String[] args) {

     文字列 str="12345678";

        試す {
        文字列結果1 = BASE64.encryptBASE64(str.getBytes());
         System.out.println("result1=====暗号化されたデータ==========="+result1);

         バイト result2[] = BASE64.decryptBASE64(result1);
         文字列 str2 = 新しい文字列 (結果2);
         System.out.println("str2========復号化されたデータ========="+str2);
    } キャッチ (例外 e) {
        e.printStackTrace();
    }

    }

}

2. MD5

MD5 はMessage-Digest Algorithm 5 の略で、情報伝送の整合性と一貫性を確保するために使用されます。コンピュータで広く使われているハッシュアルゴリズム(要約アルゴリズム、ハッシュアルゴリズムとも訳される)の一つで、主流のプログラミング言語ではMD5が一般的に実装されています。ハッシュ アルゴリズムの基本原理は、データ (漢字など) を別の固定長の値に変換することです。MD5 の前身には、MD2、 MD3 、MD4 があります。暗号化および復号化技術で広く使用されており、ファイルの検証によく使用されます。チェック?ファイルのサイズに関係なく、MD5 を実行すると一意の MD5 値を生成できます。たとえば、現在の ISO 検証はすべて MD5 検証です。使い方は?もちろん、MD5 値は ISO を MD5 に渡すことによって生成されます。通常、Linux-ISO をダウンロードした友人は、ダウンロード リンクの横に MD5 文字列が表示されていることを確認済みです。ファイルの整合性を確認するために使用されます。

Java実装:

パッケージ com.cn.一方向暗号化;

java.math.BigInteger をインポートします。
java.security.MessageDigest をインポートします。
/*
MD5 (メッセージダイジェストアルゴリズム5) 
通常、上記の MD5 暗号化を直接使用することはありません。通常、MD5によって生成されたバイト配列は、BASE64に渡されてさらに暗号化され、対応する文字列ダイジェスト: アセンブリ*/ を取得します。
パブリッククラスMD5 {
    パブリック静的最終文字列 KEY_MD5 = "MD5";   

    パブリック静的文字列 getResult(文字列 inputStr)
    {
        System.out.println("=======暗号化前のデータ:"+inputStr);
        BigInteger bigInteger=null;

        試す {
         メッセージダイジェスト md = MessageDigest.getInstance(KEY_MD5);   
         バイト[] inputData = inputStr.getBytes(); 
         md.update(入力データ);   
         bigInteger = 新しい BigInteger(md.digest());   
        } 例外 e をキャッチします {e.printStackTrace();}
        System.out.println("MD5暗号化後: " + bigInteger.toString(16));   
        bigInteger.toString(16) を返します。
    }

    パブリック静的void main(String args[])
    {
        試す {
             文字列 inputStr = "シンプルな暗号化 888888888888888888888";   
             入力文字列を取得します。
        } キャッチ (例外 e) {
            e.printStackTrace();
        }

    }

}

MD5 アルゴリズムには次の特性があります。

1. 圧縮: 任意の長さのデータに対して、計算された MD5 値の長さは固定されます。
2. 計算が簡単: 元のデータから MD5 値を計算するのは簡単です。
3. 改ざん防止: 元のデータに変更を加えると、たとえ 1 バイトだけ変更されたとしても、取得される MD5 値に大きな違いが生じます。
4. 弱い衝突防止: 元のデータとその MD5 値がわかっている場合、同じ MD5 値を持つデータ (つまり、偽造されたデータ) を見つけることは非常に困難です。
5. 強力な衝突防止: 同じ MD5 値を持つ 2 つの異なるデータを見つけることは非常に困難です。
MD5 の機能は、デジタル署名ソフトウェアを使用して秘密鍵に署名する前に、大量の情報を機密形式に「圧縮」することです (つまり、任意の長さのバイト文字列を特定の長さの 16 進数字文字列に変換します)。 MD5 の他に、sha-1、RIPEMD、Haval などもよく知られています。

3. SHA

セキュア ハッシュ アルゴリズムは、主にデジタル署名標準 (DSS) で定義されているデジタル署名アルゴリズム (DSA) に適用されます。長さが 2^64 ビット未満のメッセージの場合、SHA1 は 160 ビットのメッセージ ダイジェストを生成します。このアルゴリズムは、暗号化の専門家による長年の開発と改良を経て、ますます完成度が高まり、広く使用されるようになりました。このアルゴリズムの考え方は、平文を受け取り、それを不可逆な方法で(通常はより小さい)暗号文に変換することです。これは、入力コードの文字列(事前マッピングまたは情報と呼ばれる)を取得し、それをより短い固定ビット数の出力シーケンス、つまりハッシュ値(メッセージダイジェストまたは情報認証コードとも呼ばれる)に変換するプロセスとして簡単に理解することもできます。ハッシュ関数の値は平文の「指紋」や「要約」とも言えるため、ハッシュ値のデジタル署名は平文のデジタル署名とみなすことができます。

Java実装:

パッケージ com.cn.一方向暗号化;

java.math.BigInteger をインポートします。
java.security.MessageDigest をインポートします。

/*
SHA(セキュアハッシュアルゴリズム)、デジタル署名、暗号化アプリケーションにおけるその他の重要なツール、
電子商取引などの情報セキュリティ分野で広く利用されています。 SHAとMD5は衝突法によって解読されているが、 
しかし、SHAは依然として安全な暗号化アルゴリズムとして認識されており、MD5よりも安全です*/
パブリッククラスSHA {
     パブリック静的最終文字列 KEY_SHA = "SHA";   

    パブリック静的文字列 getResult(文字列 inputStr)
    {
        BigInteger sha =null;
        System.out.println("=======暗号化前のデータ:"+inputStr);
        バイト[] inputData = inputStr.getBytes();   
        試す {
             メッセージダイジェスト messageDigest = MessageDigest.getInstance(KEY_SHA);  
             メッセージダイジェストを更新します(入力データ)。
             sha = 新しい BigInteger(messageDigest.digest());   
             System.out.println("SHA暗号化後: " + sha.toString(32));   
        } 例外 e をキャッチします {e.printStackTrace();}
        sha.toString(32)を返します。
    }

    パブリック静的void main(String args[])
    {
        試す {
             文字列 inputStr = "単純な暗号化";   
             入力文字列を取得します。
        } キャッチ (例外 e) {
            e.printStackTrace();
        }

    }

}

SHA-1とMD5の比較

どちらも MD4 から派生しているため、SHA-1 と MD5 は非常によく似ています。したがって、それらの強度やその他の特性は似ていますが、いくつかの違いがあります。
l ブルートフォース攻撃に対するセキュリティ: 最も重要で大きな違いは、SHA-1 ダイジェストが MD5 ダイジェストよりも 32 ビット長いことです。ブルートフォース手法を使用すると、特定のメッセージのダイジェストと等しいダイジェストを持つメッセージを生成することの難しさは、MD5 の場合は 2^128 操作のオーダー、SHA-1 の場合は 2^160 操作のオーダーになります。したがって、SHA-1 はブルート フォース攻撃に対してより堅牢です。
l 暗号解読に対するセキュリティ: 設計上、MD5 は暗号解読攻撃に対して脆弱ですが、SHA-1 はそのような攻撃に対して脆弱ではありません。
l 速度: 同じハードウェア上では、SHA-1 は MD5 よりも遅く実行されます。

4.HMAC

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

Java実装コード:

パッケージ com.cn.一方向暗号化;
/*
HMAC 
HMAC (ハッシュ メッセージ認証コード、ハッシュ メッセージ認証コード、キーベースのハッシュ アルゴリズムに基づく認証プロトコル)。
メッセージ認証コードの原理は、公開関数とキーを使用して固定長の値を認証識別子として生成し、この識別子を使用してメッセージの整合性を識別することです。
キーを使用して、固定サイズの小さなデータ ブロックを生成します。
つまり、MAC であり、メッセージを送信する前にメッセージに追加します。受信者は、送信者と共有したキーを認証などの目的で使用します。 */
javax.crypto.KeyGenerator をインポートします。
javax.crypto.Mac をインポートします。
javax.crypto.SecretKey をインポートします。
javax.crypto.spec.SecretKeySpec をインポートします。

com.cn.comm.Tools をインポートします。

/**  
 * 基本的な暗号化コンポーネント */  
パブリック抽象クラス HMAC {   
    パブリック静的最終文字列 KEY_MAC = "HmacMD5";   

    /**  
     * HMACキーを初期化する *   
     * @戻る  
     * @例外をスローします  
     */  
    パブリック静的文字列 initMacKey() 例外をスローします {   
        キージェネレーター keyGenerator = KeyGenerator.getInstance(KEY_MAC);   
        秘密キー secretKey = keyGenerator.generateKey();   
        BASE64.encryptBASE64(secretKey.getEncoded()) を返します。   
    }   

    /**  
     * HMAC暗号化:主な方法 *   
     * @param データ  
     * @param キー  
     * @戻る  
     * @例外をスローします  
     */  
    パブリック静的文字列encryptHMAC(byte[]データ、文字列キー)は例外をスローします{   

        SecretKey secretKey = new SecretKeySpec(BASE64.decryptBASE64(key), KEY_MAC);   
        Mac mac = Mac.getInstance(secretKey.getAlgorithm());   
        mac.init(秘密キー);   
        新しい文字列(mac.doFinal(data))を返します。   

    }   

    パブリック静的文字列 getResult1(文字列 inputStr)
    {
        文字列パス=Tools.getClassPath();
        文字列 fileSource=path+"/file/HMAC_key.txt";
        System.out.println("=======暗号化前のデータ:"+inputStr);
        文字列結果=null;
        試す {
            バイト[] inputData = inputStr.getBytes(); 
            文字列 key = HMAC.initMacKey(); /*キーを生成*/  
            System.out.println("Mac キー: ===" + キー);  
            /*キーをファイルに書き込む*/
            Tools.WriteMyFile(ファイルソース、キー);
            結果 = HMAC.encryptHMAC(入力データ、キー);
            System.out.println("HMAC 暗号化後: ===" + 結果); 
        } 例外 e をキャッチします {e.printStackTrace();}  
       結果.toString() を返します。
    }

    パブリック静的文字列 getResult2(文字列 inputStr)
    {
        System.out.println("=======暗号化前のデータ:"+inputStr);
         文字列パス=Tools.getClassPath();
         文字列 fileSource=path+"/file/HMAC_key.txt";
         文字列キー=null;;
        試す {
             /*ファイルからキーを読み取ります*/
             キー=Tools.ReadMyFile(fileSource);
             System.out.println("getResult2 キー: ===" + キー);  
        } キャッチ (例外 e1) {
            e1.printStackTrace();}
        文字列結果=null;
        試す {
            バイト[] inputData = inputStr.getBytes();  
            /*データを暗号化する*/
            結果 = HMAC.encryptHMAC(入力データ、キー);
            System.out.println("HMAC 暗号化後: ===" + 結果); 
        } 例外 e をキャッチします {e.printStackTrace();}  
       結果.toString() を返します。
    }

    パブリック静的void main(String args[])
    {
        試す {
             文字列 inputStr = "単純な暗号化"; 
             /*同じキーを使用してデータを暗号化し、2つの暗号化の結果が同じかどうかを確認します*/
             結果1を取得します(入力文字列); 
             結果2を取得します(入力文字列);

        } キャッチ (例外 e) {
            e.printStackTrace();
        }

    }

} 

<<:  いくつかの典型的なアルゴリズム面接の質問に対する Java ソリューション

>>:  Appleがニュース編集者を雇っているにもかかわらず、アルゴリズムがあなたが読むものを決定する

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

洪水の知らせを聞いたらすぐに行動を起こしましょう!ロボットは風と波の守護者となることを目指す

災害に直面して、すべての関係者が行動を起こした。人民解放軍部隊が被災者の救出に派遣されているとみられ...

人工知能教師向けの類似質問の作成

類似の質問とは何ですか? また、なぜ類似の質問を書く必要があるのですか?類似質問はロボット教育を改善...

2021 年に知っておくべきすべての機械学習アルゴリズム

機械学習に関する知識が増えるにつれて、機械学習アルゴリズムの数も増えました。この記事では、データ サ...

...

ジェミニはソラの動画がAI生成だと一目でわかるのか?数百万のトークンのコンテキスト機能がGPT-4を圧倒

Google Gemini 1.5 が、その見出しをさらった「犯人」であるSoraと出会ったら何が起...

RDA を使用してデータの問題を解決し、AIOps の実装を加速する方法

【51CTO.com クイック翻訳】ロボティックデータオートメーション (RDA) とは?ロボティッ...

Appleは、来年の製品発売を目標に、独自の大規模モデルフレームワークをベースにしたApple GPTを秘密裏に開発していると噂されている。

Apple の大規模言語モデルと AI チャットボットに関する最新ニュースが届きました。本日、ブル...

北京大学のチームは、ChatGPTにとって頭痛の種であったアルゴリズムの最適化を解決し、普通のラップトップでも実行できるようにした。

ChatGPT ですら首をかしげたアルゴリズムの最適化は、北京大学のチームによって達成されました。...

...

飛行、地中への潜水、海への潜水も可能な多機能ソフトロボット

2月10日のニュース(劉亜珠)最近、科学者たちは変形して運転、飛行、水泳ができる新しい「ソフト」ロボ...

ユーザーエクスペリエンスは過去のものになりました。AIは国民、さらには社会の視点から問題を考える必要があります。

今日、テクノロジーの巨人とその AI ベースのデジタル プラットフォームおよびソリューションは、世界...

2021年に購入すべき珍しいAIホーム製品

これらの AI 搭載ガジェットはあなたの家をスマートにします。 『2001年宇宙の旅』の全知全能のH...

2023年に人工知能を学ぶべき主な理由

テクノロジーとイノベーションがダイナミックに変化する中、人工知能 (AI) の研究は学生や専門家にと...

おそらく2030年までに、量子コンピューティングのChatGPTの瞬間が到来するだろう

2030 年までに RSA 暗号を解読できるマシンが登場するでしょうが、まずは量子センシングやその他...

インタビュアー: 「最後にアルゴリズムを書いてください。単一のリンクリストを使用して加算を実行してみましょう...」

[[286163]]質問: 空でない 2 つのリンク リストが与えられた場合、2 つの負でない整数...