非対称パスワードの概念
1.対称暗号化アルゴリズムとの主な違いは、暗号化と復号化キーが異なり、1つはパブリック(公開キー)、もう1つは機密(秘密鍵)であることです。主に、対称暗号化アルゴリズムの主要な割り当て管理の問題を解決し、アルゴリズムセキュリティを改善します。
2。非対称暗号化アルゴリズムの暗号化と復号化効率は比較的低いです。アルゴリズム設計では、非対称暗号化アルゴリズムには、暗号化されたデータの長さに厳密な要件があります。たとえば、RSAアルゴリズムでは、暗号化されるデータが53バイトを超えてはならないことを要求しています。
3.非対称暗号化アルゴリズムは、主にデータ交換ではなく、対称暗号化アルゴリズムのキーを交換するために使用されます。
4。Java6は、DHとRSAを実装する2つのアルゴリズムを提供します。弾力のある城は、E1GAMALアルゴリズムのサポートを提供します。上記の3つのアルゴリズムに加えて、ECCアルゴリズムもあり、現在、サポートを提供する関連するオープンソースコンポーネントはありません。
暗号化または復号化には、パブリックキーとプライベートキーに分割される2つのキーが必要です
機能:安全性、遅い速度
使用
【キーエクスチェンジ(DH)】
共通キーを決定せずに、両当事者はキーを生成し、暗号化作業を提供しません。暗号化と復号化には、実装する他の対称暗号化アルゴリズムも必要です。
DHアルゴリズムの例
javax.crypto.keyagreement; import javax.crypto.interfaces.dhprivatekey; Import javax.crypto.interfaces.dhpublickey; import javax.crypto.spec.dhparameterspec; Import java.security java.security.spec.x509encodedkeyspec; Import java.util.hashmap; import java.util.map; // 1生成ソースキー// 2ソースの公開キーがターゲットに引き渡され、ターゲットはソースを通じて公開キーと秘密鍵を生成します。 //ターゲットの公開鍵はソースに引き渡されますpublic static final string private_key = "dh_private_key"; /** *ソースキーペアを生成 * @return * @throws例外 */public static Map <string、object> initsourcekey()スロー例外{// keypairgeneratorのインスタンスを作成し、dhアルゴリズムkeypairgenerator keypairgenerator = keypairgenerator.getinstance( "dh"); //キー長、デフォルト1024、オプションの範囲512-65536、および64 keypairgenerator.initialize(1024)の倍数を初期化します。 //キーペアKeypair keypair = keypairgenerator.genereTkeypair()を生成します。 dhpublickey dhpublickey =(dhpublickey)keypair.getpublic(); dhprivatekey dhprivatekey =(dhprivatekey)keypair.getPrivate(); //キーペアをマップマップ<string、object> keymap = new hashmap <string、object>(); keymap.put(public_key、dhpublickey); keymap.put(private_key、dhprivatekey);キーマップを返します。 } / ** *ソース公開キーを介してターゲットキーペアを生成します * @param sourcePublickey * @return * @throws例外 * /パブリック静的マップ<string、object> inittargetkey(byte [] sourcepublickey)throws {keyactory keyactory = keyfactory.getinstance( "dh"); //ソース公開キーを使用し、KeySpecを生成し、キーファクトリーを使用してパブリックキー関連情報を生成しますx509ENCODEDKEYSPEC keyspec = new X509EncodedKeyspec(SourcePublicKey); dhpublickey sourcepublic =(dhpublickey)keyfactory.generepublic(keyspec); dhparameterspec dhpublickeyparams = sourcepublic.getparams(); keypairgenerator keypairgenerator = keypairgenerator.getInstance( "dh"); keypairgenerator.initialize(dhpublickeyparams); keypair keypair = keypairgenerator.generatekeypair(); dhpublickey dhpublickey =(dhpublickey)keypair.getpublic(); dhprivatekey dhprivatekey =(dhprivatekey)keypair.getPrivate(); //キーペアをマップマップ<string、object> keymap = new hashmap <string、object>(); keymap.put(public_key、dhpublickey); keymap.put(private_key、dhprivatekey);キーマップを返します。 } / ***一方の当事者の公開キーと他方の当事者の秘密鍵を使用して、ローカルキー* @return* / public static byte [] generateLocalsecretkey(byte [] apublickey、byte [] bprivatekey){keyactory keyfactory = keyfactory.getinstance( "dh"); //公開キーを使用し、KeySpecを生成し、keyFactoryを使用してpublicKey関連情報を生成しますx509encodedkeyspec keyspec = new x509encodedkeyspec(apublickey); publicKey publicKey = keyFactory.generepublic(keyspec); // bプライベートキーを使用し、B privatekey関連情報を生成しますpkcs8encodedkeyspec pkcs8encodedkeyspec = new pkcs8encodedkeyspec(bprivatekey); privatekey privatekey = keyFactory.genereTprivate(pkcs8encodedkeyspec); // keyagreement keyagreement keyagreement = keyagreement.getInstance( "dh")を介してAのpublicKeyとBのprivatekeyを暗号化します。 keyagreement.init(privatekey); keyagreement.dophase(publickey、true); keyagreement.generatesecret( "aes")。getEncoded(); //アルゴリズムは対称暗号化アルゴリズム(des、dede、aes)// return keyagreement.generateecret()を使用します。 //アルゴリズムを使用して、アルゴリズムを選択せずにデフォルトメソッドを使用して計算することもできます} } //秘密のキーバイト配列を取得しますpublic static byte [] getPrivateKey(Map <String、Object> Map){return((dhprivateKey)map.get(private_key))。getEncoded(); } public static void main(string [] args)exception {byte [] source_public_key; byte [] source_private_key; byte [] source_local_key; byte [] target_public_key; byte [] target_private_key; byte [] target_local_key; map <string、object> sourcekey = initsourcekey(); source_public_key = getpublickey(sourcekey); source_private_key = getPrivateKey(sourcekey); System.out.println( "ソース公開キー:"+bytestohex.frombytestohex(source_public_key)); System.out.println( "ソース秘密鍵:"+bytestohex.frombytestohex(source_private_key)); map <string、object> targetkey = inittargetkey(getPublickey(sourcekey)); Target_public_key = getPublicKey(TargetKey); Target_private_key = getPrivateKey(TargetKey); System.out.println( "ターゲット公開キー:"+bytestohex.frombytestohex(target_public_key)); System.out.println( "ターゲット秘密鍵:"+bytestohex.frombytestohex(target_private_key)); source_local_key = generateLocalsecretkey(target_public_key、source_private_key); Target_local_key = generateLocalsecretkey(source_public_key、target_private_key); System.out.println( "ソースローカルキー:"+bytestohex.frombytestohex(source_local_key)); System.out.println( "ターゲットローカルキー:"+bytestohex.frombytestohex(target_local_key)); }}【暗号化/復号化(RSA)】【デジタル署名(RSA)】
RSAアルゴリズムはDHアルゴリズムよりも遅れており、これらの5つの文字はすべて、人間名の最初の文字です。 DHアルゴリズムは、最初の非対称暗号化システムです。
RSAアルゴリズムのコンピューティング速度は遅く、大量のデータを暗号化するのに適していません。 1つの解決策は、RSAと対称暗号化方法を混合し、対称暗号化方法を使用してデータを暗号化し、対称暗号化キーをRSAアルゴリズムを使用して暗号化することです。キーは非常に短いため、時間はそれほど多くありません。実際、対称暗号化方法の唯一の欠点は、キーを通過するのが難しく、対称暗号化方法も亀裂が困難であることです。
RSAの該当するシナリオ:
(1)サーバーは公開キーと秘密鍵を生成し、公開キーを公開します。
(2)クライアントは公開キーを使用してデータを暗号化し、サーバーに引き渡します。他の人は暗号化されたデータを理解できません。
(3)サーバーは秘密鍵を使用してデータを復号化し、ユーザーが送信したデータを表示します。
この場合、公開キーはメールボックスのようなものであり、誰もがこのメールボックスにメッセージを入れることができますが、メールボックスキーを持っている人のみがこのメールボックスの文字を解凍して表示できます。
RSA適用シナリオ2:
(1)皇帝は公開鍵と秘密の鍵を生成し、公開鍵を公表します。
(2)皇帝は世界に知らせるためのdict令を出した。 dict令の右下隅に2つの文字列があります。最初の文字列はランダムな文字列であり、2番目の文字列は、最初の文字列を秘密鍵で暗号化した結果です。
(3)一部の人々は、e令が皇帝によって書かれたと信じていないため、公開鍵を使用して2番目の数字の文字列を復号化しました。復号化後、彼らはそれが最初の一連の数字と同じであることを発見しました。つまり、それは実際に皇帝によって書かれたことを意味します。ほとんどの人には鍵がないため、公開鍵で解読できるデータを暗号化することはできません。
この場合、公開キーは復号化に使用され、秘密鍵は暗号化に使用されます。これは、発表が実際に誰かによって送信されたことを証明するために使用できます。署名に相当します。
実際、署名のために特に長くする必要はありません。一般的に、署名は固定された長さです。固定長を持ちたい場合は、MD5やSHAシリーズなどのMESSAGED Gigestアルゴリズムを使用できます。したがって、MD5 WithRSAなど、さまざまな署名アルゴリズムがあります。
RSA暗号化/復号化の例
javax.crypto.cipher; import java.security.keypair; Import java.security.keypairgenerator; import java.security.publickey; import java.security.interfaces.rsaprivatekey; import java.security.interfaces.rsapublickey; import.rsapublickey; java.util.map;/*** rsa暗号化ツール*/public class rsautil {public static final string public_key = "rsa_public_key"; public static final string private_key = "rsa_private_key"; / ** *初期化キー * @return * @throws例外 */ public static Map <string、object> initkey()throws exception {keypairgenerator keypairgenerator = keypairgenerator.getInstance( "rsa"); keypairgenerator.Initialize(1024); // 512-65536&Multiples of 64 keypair keypair = keypairgenerator.generatekeypair(); rsapublickey publickey =(rsapublickey)keypair.getpublic(); rsaprivatekey privatekey =(rsaprivatekey)keypair.getprivate(); map <string、object> keymap = new hashmap <string、object>(); keymap.put(public_key、publickey); keymap.put(private_key、privatekey);キーマップを返します。 } public static rsapublickey getPublickey(Map <String、object> keymap){return(rsapublickey)keymap.get(public_key); } public static rsaprivatekey getPrivateKey(Map <String、Object> KeyMap){return(rsaprivateKey)keymap.get(private_key); } / ** *公開キーを使用してデータを暗号化 * @param data * @param publickey * @throws例外 * / public static byte [] encrypt(byte [] data、rsapublickey publickey)スロー{cipher = cipher.getinstance( "rsa"); cipher.init(cipher.encrypt_mode、publickey); cipher.dofinal(data)を返します。 } / ** *秘密鍵を使用して * @param data * @param privatekey * @throws Exception * / public static byte [] decrypt(byte [] data、rsaprivatekeykeykey)スロー{cipher cipher = cipher.getinstance( "rsa"); cipher.init(cipher.decrypt_mode、privatekey); cipher.dofinal(data)を返します。 } public static void main(string [] args)スロー例外{string data = "jay chou-dongfeng break"; map <string、object> keymap = initkey(); byte [] miwen = encrypt(data.getBytes()、getPublickey(keymap)); system.out.println( "暗号化コンテンツ:"+bytestohex.frombytestohex(miwen)); byte [] plain = decrypt(miwen、getprivatekey(keymap)); System.out.println( "decrypted Content:"+new String(Plain)); }}上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。