暗号化は、特別なアルゴリズムを使用して元の情報データを変更することであり、不正なユーザーが暗号化された情報を取得したとしても、復号化方法を知らないため、情報の内容を理解できません。一般に、双方向暗号化と一方向暗号化に分割されますが、双方向暗号化は対称暗号化と非対称暗号化に分割されます(一部の材料は暗号化と非対称暗号化に直接分割します)。
双方向暗号化の一般的な意味は、プレーンテキスト暗号化後に暗号文を形成することです。これは、アルゴリズムを介してプレーンテキストに復元できます。一方向の暗号化は、情報に対してダイジェスト計算のみを実行し、アルゴリズムを介してプレーンテキストを生成することはできません。厳密に言えば、一方向暗号化は暗号化タイプと見なすことはできませんが、ダイジェストアルゴリズムと見なす必要があります。
具体的には:
システムは利用可能である必要があり、非測定的にデコードすることはできません。
システムは機密を保つ必要はなく、敵の手に簡単に陥ることができます。
キーは、書くことなく交換して記憶する必要があり、両当事者はキーを変更できます。
このシステムは、通信に使用できます。
システムは位置を転送でき、その機能は複数の人を通過することなく達成する必要があります。
システムは使いやすく、ユーザーが過労したり、多くのルールを持ったりする必要はありません。
1.メイン暗号化方法コードプロバイダー
JDK:コードは、JavaインストールディレクトリのJRE/LIB/JCE.JARパッケージにあります。
CC:org.apache.commons.codec Apacheが提供
ホームページ:http://commons.apache.org/proper/commons-codec/
BC:org.bouncecastle
ホームページ:http://www.bouncycastle.org/java.html
基本的に一般的に使用されるJDKで十分です。
2。Base64アルゴリズム
1.暗号化アルゴリズムの複雑さから判断すると、Base64は暗号化されていると言うのは恥ずかしいことですが、コンピューターをまったく理解していない人には十分です。 base64エンコーディングは読めません。つまり、エンコードされたデータは、肉眼で人間に直接見られません。
Base64エンコーディングは、通常、URL処理に使用されます。または、普通の人に知ってもらいたくないものは、Base64エンコードで処理してからインターネットに投稿できます。
パッケージcom.amuro.strategy.base64; import java.util.base64; Import com.amuro.strategy.istategy;/** * base64 Algorithmは64の基本文字に基づいており、これらの64文字のみが暗号化された文字列 * @author amuro */public class base64tration base64tration embrations ebterment byte [] encodebytes = base64.getEncoder()。encode(src.getBytes());新しい文字列(EncodeBytes)を返します。 } public string decode(string src){byte [] decodeBytes = base64.getDecoder()。decode(src.getBytes());新しい文字列(decodeBytes)を返します。 }}2。Base64エンコード通信テーブル
3。メッセージダイジェストアルゴリズム(メッセージダイジェスト)
メッセージダイジェストはDigital Digestとも呼ばれます。これは、メッセージまたはテキストの固定された長さに対応する一意の値であり、メッセージに作用する一方向ハッシュ暗号化関数によって生成されます。ハッシュ関数の競合抵抗により、段落の文字が1つしか変更されていなくても、ハッシュアルゴリズムの後に異なる値が生成された場合でも、平易なテキストがわずかに変更されます。ハッシュアルゴリズムの単方向性により、同じハッシュ値を含む2つの異なる入力メッセージを計算することは不可能になります。したがって、データのハッシュ値、つまりメッセージダイジェストは、データの整合性を検証できます。
単純に言えば、どのデータも人間のように一意でなければなりません。ユニークな識別子とは何ですか?人間にとって、それは現在指紋であり、データの指紋は何ですか?そうです、それはメッセージダイジェストアルゴリズムによって生成されたこの文字列です。たとえば、Webサイトを登録すると、クライアントはサーバーに入力したパスワードを送信します。これは、メッセージダイジェスト処理後のコンテンツになります。サーバーが壊れていても、ハックはユーザーの実際のパスワードが何であるかを知ることができません。ただし、MD5とSHAは現在妥協されていると言われているため、Googleでグーグルできます。
1。MD5
パッケージcom.amuro.strategy.message_digest; import java.security.messagegest; import java.security.nosuchalgorithmexception; import org.apache.commons.codec.binary.hex; Import com.amuro.strategy.istrategy; md5strategyはiStrategy {public string encode(string src){try {mesagedgest md = mesagedgest.getInstance( "md5"); byte [] ecodebytes = md.digest(src.getBytes()); return hex.encodehexstring(encodebytes); } catch(nosuchalgorithmexception e){e.printstacktrace(); } nullを返します。 } public string decode(string src){throw new runtimeexception( "md5 no decode"); }}2。シャ
パッケージcom.amuro.strategy.message_digest; import java.security.messagegest; import java.security.nosuchalgorithmexception; import org.apache.commons.codec.binary.hex; Import com.amuro.strategy.istegy; shastrategyはiStrategy {public string encode(string src){try {mesagedigest md = mesagedigest.getinstance( "sha"); md.update(src.getBytes()); return hex.encodehexstring(md.digest()); } catch(nosuchalgorithmexception e){e.printstacktrace(); } nullを返します。 } public string decode(string src){throw new runtimeexception( "sha no decode"); }} 4.対称暗号化<BR />シングルキー暗号化システムの暗号化方法を使用すると、同じキーを同時に暗号化と情報の復号化として使用できます。この暗号化方法は、シングルキー暗号化とも呼ばれる対称暗号化と呼ばれます。暗号化と復号化の両方が同じキーを使用するため、復号化者にキーを安全に渡す方法は、解決しなければならない問題になります。もちろん、セキュリティが低いという利点は、計算量が少ない、暗号化速度が高速で、暗号化効率が高いことです。
ただし、最新のコンピューターはこのレベルのコンピューティングを気にかけて長い間停止しており、安全性が最も重要なことです。
1。Des
DES、フルネームは「データ暗号化標準」であり、その中国名は「データ暗号化標準」であり、キー暗号化を使用するブロックアルゴリズムです。 DESアルゴリズムは、暗号化システムの対称的な暗号化システムであり、American Data暗号化標準としても知られています。これは、1972年に米国でIBMによって開発された対称暗号化システム暗号化アルゴリズムです。プレーンテキストは64ビットでグループ化され、キーは実際にはDES操作に関与する56ビット暗号化方法です(8番目、16、24、32、40、48、56、64、64ビットは、ビットを噛みました。交換または交換されて、暗号文の暗号化方法を形成します。
パッケージcom.amuro.strategy.des; import javax.crypto.cipher; Import javax.crypto.keygenerator; import javax.crypto.secretkey; import javax.crypto.secretkeyFactory; Import javax.crypto.spec.deskeyspec.pec.pec.deskepec.spec.deskeyspec.spec.deskeyspec.deskeyspec. com.amuro.strategy.istrategy;/** * * @author amuro * */public class desstrategyはiStrategy {private cipher cipher; Private SecretKey GenerateKey; public string encode(string src){try {keygenerator keygenerator = keygenerator.getInstance( "des"); keygenerator.init(56); // size secretkey secretkey = keygenerator.generatekey(); byte [] keybytes = secretkey.getEncoded(); deskeyspec deskeyspec = new deskeyspec(keybytes); SecretKeyFactory SecretKeyFactory = SecretKeyFactory.getInstance( "des"); GenerateKey = SecretKeyFactory.GenerateSecret(deskeyspec); cipher = cipher.getInstance( "des/ecb/pkcs5padding"); cipher.init(cipher.encrypt_mode、generatekey); byte [] resultbytes = cipher.dofinal(src.getBytes()); return hex.encodehexstring(resultbytes); } catch(Exception e){e.printstacktrace(); } nullを返します。 } public string decode(string src){try {cipher.init(cipher.decrypt_mode、generatekey); byte [] result = hex.decodehex(src.tochararray());新しい文字列(cipher.dofinal(result))を返します。 } catch(Exception e){e.printstacktrace(); } nullを返します。 }}2。3DES3DESは「Triple DES」とも呼ばれますが、「Triple Data暗号化アルゴリズム」と呼ばれます。これは、各データブロックにDES暗号化アルゴリズムを3回適用するのと同等です。コンピューターのコンピューティング能力が強化されているため、元のDESパスワードのキー長は簡単に膨らんでいます。 3DESは、新しいブロック暗号アルゴリズムを設計するのではなく、DESのキー長を増やすことにより、同様の攻撃を回避するための比較的簡単な方法を提供するように設計されています。
パッケージcom.amuro.strategy.des; Import javax.crypto.cipher; import javax.crypto.keygenerator; import javax.crypto.secretkey; Import javax.crypto.secretkeyFactory; Import javax.crypto.spec.desededekeyspec; org.apache.commons.codec.binary.hex; Import com.amuro.strategy.istrategy; public class _3desstrategy実装IStrategy {private cipher cipher; Private SecretKey GenerateKey; public string encode(string src){try {keygenerator keygenerator = keygenerator.getInstance( "desede"); keygenerator.init(168); // Size SecretKey secretKey = keyGenerator.genereTekey(); byte [] keybytes = secretkey.getEncoded(); desedekeyspec deskeyspec = new desedekeyspec(keybytes); SecretKeyFactory SecretKeyFactory = SecretKeyFactory.getInstance( "Desede"); GenerateKey = SecretKeyFactory.GenerateSecret(deskeyspec); cipher = cipher.getInstance( "desede/ecb/pkcs5padding"); cipher.init(cipher.encrypt_mode、generatekey); byte [] resultbytes = cipher.dofinal(src.getBytes()); return hex.encodehexstring(resultbytes); } catch(Exception e){e.printstacktrace(); } nullを返します。 } public string decode(string src){try {cipher.init(cipher.decrypt_mode、generatekey); byte [] result = hex.decodehex(src.tochararray());新しい文字列(cipher.dofinal(result))を返します。 } catch(Exception e){e.printstacktrace(); } nullを返します。 }}3。Aesaes、フルネームは「高度な暗号化標準」で、中国名は「高度な暗号化標準」です。暗号化のRijndael暗号化法としても知られています。これは、米国連邦政府が採用したブロック暗号化標準です。新しい世代のデータ暗号化標準として、AES暗号化アルゴリズムは、強力なセキュリティ、高性能、高効率、使いやすさ、柔軟性の利点をもたらします。 AES設計には、128、192、256ビットの3つの重要な長さがあります。比較的言えば、AESの128キーは、DESの56キーよりも1021倍強いです。
パッケージcom.amuro.strategy.des; import javax.crypto.cipher; Import javax.crypto.keygenerator; import javax.crypto.secretkey; import javax.crypto.spec.secretkeyspec; Import org.apache.commons.commons.hex; aesstrategyはiStrategy {private cipher cipher; Private SecretKey GenerateKey; public string encode(string src){try {keygenerator keygenerator = keygenerator.getInstance( "aes"); keygenerator.init(128); // Size SecretKey secretKey = keyGenerator.genereTekey(); byte [] keybytes = secretkey.getEncoded(); GenerateKey = new SecretKeyspec(keyBytes、 "aes"); cipher = cipher.getInstance( "aes/ecb/pkcs5padding"); cipher.init(cipher.encrypt_mode、generatekey); byte [] resultbytes = cipher.dofinal(src.getBytes()); return hex.encodehexstring(resultbytes); } catch(Exception e){e.printstacktrace(); } nullを返します。 } public string decode(string src){try {cipher.init(cipher.decrypt_mode、generatekey); byte [] result = hex.decodehex(src.tochararray());新しい文字列(cipher.dofinal(result))を返します。 } catch(Exception e){e.printstacktrace(); } nullを返します。 }} 4。Pbe
PBE、フルネーム「パスワードベース暗号化」は、パスワードベースの暗号化アルゴリズムです。その特徴は、パスワードがキーの代わりに使用され、パスワードはユーザー自身が管理することです。乱数は、データのセキュリティを確保するために、複数の暗号化とその他の方法をハッシュしました。
PBEアルゴリズムにはキーの概念がなく、パスワードをキーとして扱います。キーの長さはアルゴリズムのセキュリティに影響し、メモリに便利ではないため、ここで使用するパスワードを直接使用することは非常に異なります。これはメモリに便利です。ただし、単純なパスワードは辞書メソッドによって簡単に使い果たされるため、ここでパスワードに「塩」を追加しました。塩とパスワードのこの組み合わせを割るのは困難です。同時に、塩とパスワードをマージし、メッセージダイジェストアルゴリズムを何度も繰り返して、キー初期化ベクトルの基本資料を構築し、解読をさらに困難にします。
パッケージcom.amuro.strategy.pbe; import java.security.securerandom; Import javax.crypto.cipher; import javax.crypto.secretkey; Import javax.crypto.secretkey; Import javax.crypto.secretkeyfactory; javax.crypto.pec.pec.specto javax.crypto.spec.pbeparameterspec; Import org.apache.commons.commons.comdec.binary.hex; import com.amuro.strategy.istategy;/** *パスワードベースの暗号化(パスワード)、対称 +メッセージダイジェスト * @author amuro */公開クラスPbestermements pbestrategy Private SecretKey GenerateKey;プライベートPBEPARAMETERSPEC PBEPARAMETERSPEC; public string encode(string src){try {securerandom securerandom = new securerandom(); byte [] salt = securerandom.generateseed(8);文字列パスワード= "amuro"; pbekeyspec pbekeyspec = new pbekeyspec(password.tochararray()); SecretKeyFactory SecretKeyFactory = SecretKeyFactory.getInstance( "pbewithmd5anddes"); GenerateKey = SecretKeyFactory.GenerateSecret(PBEKEYSPEC); pbeparameterspec = new pbepparameterspec(塩、100); cipher = cipher.getInstance( "pbewithmd5anddes"); cipher.init(cipher.encrypt_mode、generatekey、pbeparameterspec); byte [] resultbytes = cipher.dofinal(src.getBytes()); return hex.encodehexstring(resultbytes); } catch(Exception e){e.printstacktrace(); } nullを返します。 } public string decode(string src){try {cipher.init(cipher.decrypt_mode、generatekey、pbeparameterspec); byte [] result = hex.decodehex(src.tochararray());新しい文字列(cipher.dofinal(result))を返します。 } catch(Exception e){e.printstacktrace(); } nullを返します。 }} 5.非対称暗号化<BR />非対称暗号化アルゴリズムには、暗号化と復号化に2つのキー、つまり公開キーと秘密鍵が必要です。注意すべきことの1つは、公開キーと秘密鍵はペアでなければならないということです。データが公開キーで暗号化されている場合、対応する秘密鍵のみを復号化でき、その逆も同様です。暗号化と復号化は2つの異なるキーを使用するため、このアルゴリズムは非対称暗号化アルゴリズムと呼ばれます。
1。RSA
実際、RSAは早くも1978年に登場し、データ暗号化とデジタル署名の両方に使用できる最初のアルゴリズムでした。理解して運営するのは簡単で、非常に人気があります。原則は、上記の作業プロセスで説明されているとおりです。 RSAアルゴリズムは非常に単純な数の理論の事実に基づいています。2つの大きな素数を掛けるのは簡単ですが、製品を因数分解することは非常に困難であるため、製品を暗号化キーとして開示できます。
パッケージcom.amuro.strategy.asymmetric; import java.security.keyfactory; import java.security.keypair; import java.security.keypairgenerator; import java.security.privatekey; import java.security.publickey; import.interfaces.rsaprice java.security.interfaces.rsapublickey; Import java.security.spec.pkcs8encodedkeyspec; Import java.security.spec.x509encodedkeyspec; Import javax.crypto.cipher; import org.apach.apache.comcodec.codec.birty.hexクラスRSASTRATEGYはiStrategy {private rsapublickey rsapublickey; private rsaprivatekey rsaprivatekey; public string encode(string src){try {// keypairgenerator keypairgenerator = keypairgenerator.getInstance( "rsa"); keypairgenerator.initialize(512); keypair keypair = keypairgenerator.generatekeypair(); rsapublickey =(rsapublickey)keypair.getpublic(); rsaprivatekey =(rsaprivatekey)keypair.getPrivate(); // private key encryption public key decryption pkcs8encodedkeyspec pkcs8encodedkeyspec = new pkcs8encodedkeyspec(rsaprivatekey.getencoded()); KeyFactory keyFactory = keyFactory.getInstance( "rsa"); privatekey privatekey = keyFactory.genereTprivate(pkcs8encodedkeyspec); cipher cipher = cipher.getInstance( "rsa"); cipher.init(cipher.encrypt_mode、privatekey); byte [] resultbytes = cipher.dofinal(src.getBytes()); //秘密キー復号化公開キー暗号化// X509ENCODEDKEYSPEC X509ENCODEDKEYSPEC = //新しいX509ENCODEDKEYSPEC(rsapublickey.getEncoded()); KeyFactory.GenerePublic(x509EncodedKeyspec); // cipher cipher = cipher.getInstance( "rsa"); // cipher.init(cipher.encrypt_mode、publickey); // byte [] resultbytes = cipher.dofinal(src.getbytes(); return hex.encodehexstring(resultbytes); } catch(Exception e){e.printstacktrace(); } nullを返します。 } public String decode(string src){try {// private key encryption public key decryption x509encodedkeyspec x509encodedkeyspec = new x509encodedkeyspec(rsapublickey.getEncoded(); KeyFactory keyFactory = keyFactory.getInstance( "rsa"); publicKey publicKey = keyFactory.generepublic(x509EncodedKeyspec); cipher cipher = cipher.getInstance( "rsa"); cipher.init(cipher.decrypt_mode、publickey); byte [] resultbytes = cipher.dofinal(hex.decodehex(src.tochararray())); // private key decryption public key necryption // pkcs8encodedkeyspec pkcs8encodedkeyspec keyFactory.genereTPrivate(pkcs8encodedkeyspec); // cipher cipher = cipher.getinstance( "rsa"); // cipher.decrypt_mode、privatekey); // byte [] resultbytes = cipher.dofina()新しい文字列(resultbytes)を返します。 } catch(Exception e){e.printstacktrace(); } nullを返します。 }} 2。DHアルゴリズム
DH、フルネーム「Diffie-Hellman」は、共有キーが安全でないネットワークを安全に交差させることを保証する方法です。公開鍵暗号システムの創設者であるDiffieとHellmanによって提案されたアイデア。簡単に言えば、2人のユーザーが公共メディアで情報を交換して、「一貫した」共有可能なキーを生成できるようにすることです。つまり、パーティーAは一対のキー(公開鍵、秘密鍵)を生成し、パーティーBはパーティーAの公開キーに基づいてパーティーBのキーペア(公開鍵、秘密鍵)を生成します。
これをベースラインとしてデータ送信の機密性の基礎としてとって、両当事者は同じ対称暗号化アルゴリズムを使用して、ローカルキー(SecretKey)を構築してデータを暗号化します。このようにして、ローカルキー(SecretKey)アルゴリズムが相互運用可能になった後、パーティーAとパーティーBはパブリックキーを開示し、他のパーティの公開キーと生成された秘密鍵を使用してデータを暗号化し、同時に、相手の公開キーと独自の秘密鍵を使用してデータを剥離することができます。 2つのパーティAとBだけでなく、それらをマルチパーティ共有データ通信に拡張でき、ネットワークインタラクティブデータの安全な通信が完了します。
パッケージcom.amuro.strategy.asymmetric; import java.security.keyfactory; Import java.security.keypair; Import java.security.keypairgenerator; import java.security.privatekey; import java.security.publickey; import.sycurity.sycurity.s-xc. java.util.objects; Import javax.crypto.cipher; Import javax.crypto.keyagreement; Import javax.crypto.secretkey; Import javax.crypto.interfaces.dhpublickey; Import javax.crypto.spec.dhparameterpec; org.apache.commons.codec.binary.hex; Import com.amuro.strategy.istrategy; public class dhstrategyはiStrategy {private cipher cipher;プライベートシークレットキーレシーバーCretkey; public string encode(string src){try {// sender keypairgenerator senderkeypairgenerator = keypairgenerator.getInstance( "dh"); senderkeypairgenerator.initialize(512); keypair senderkeypair = senderkeypairgenerator.generetkeypair(); privatekey senderprivatekey = senderkeypair.getPrivate(); byte [] senderpublickeybytes = senderkeypair.getpublic()。getEncoded(); //送信者の公開キー//受信者のキーを初期化する、送信者の公開キーKeyFactory ReceiverKeyFactory = keyFactory.getInstance( "dh"); X509ENCODEDKEYSPEC X509ENCODEDKEYSPEC = new X509ENCODEDKEYSPEC(SenderPublicKeyBytes); publicKey ReceiverPublicKey = ReceiverKeyFactory.GenerePublic(X509ENCODEDKEYSPEC); dhparameterspec dhparameterspec =((dhpublickey)receiverpublickey).getparams(); keypairgenerator ReceiverKeypairgenerator = keypairgenerator.getInstance( "dh"); ReceiverKeypairgenerator.Initialize(dhparameterspec); keypair receiverkeypair = receiverkeypairgenerator.generetkeypair(); privateKey ReceiverPrivateKey = ReceiverKeypair.getPrivate(); byte [] receivepublickeybytes = receiverkeypair.getPublic()。getEncoded(); keyAgreement ReceiverKeyAgreement = keyAgreement.getInstance( "dh"); ReceiverKeyAgreement.init(ReceiverPrivateKey); ReceiverKeyAgreement.Dophase(ReceiverPublickey、True); Receiversecretkey = ReceiverKeyAgreement.GenerateCret( "des"); //送信者は、受信者の公開キーを取得して暗号化できます。 KeyFactory SenderKeyFactory = keyFactory.getInstance( "dh"); X509ENCODEDKEYSPEC = new X509ENCODEDKEYSPEC(ReceivePublicKeyBytes); publicKey senderpublickey = senderkeyfactory.generepublic(x509encodedkeyspec); keyagreement senderkeyagreement = keyagreement.getInstance( "dh"); senderKeyAgreement.init(senderprivatekey); senderKeyAgreement.dophase(senderpublickey、true); SecretKey SenderSecretkey = senderKeyAgreement.generateseCret( "des"); if(objects.equals(receivesecretkey、sendersecretkey)){cipher = cipher.getInstance( "des"); cipher.init(cipher.encrypt_mode、sendersecretkey); byte [] result = cipher.dofinal(src.getBytes()); return hex.encodehexstring(result); }} catch(例外e){e.printstacktrace(); } nullを返します。 } public string decode(string src){try {cipher.init(cipher.decrypt_mode、receiversecretkey); byte [] result = hex.decodehex(src.tochararray());新しい文字列(cipher.dofinal(result))を返します。 } catch(Exception e){e.printstacktrace(); } nullを返します。 }} 6.デジタル署名証明書の非対称暗号化はすでに非常に安全ですが、別の欠陥があります。
サーバーAは公開キーを公開しました。私のコンピューターは、サーバーAの公開キーを使用してデータを暗号化し、サーバーAに送信しました。この時点で、サーバーBはコンピューターに侵入し、公開キーを公開キーに暗号化するために使用した公開キーを交換したため、送信したデータはサーバーBの秘密キーによってクラックされます。公開キーが改ざんを妨げないようにするにはどうすればよいですか?
はい、前のメッセージの概要を考えました。サーバーAが私に公開鍵を投げたとき、彼はデジタル証明書を申請するためにCAにも行きました。実際、それは主に公開キーのメッセージの概要です。この証明書を使用して、公開キーで暗号化すると、最初に現在の公開キーがサーバーAから送信されたことが確認されたかどうかを確認できます。
これが一種のRSAです:
パッケージcom.amuro.strategy.signature; import java.security.keyfactory; Import java.security.keypair; Import java.security.keypairgenerator; Import java.security.privatekey; Import java.security.publicurity.publickey; import java.security.surity; immont; java.security.interfaces.rsaprivatekey; Import java.security.interfaces.rsapublickey; Import java.security.spec.pkcs8encodedkeyspec; Import java.security.security.security.spec.spec.x509encodedkeyspec;公開rsasign(sring static booulean) keypairgenerator keypairgenerator = keypairgenerator.getInstance( "rsa"); keypairgenerator.initialize(512); keypair keypair = keypairgenerator.generatekeypair(); publicKey rsapublickey =(rsapublickey)keypair.getpublic(); privatekey rsaprivatekey =(rsaprivatekey)keypair.getPrivate(); PKCS8ENCODEDKEYSPEC PKCS8ENCODEDKEYSPEC = new PKCS8ENCODEDKEYSPEC(rsaprivateKey.getEncoded()); KeyFactory keyFactory = keyFactory.getInstance( "rsa"); privatekey privatekey = keyFactory.genereTprivate(pkcs8encodedkeyspec);署名署名= signature.getInstance( "md5withrsa"); signature.initsign(privatekey); signature.update(src.getBytes()); //署名バイトバイトバイト[] signbytes = signature.sign(); X509ENCODEDKEYSPEC X509ENCODEDKEYSPEC = new X509ENCODEDKEYSPEC(rsapublickey.getEncoded()); keyFactory = keyFactory.getInstance( "rsa"); publicKey publicKey = keyFactory.generepublic(x509EncodedKeyspec); signature = signature.getInstance( "md5withrsa"); signature.initverify(publicKey); signature.update(src.getBytes()); boolean isverified = signature.verify(signbytes); Isverifiedを返します。 } catch(Exception e){e.printstacktrace(); } falseを返します。 }}デジタル署名と非対称暗号化アルゴリズムの使用に関して、私も素晴らしい例を見ました、そして私はそれをあなたと共有します:
残念ながら、私は今月あまりにも多くの本を買ったので、月末までそれを出すことができません。私はたまたまQQでクラークに会いました:
1-2-3:「クラーク、200テールシルバーが必要です、私に貸してもいいですか?」
クラーク:「問題ありません。私は今あなたにお金を譲渡します。私にIOUをください。」
1-2-3:「どうもありがとう。私はあなたに言葉でIOUを書きます。」
次に、新しいWordドキュメントを作成し、IOUを書き、保存しました。それでは、私は何をすべきですか?理由のためにIouをクラークに直接送ることはできません:
1。Iouを受け取った後、クラークが「200台の銀」を「2000台の銀の銀の四肢」に変えないことを保証することはできません。
2。借金を逃した場合、クラークは私がIouを書いたことを証明することはできません。
3.通常の単語文書は、訴訟の証拠として使用することはできません。
幸いなことに、私はデジタル証明書を申請しました。最初に秘密鍵でIOUを暗号化し、次に暗号化された暗号文をQQのクラークに送信します。クラークがIOUの暗号文を受け取った後、彼はデジタル証明書認定センターのウェブサイトに私の公開鍵をダウンロードし、私の公開鍵を使用して暗号文を復号化しました。彼は、それが実際に「200台の借りた銀」と書かれていることを発見したので、クラークは私に自信を持ってお金を貸すことができました。クラークが私のiouを改ざんすることを心配することはありません。
1.クラークに送信した暗号文は、クラークを変更することはできません。クラークは復号化されたIOUを変更できますが、クラークには私の秘密の鍵がないので、Iouを暗号化することを真似することはできません。これは改ざん防止と呼ばれます。
2。Iouは私の秘密鍵で暗号化されているため、復号化できる私の公開鍵のみがあります。逆に、私の公開鍵で復号化できるIOUは私の秘密鍵で暗号化されなければならず、私は私の秘密鍵だけを所有しているので、クラークはこのIouが私によって書かれたことを証明できます。これは反債券と呼ばれます。
3.私がお金を返済しなかった場合、クラークは私を法廷で訴えました、そして、私の秘密鍵で暗号化されたこの言葉文書は、チェン・タンの証明書として使用できます。私たちの国は「中華人民共和国の電子署名法」を発行したため、デジタル署名を法的に効果的にしているからです。
私の秘密鍵で暗号化されたこのIouには、改ざんと反Debtの特徴があり、このIOUを「署名」する効果と同じチェンタンの証明書として使用できることに気付いたに違いありません。ちなみに、「私の秘密鍵でIOUを暗号化する」プロセスは、デジタル署名と呼ばれます。
これは概要の記事であり、一般的に使用されるJava暗号化テクノロジーとコアコードをここで参照して、友人が参照します。