対称暗号化アルゴリズムは、成熟したテクノロジーを備えた初期の暗号化アルゴリズムです。対称暗号化アルゴリズムでは、データ送信者は平文(元のデータ)と暗号化キー(mi yue)を特別な暗号化アルゴリズムで処理し、複雑な暗号化暗号文に変換して送信します。受信者が暗号文を受け取った後、元のテキストを解読したい場合は、暗号化に使用したキーと、同じアルゴリズムの逆アルゴリズムを使用して暗号文を復号し、読み取り可能な平文に戻す必要があります。対称暗号化アルゴリズムでは、送信者と受信者の両方がこのキーを使用してデータを暗号化および復号化します。これには、復号化者が事前に暗号化キーを知っている必要があります。
単純な Java 暗号化アルゴリズムは次のとおりです。
厳密に言えば、BASE はエンコード形式であり、暗号化アルゴリズムではありません
MD (メッセージ ダイジェスト アルゴリズム、メッセージ ダイジェスト アルゴリズム)
SHA (セキュア ハッシュ アルゴリズム、セキュア ハッシュ アルゴリズム)
HMAC(ハッシュメッセージ認証コード、ハッシュメッセージ認証コード)
タイプ1.ベース
Base は、インターネット上でビット バイト コードを送信するための最も一般的なエンコード方式の 1 つです。MIME の詳細な仕様が記載されている RFC ~ RFC を参照できます。基本エンコーディングを使用すると、HTTP 環境でより長い識別情報を伝達できます。たとえば、Java Persistence システム Hibernate では、Base を使用して長い固有の識別子 (通常は -bit UUID) を文字列にエンコードし、HTTP フォームおよび HTTP GET URL のパラメーターとして使用されます。他のアプリケーションでは、バイナリ データを URL (非表示のフォーム フィールドを含む) 内に配置するのに適した形式にエンコードする必要があることがよくあります。現時点では、Base エンコーディングは読み取ることができません。つまり、エンコードされたデータは肉眼で直接見ることができません。 (出典: 百度百科事典)
Java実装コード:
package com.cn. import sun.misc.BASEDecoder; import sun.misc.BASEEncoder;/*BASE 暗号化と復号化は非公式の JDK 実装です。クラス。 JDK では見つけて使用できますが、API では見つけられません。 JRE の sun および com.sun で始まるクラスは文書化されていません。これらは java および javax クラス ライブラリの基礎に属しており、その実装のほとんどは基礎となるプラットフォームに関連しているため、一般的には推奨されません。厳密に言えば、BASE はエンコード形式ですが、非暗号化アルゴリズムには主に BASEEncoder と BASEDecoder の 2 つのクラスが含まれており、対応するメソッドの使用方法を知る必要があるだけです。また、BASE暗号化後に生成されるバイト数は の倍数になります。バイト数が足りない場合は=記号で埋めてください。 BASE RFC の定義によれば、Base は次のように定義されています。 Base コンテンツ転送エンコーディングは、人間が直接認識しにくい形式でビットのシーケンスを記述するように設計されています。 (Base Content-Transfer-Encoding は、人間が判読できる必要のない形式で任意のオクテットのシーケンスを表すように設計されています。) 電子メールや http 暗号化でよく見られるのは、http 情報を傍受するときに、ログイン用のユーザー名とパスワードのフィールドが表示されることです。操作はBASE経由で暗号化されます。 */public class BASE { /** * BASE 復号化* * @param key * @return * @throws Exception */ public static byte[] decryptBASE(String key) throws Exception { return (new BASEDecoder()).decodeBuffer(key) ); } /** * BASE 暗号化* * @param key * @return * @throws Exception */ public static String encryptBASE(byte[] key) throws Exception { return (new BASEEncoder()).encodeBuffer(key); } public static void main(String[] args) { String str=""; try { String result= BASE.encryptBASE(str.getBytes()); out.println("result=====暗号化されたデータ=============+result); byte result[]= BASE.decryptBASE(result); str=new String(result); System.out.println("str========復号化されたデータ========"+str); } catch (例外 e) { e.printStackTrace( ); } }}
セカンドタイプ。
MD はメッセージ ダイジェスト アルゴリズム (Message-Digest Algorithm) であり、完全かつ一貫した情報送信を保証するために使用されます。コンピュータで広く使用されているハッシュ アルゴリズムの 1 つです (ダイジェスト アルゴリズムやハッシュ アルゴリズムとも訳され、主流のプログラミング言語で一般的に実装されています)。データ (漢字など) を別の固定長の値に計算することが、ハッシュ アルゴリズムの基本原理です。MD の前身は、MD、MD、および MD です。暗号化および復号化テクノロジで広く使用されており、ファイルの検証によく使用されます。チェック?ファイルがどんなに大きくても、MD の後に一意の MD 値を生成できます。たとえば、現在の ISO キャリブレーションは MD キャリブレーションです。使い方は?もちろん、MD 値は ISO が MD を通過した後に生成されます。 linux-ISO をダウンロードした友人は、通常、ダウンロード リンクの横に MD 文字列を見たことがあるでしょう。ファイルの整合性を確認するために使用されます。
Java実装:
package com.cn. 一方向暗号化; import java.math.BigInteger; import java.security.MessageDigest;/*MD (メッセージ ダイジェスト アルゴリズム、メッセージ ダイジェスト アルゴリズム) 通常、上記の MD 暗号化を直接使用することはありません。通常、MD によって生成されたバイト配列は BASE に渡され、暗号化されて対応する文字列ダイジェストが取得されます。 { System .out.println("========暗号化前のデータ:"+inputStr); try { MessageDigest md = MessageDigest.getInstance(KEY_MD); byte[] inputData = inputStr.getBytes(); md.update(inputData); } catch (Exception e) {e.printStackTrace(); System.out.println("MD 暗号化後:" + bigInteger.toString()); bigInteger.toString(); } public static void main(String args[]) { try { String inputStr = "単純な暗号化"; } catch (Exception e) { e.printStackTrace() }}
MD アルゴリズムには次の特徴があります。
圧縮率: データの長さに関係なく、計算される MD 値の長さは固定されます。
, 計算が簡単:元データからMD値を計算するのは簡単です。
変更耐性: 元のデータに変更が加えられた場合、たとえ 1 バイトだけ変更されたとしても、結果の MD 値は大きく異なります。
, 弱い衝突防止: 元のデータとその MD 値がわかっていると、同じ MD 値を持つデータ (つまり、偽造データ) を見つけるのは非常に困難です。
, 強力な衝突防止: 2 つの異なるデータを見つけて同じ MD 値を持つようにすることは非常に困難です。
MD の機能は、秘密鍵にデジタル署名する前に、大容量の情報を機密形式に「圧縮」できるようにすること (つまり、任意の長さのバイト列を特定の長さの 16 進数の文字列に変換すること) を可能にすることです。署名ソフトウェア。 MD以外にも、sha-、RIPEMD、Havalなどが有名です。
3 番目のタイプ.SHA
セキュア ハッシュ アルゴリズムは、主にデジタル署名標準 DSS で定義されているデジタル署名アルゴリズム DSA に適用されます。長さが ^ ビット未満のメッセージの場合、SHA は 1 ビットのメッセージ ダイジェストを生成します。このアルゴリズムは、暗号化の専門家によって長年にわたって開発および改良され、ますます完成され、広く使用されています。このアルゴリズムの考え方は、平文の一部を受信し、それを不可逆的な方法で (通常はより小さい) 暗号文の一部に変換することです。単純に、入力コードの文字列を取得すること (プリマッピングと呼ばれます) として理解することもできます。または情報)、およびそれらをより短い固定桁の出力シーケンス、つまりハッシュ値(メッセージ ダイジェストまたはメッセージ認証コードとも呼ばれます)に変換するプロセス。ハッシュ関数の値は平文の「フィンガープリント」または「ダイジェスト」と言えるため、ハッシュ値のデジタル署名は平文のデジタル署名とみなすことができます。
Java実装:
パッケージ com.cn; import java.math.BigInteger; import java.security.MessageDigest;/*SHA (セキュア ハッシュ アルゴリズム、安全なハッシュ アルゴリズム)、デジタル署名、および暗号化アプリケーションでのその他の重要なツールが広く使用されています。電子商取引などの情報セキュリティ分野で広く利用されています。 SHA と MD はどちらも衝突手法によって解読されていますが、SHA は依然として安全な暗号化アルゴリズムとして認識されており、MD*/public class SHA { public static Final String KEY_SHA = "SHA"; public static String getResult( String inputStr) よりも安全です。 { BigInteger sha =null; System.out.println("========暗号化前のデータ:"+inputStr); inputStr.getBytes(); try { MessageDigest messageDigest = MessageDigest.getInstance(KEY_SHA); messageDigest.update(inputData); sha = new BigInteger(messageDigest.digest()); sha.toString()); } catch (例外 e) {e.printStackTrace();} return sha.toString(); } public static void main(String args[]) { try { String inputStr = "getResult(inputStr)";
SHA-MDとの比較
どちらも MD から派生したものであるため、SHA- と MD は非常に似ています。同様に、それらの強みやその他の特性は似ていますが、いくつかの違いがあります。
ブルート フォース攻撃に対するセキュリティ: 最も重要かつ重要な違いは、SHA ダイジェストが MD ダイジェストよりも長いことです。ブルート フォース手法を使用すると、ダイジェストが特定のメッセージ ダイジェストと等しいメッセージを生成することは、MD の場合は桁違いの操作であり、SHA- の場合は桁違いの操作になります。このようにして、SHA- はブルート フォース攻撃に対してより強力になります。
暗号解読に対するセキュリティ: MD の設計により、暗号解読攻撃に対して脆弱ですが、SHA- はそのような攻撃に対して脆弱ではないようです。
速度: SHA- は、同じハードウェア上で MD よりも遅く実行されます。
4番目のタイプ.HMAC
HMAC (Hash Message Authentication Code、ハッシュ メッセージ認証コード、キー ハッシュ アルゴリズムに基づく認証プロトコル。認証を実現するためのメッセージ認証コードの原理は、公開関数とキーを使用して認証識別子として固定長の値を生成することです。使用します)これは、キーを使用して固定サイズの小さなデータ ブロック、つまり MAC を生成し、それをメッセージに追加し、認証のために送信者と共有されたキーを使用して送信します。
Java実装コード:
パッケージ com.cn.一方向暗号化;/*HMACHMAC(ハッシュ メッセージ認証コード、ハッシュ メッセージ認証コード、キー ハッシュ アルゴリズムに基づく認証プロトコル メッセージ認証コードの原理は、公開関数とキーを使用して認証識別子として固定長の値を生成し、この識別子を使用してメッセージの完全性を認証することです。メッセージの性別。キーを使用して固定サイズの小さなデータ ブロック、つまり MAC を生成し、それをメッセージに追加して送信します。 */import javax.crypto.KeyGenerator;インポートjavax.crypto.Mac;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;import com.cn.comm.Tools;/** * 基本暗号化コンポーネント*/ public abstract class HMAC { public static Final String KEY_MAC = "HmacMD"; /** * HMAC キーを初期化します* * @return * @throws Exception */ public static String initMacKey() throws Exception { KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC); SecretKey SecretKey = keyGenerator.generateKey(); return BASE.encryptBASE(secretKey.getEncoded()); } /** * HMAC 暗号化: メインメソッド * * @param data * @param key * @return * @throws Exception */ public static String encryptHMAC(byte[] data, String key) throws Exception { SecretKey SecretKey = new SecretKeySpec(BASE.decryptBASE(key), KEY_MAC); Mac mac = Mac.getInstance(secretKey.getAlgorithm()); return new String(mac.doFinal(data)); static String getResult(String inputStr) { String path=Tools.getClassPath(); fileSource=path+"/file/HMAC_key.txt"; System.out.println("========暗号化前のデータ:"+inputStr); getBytes(); String key = HMAC.initMacKey(); /*キーを生成*/ System.out.println("Mac key:===" + key); /*キーをファイルに書き込む*/ Tools.WriteMyFile(fileSource,key); result= HMAC.encryptHMAC(inputData, key); System.out.println("HMAC 暗号化後:===" + result); );} return result.toString(); } public static String getResult(String inputStr) { System.out.println("========暗号化前のデータ:"+inputStr); String path=Tools.getClassPath(); String fileSource=path+"/file/HMAC_key.txt"; ;; try { /*ファイルからキーを読み取ります*/ key=Tools.ReadMyFile(fileSource); System.out.println("getResult key:===" + key); (例外 e) { e.printStackTrace();} String result=null; try { byte[] inputData = inputStr.getBytes(); /*データの暗号化*/ result= HMAC.encryptHMAC(inputData, key); .println("HMAC 暗号化後:=== + result); } catch (Exception e) {e.printStackTrace();} return result.toString(); main(String args[]) { try { String inputStr = "単純な暗号化"; /*同じキーを使用します: データを暗号化します: 2 つの暗号化の結果が同じかどうかを確認します*/ getResult(inputStr); ); } キャッチ (例外 e) { e.printStackTrace() } }
以上の内容は、Javaでよく使われるいくつかの暗号アルゴリズム(4種類)をエディターで共有したものです。