Javaはkeytoolと組み合わせて非対称暗号化と復号化を実現する


Javaセキュリティシステムでは、署名はJAASモジュールに属し、復号化はJCEモジュールに属する.keytoolの使用keytoolはJDKが持参した鍵ライブラリ管理ツールです.ここではkeytoolの一部の機能のみが用いられ,鍵ペアの生成,公開鍵のエクスポートなどが含まれる.keytoolが生成した公開鍵/秘密鍵ペアは、keystoreと呼ばれるパスワード保護されたファイルに格納されます.生成鍵ペア$keytool-genkey-alias signLegal-keystore examplestanstore 2-validity 1800-keyalg RSAはsignLegalという別名の鍵ペアを生成し、鍵ライブラリexamplestanstore 2に格納され、証明書の有効期間は1800日(デフォルトは90日)である.一連のパラメータを入力します.入力したパラメータはLDAPのスタイルと基準に従います.生成された鍵ペアはLDAPのエントリの1つと見なすことができると考えられる.コマンドが正常に実行されると、現在のディレクトリの下にexamplestanstore 2というファイルが作成されます.別のブログに対してkeyalgパラメータを追加した.keytoolのデフォルトアルゴリズムはDSAであるため、DSAは署名にのみ使用できます.RSAは署名にも暗号化にも使用できます.本文は暗号化の問題を研究して、RSAアルゴリズムしか使えません.鍵ペア$keytool-list-keystore examplestanstore 2-vを表示すると、examplestanstore 2鍵ライブラリのすべての鍵ペアがリストされます.-vパラメータは詳細を表し、詳細には証明書の失効時間があります.公開鍵証明書$keytool-export-keystore examplestanstore 2-alias signLegal-file StanSmithをエクスポートします.crt-rfcから導出公開鍵は、現在のディレクトリのStanSmithに格納.crtファイルにあります.「署名」を述べた博文は-rfcパラメータを加えず、バイナリファイル(CERフォーマット)をエクスポートした.-rfcを加えると、テキストファイル(PEM)形式がエクスポートされます.次のテストでは、CER形式を使用すると、No installed provider supports this key: sun.security.provider.DSAPublicKeyImplとエラーが表示されます.Java暗号化と復号Javaプログラムでは,まず鍵ライブラリから秘密鍵と公開鍵を取り出し,テスト文字列を暗号化する.バイナリの暗号文は文字列に変換されて画面に出力され、明文に復号されて画面に出力されます.GenSig2.javaimport java.io.;import java.security.KeyStore;import java.security.PrivateKey;import java.security.PublicKey;import javax.crypto.Cipher;import sun.security.provider.;
public class RSAEntry{public static void main(String[]args){try{//1.秘密鍵KeyStore ks=KeyStore.getInstance("JKS");FileInputStream ksfis=new FileInputStream("examplestanstore 2");BufferedInputStream ksbufin=new BufferedInputStream(ksfis);
//open keystore and get private key//alias is 'signLeal', kpasswd/spasswd is 'vagrant'ks.load(ksbufin, "vagrant".toCharArray());PrivateKey prikey = (PrivateKey) ks.getKey("signLegal", "vagrant".toCharArray());
//2.コマンドラインパラメータに基づいて公開鍵FileInputStream certfis=new FileInputStream(args[0]);java.security.cert.CertificateFactory cf =java.security.cert.CertificateFactory.getInstance("X.509");java.security.cert.Certificate cert = cf.generateCertificate(certfis);PublicKey pubKey = cert.getPublicKey();
//3.公開鍵による暗号化String data=「テストデータ」//暗号解読クラスCipher cipher=Cipherを構築する.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, pubKey);//暗号化モードbyte[]jmdata=cipherに設定.doFinal(data.getBytes());//暗号化データを印刷するシステム.out.println(bytesToHexString(jmdata));//復号モードに変更する復号cipherを行う.init(Cipher.DECRYPT_MODE, prikey);//秘密鍵でjmdata=cipherを復号します.doFinal(jmdata);System.out.println(new String(jmdata));}catch (Exception e) {e.printStackTrace();}}//この方法はバイナリをASCII文字列に変換するために用いられる.public static String bytesToHexString(byte[] bytes) {if (bytes == null)return "null!";int len = bytes.length;StringBuilder ret = new StringBuilder(2 * len);
for (int i = 0; i < len;++i) {int b = 0xF & bytes[(i)] >> 4;ret.append("0123456789abcdef".charAt(b));b = 0xF & bytes[(i)];ret.append("0123456789abcdef".charAt(b));}
return ret.toString();}}コンパイルして$javac RSAEntryを実行します.java$ java RSAEntry StanSmith.crt8fceea48e34fdc786bde05459f3366714b650ff04f4e81e52eca139d8ee0b4acbcad019cd496de3589765894b2d5f4a2af38914af614d9e9b73e551ae01830cd6f49505685d7e527e3adc2b7a2a75608068627c0a12b338d3c743a5de2af2de327a0de14b548604e5c8905747aef077852ecfd2eb4a134ca0f3a56b23db8ae4beb07add5ba3725ab3ee0ffa7481494856144ba5004a329cfe2c43078f0cd95aebcbbfc6c1894efafacac90615e549 cb 8432 c 125 d 912 a 5 e 54 ce 4884 f 633 f 3 e 96 bd 7 b 61 c 1 d 538 e 38713716367 f 7 ec 6 f 5 ca 01288 e 6 d 96 ad 9 e 3 d 6515147369144390 e 1 d 002 b 1 beaf 5797966 e 3 b 498 cc 7 def 754816 c 99456 ef 380 b 3 a 83366 a 44415 f 6試験データ本論文で示したアルゴリズムは非対称アルゴリズムであり、計算が遅い.SSLでは、非対称アルゴリズムは、クライアントとサーバとの間で対称暗号化された使い捨て鍵を交換するために使用される.クライアントは、サーバが秘密鍵を持っている場合、サーバの公開鍵で乱数を暗号化してサーバに送信します.暗号を解いて乱数を得ることができます(この乱数は対称アルゴリズムの鍵です).対称アルゴリズムの鍵があれば、双方は対称暗号化で安全に通信することができます.Javaとビッグデータを学ぶ友达を歓迎してjavaアーキテクチャ交流:855835163加群リンク:https://jq.qq.com/?_wv=1027&k=5dPqXGIグループ内で無料のアーキテクチャ資料を提供するには、Javaエンジニアリング、高性能と分布式、高性能、深入浅出があります.高アーキテクチャ.パフォーマンスチューニング、Spring、MyBatis、Nettyソース分析、ビッグデータなど多くの知識ポイントの高級進級乾物の無料生放送説明は、一緒に勉強して交流することができます.生放送教室のアドレス:https://ke.qq.com/course/260263?flowToken=1007014