最後にブログを書いてから長い時間が経ちました。最初に文句を言ってみましょう。今月、同社は残業し、出版物を公開し、立ち上げてきましたが、新しいプロジェクトは厳しすぎるので、特定のプロジェクトについてはあまり言いません。今日、非対称暗号化について話すことが本当に重要です。非対称の暗号化は、私たちの日常生活で不可欠です。
コンセプト
RSAについて話す前に、最初に非対称暗号化とは何かについて話しましょう。対称暗号化について話すとき、シンメット暗号化アルゴリズムは暗号化と復号化時に同じシークレットキーを使用し、暗号化および復号化するために両方の当事者が同じキーを使用して正常に通信する必要があるとかつて言われていました。非対称暗号化はそうではありません。非対称暗号化アルゴリズムには、暗号化および復号化するための2つのキー、つまり公開キーと秘密鍵が必要です。
注意すべきことの1つは、公開キーと秘密鍵はペアでなければならないということです。データが公開キーで暗号化されている場合、対応する秘密鍵のみを復号化でき、その逆も同様です。暗号化と復号化は2つの異なるキーを使用するため、このアルゴリズムは非対称暗号化アルゴリズムと呼ばれます。
作業プロセス
以下の図に示すように、データは非対称暗号化を使用して送信されます。
非対称暗号化で使用される主なアルゴリズムには、RSA、エルガマル、バックパックアルゴリズム、ラビン、DH、ECC(楕円曲線暗号化アルゴリズム)などが含まれます。今日、主にRSAを紹介します。他のアルゴリズムについては、後で紹介するためにいくつかを選択します。
RSA
実際、RSAは早くも1978年に登場し、データ暗号化とデジタル署名の両方に使用できる最初のアルゴリズムでした。理解して運営するのは簡単で、非常に人気があります。原則は、上記の作業プロセスで説明されているとおりです。
RSAアルゴリズムは非常に単純な数の理論の事実に基づいています。2つの大きな素数を掛けるのは簡単ですが、製品を因数分解することは非常に困難であるため、製品を暗号化キーとして開示できます。
コード実装
以下の特定のコード実装を見てみましょう。
com.google.common.collect.mapsをインポートします。 sun.misc.base64decoderをインポートします。 sun.misc.base64encoderをインポートします。 javax.crypto.cipherをインポートします。 Java.securityをインポート。*; java.security.interfaces.rsaprivatekeyをインポートします。 java.security.interfaces.rsapublickeyをインポートします。 java.security.spec.pkcs8encodedkeyspecをインポートします。 java.security.spec.x509encodedkeyspecをインポートします。 java.util.mapをインポートします。 /*** 2015/3/3にXiang.liによって作成されました。 * RSA暗号化と復号化ツールクラス*/パブリッククラスRSA {/ ***暗号化メソッドを定義*/プライベート最終静的文字列key_rsa = "rsa"; / ***署名アルゴリズムを定義します*/ private final static string key_rsa_signature = "md5withrsa"; / ***公開キーアルゴリズムを定義*/プライベート最終的な静的文字列key_rsa_publickey = "rsapublickey"; / *** private key algorithm*/ private final static string key_rsa_privatekey = "rsaprivatekey"; / ***初期化キー* @return*/ public static Map <string、object> init(){map <string、object> map = null; try {keypairgeneratorジェネレータージェネレーター= keypairgenerator.getInstance(key_rsa); Generator.Initialize(1024); keypair keypair = generator.generatekeypair(); // public Key rsapublickey publickey =(rsapublickey)keypair.getpublic(); // private key rsaprivatekey privatekey =(rsaprivatekey)keypair.getPrivate(); //マップとしてキーをカプセル化します。マップ= maps.newhashmap(); map.put(key_rsa_publickey、publickey); map.put(key_rsa_privatekey、privatekey); } catch(nosuchalgorithmexception e){e.printstacktrace(); }マップを返します。 } / ***秘密鍵を使用して情報のデジタル署名を生成* @paramデータ暗号化されたデータ* @param privatekey private key* @return* / public static string sign(byte [] data、string privatekey){string str = ""; try {//秘密キーエンコードされたbyte [] bytes = decryptbase64(privatekey)を復号化してください。 // PKCS8ENCODEDKEYSPECオブジェクトPKCS8ENCODEDKEYSPEC PKCS = new PKCS8ENCODEDKEYSPEC(BYTES)を作成します。 //指定された暗号化アルゴリズムKeyFactory Factory = keyFactory.getInstance(key_rsa); //プライベートキーオブジェクトを取得privatekey key = factory.generetprivate(pkcs); //秘密キーを使用して、情報署名署名= signature.getInstance(key_rsa_signature)にデジタル署名を生成します。 signature.initsign(key); signature.update(data); str = encryptbase64(signature.sign()); } catch(Exception e){e.printstacktrace(); } return str; } / ***デジタル署名の検証* @paramデータ暗号化されたデータ* @param publickey公開キー* @param sign signature* @return verify reverify reverify reverify return return true try {//公開キーエンコードされたbyte [] bytes = decryptbase64(publicKey); // X509ENCODEDKEYSPECオブジェクトX509ENCODEDKEYSPEC keyspec = new X509ENCODEDKEYSPEC(BYTES)を作成します。 //指定された暗号化アルゴリズムKeyFactory Factory = keyFactory.getInstance(key_rsa); //公開キーオブジェクトを取得しますpublickey key = factory.generepublic(keyspec); //公開キーの署名署名= signature.getInstance(key_rsa_signature)でデジタル署名を確認します。 signature.initverify(key); signature.update(data); flag = signature.verify(decryptbase64(sign)); } catch(Exception e){e.printstacktrace(); } flagを返します。 } / *** private key decrypt* @param data暗号化データ* @paramキー秘密キー* @return* / public static byte [] decryptbyprivatekey(byte [] data、string key){byte [] result = null; try {//秘密のキーバイト[] bytes = decryptbase64(key)を復号化してください。 //秘密キーを取得しますpkcs8encodedkeyspec keyspec = new PKCS8ENCODEDKEYSPEC(バイト); KeyFactory Factory = keyFactory.getInstance(key_rsa); privatekey privatekey = factory.genereTprivate(keyspec); //データcipher cipher = cipher.getInstance(factory.getalgorithm())を復号化する; cipher.init(cipher.decrypt_mode、privatekey); result = cipher.dofinal(data); } catch(Exception e){e.printstacktrace(); } return result; } / ***秘密キー復号化* @paramデータ暗号化データ* @paramキー公開キー* @return* / public static byte [] decryptbypublickey(byte [] data、string key){byte [] result = null; try {//公開キーバイト[] bytes = decryptbase64(key)を復号化してください。 //公開キーを取得x509EncodedKeyspec keyspec = new X509EncodedKeyspec(バイト); KeyFactory Factory = keyFactory.getInstance(key_rsa); publicKey publickey = factory.generepublic(keyspec); //データcipher cipher = cipher.getInstance(factory.getalgorithm())を復号化する; cipher.init(cipher.decrypt_mode、publickey); result = cipher.dofinal(data); } catch(Exception e){e.printstacktrace(); } return result; } / ***公開キー暗号化* @paramデータ暗号化される* @paramキー公開キー* @return* / public static byte [] encryptbypublickey(byte [] data、string key){byte [] result = null; try {byte [] bytes = decryptbase64(key); //公開キーを取得x509EncodedKeyspec keyspec = new X509EncodedKeyspec(バイト); KeyFactory Factory = keyFactory.getInstance(key_rsa); publicKey publickey = factory.generepublic(keyspec); //データCipher cipher = cipher.getInstance(factory.getalgorithm()); cipher.init(cipher.encrypt_mode、publickey); result = cipher.dofinal(data); } catch(Exception e){e.printstacktrace(); } return result; } / *** private key encryption* @paramデータ暗号化される* @paramキー秘密キー* @return* / public static byte [] encryptbyprivatekey(byte [] data、string key){byte [] result = null; try {byte [] bytes = decryptbase64(key); //秘密キーを取得しますpkcs8encodedkeyspec keyspec = new PKCS8ENCODEDKEYSPEC(バイト); KeyFactory Factory = keyFactory.getInstance(key_rsa); privatekey privatekey = factory.genereTprivate(keyspec); //データCipher cipher = cipher.getInstance(factory.getalgorithm()); cipher.init(cipher.encrypt_mode、privatekey); result = cipher.dofinal(data); } catch(Exception e){e.printstacktrace(); } return result; } / ** *公開キーを取得 * @param map * @return * / public static string getPublickey(Map <String、Object> Map){String Str = ""; try {key key =(key)map.get(key_rsa_publickey); str = encryptbase64(key.getencoded()); } catch(Exception e){e.printstacktrace(); } return str; } / ** *秘密鍵を取得 * @param map * @return * / public static string getPrivateKey(Map <String、Object> Map){string str = ""; try {key key =(key)map.get(key_rsa_privatekey); str = encryptbase64(key.getencoded()); } catch(Exception e){e.printstacktrace(); } return str; } / *** base64 decrypt* @paramキー文字decrypted* @return byte array* @throws例外* / public staticbase64(string key)throws {return(new base64decoder())。decodebuffer(key); } / *** base64 encryption* @paramキーバイトアレイを暗号化する必要がある* @return string* @throws例外* / public static string encryptbase64(byte [] key)throws {return(new base64encoder())。encodebuffer(key); } / *** test method* @param args* / public static void main(string [] args){string privatekey = "";文字列publickey = ""; //公開キーの秘密鍵マップ<string、object> map = init(); publicKey = getPublickey(Map); privateKey = getPrivateKey(MAP); system.out.println( "public key: /n /r" + publicKey); system.out.println( "private key: /n /r" + privatekey); System.out.println("Public key encryption------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- "; byte[] encWord = EncryptBublickey(Word.getBytes()、publicKey); encryption---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- EncryptbyPrivateKey(English.getBytes()、privateKey); string deanglish = new String(decryptbypublickey(encenglish、publickey)); system.out.println( "before encryption:" + english + "/n/r" + "decryption:" + eminglish); system.out.println( "private key signature-publicキー検証署名"); //署名文字列sign = sign(encenglish、privatekey)を生成します。 System.out.println( "signature:/r" + sign); //署名ブールステータスを確認= verify(encenglish、publickey、sign); System.out.println( "status:/r" + status); }}結果を暗号化および復号化します
結論
実際、一見複雑なプロセスについて説明することができます。1つの文で説明できます。公開キー暗号化と秘密鍵の復号化を使用して、パーティBからパーティAへの1つのデータ転送が完了し、秘密キー暗号化と公開キーの復号化を介して、同時に、秘密キーシグネチャーと公開キー検証署名を介して、パーティーAからパーティーBへの1つのデータ転送と検証が完了します。
非対称暗号化アルゴリズムの出現は、暗号化と1つのキーのみを解読する問題を解決することです。このキーが紛失または開示されている限り、暗号化されたデータは簡単に攻撃されます。同時に、それはまさに、その後のデジタル署名、デジタル証明書などが取得されるという非対称暗号化アルゴリズムの出現のためです。
さて、今日ここでやめましょう。次の記事では、非対称暗号化を継続します。どちらについて、私はその時に知っています。ここで最初に秘密にしてください