RSA暗号化アルゴリズム
RSAの暗号化アルゴリズムを確認しましょう。比較的標準化された言語を使用して、公開キー暗号化アルゴリズムと署名アルゴリズムの定義に基づいてこのアルゴリズムを説明します。
RSA公開キー暗号化システムには、次の3つのアルゴリズムが含まれています:keygen(キー生成アルゴリズム)、暗号化(暗号化)、復号化(復号化アルゴリズム)。
キージェネレーションアルゴリズムは、公開キーPKと秘密キーSKを出力するために入力としてセキュリティ定数を使用します。セキュリティ定数は、暗号化アルゴリズムの安全性を決定するために使用されます。これは、一般に、暗号化アルゴリズムで使用される素数Pのサイズに関連しています。素数Pが大きいほど、システムは大きくなり、セキュリティが高くなります。 RSAでは、キー生成アルゴリズムは次のとおりです。アルゴリズムは最初に2つの異なる大きな素数pとqをランダムに生成し、n = pqを計算します。次に、アルゴリズムはオイラー関数を計算します。次に、アルゴリズムはeより低い整数をランダムに選択し、eの弾性逆等要素dを計算します。最後に、公開キーはPK =(n、e)で、秘密鍵はsk =(n、d)です。
暗号化アルゴリズムは、公開キーPKとメッセージmを使用して、入力として暗号化され、暗号文CTを出力します。 RSAでは、暗号化アルゴリズムは次のとおりです。アルゴリズムは、復号化アルゴリズムが秘密キーSKと暗号文CTを入力として使用するため、暗号文を直接出力し、RSAのメッセージMを出力します。 EとDは互いに反比例しているため、次のようになります。
したがって、アルゴリズムの説明から、公開キーを使用してデータを暗号化することも確認でき、秘密鍵はデータを復号化するために使用されます。もちろん、これは直感的に理解することもできます。公開鍵は公開鍵であり、それが開示された場合にのみ、誰もがデータを暗号化するためにそれを使用できます。秘密鍵は秘密鍵であり、このキーを持っている人は誰でも暗号文を復号化できます。そうでなければ、誰もが秘密鍵を見てそれを復号化できる場合、それは混乱になります。
Javaの簡単な実装を見てみましょう。
パッケージcom.stone.security; java.security.keypairをインポートします。 java.security.keypairgeneratorをインポートします。 java.security.privatekeyをインポートします。 java.security.publickeyをインポートします。 java.util.arraysをインポートします。 javax.crypto.cipherをインポートします。 / *** RSAアルゴリズム公開キー暗号化非対称暗号化*/ public class rsa {public static final string key_algorithm = "rsa"; public static final string cipher_algorithm_ecb1 = "rsa/ecb/pkcs1padding"; public static final string cipher_algorithm_ecb2 = "rsa/ecb/oaepwithsha-1andmgf1padding"; // public static final string cipher_algorithm_ecb3 = "oaepwithsha-256andmgf1padding"を使用することはできません。 // static publickey publickeyを使用することはできません。 Static PrivateKey PrivateKey;静的暗号暗号;静的キーペアキーペア。 public static void main(string [] args)throws exception {method1( "skoda u*(sfsad7f()*^%% $"); method2( "skoda u*(sfsad7f()*^%% $"); method3( "skoda u*(sfsad7f()*^red"); cipher_algorithm_ecb1 * @param strows例外 *(string str)スロー{keypairgenerator = keypairgenerator.getinstance(key_algorithm) keypair.getPrivate(); arrays.toString(necrypt); cipher_algorithm_ecb1 * @param str * @throws例外 */ static void method2(string str)throws exception {keypairgenerator keypairgenerator.getinstance(key_algorithm); keypair keypair = keygenerator.generatekeypair(); publicKey = keypair.getPublic(); privateKey = keypair.getPrivate(); cipher = cipher.getInstance(key_algorithm); cipher.init(cipher.encrypt_mode、privatekey); //秘密キー暗号化byte [] encrypt = cipher.dofinal(str.getBytes()); System.out.println( "秘密キー暗号化2:" + arrays.toString(encrypt)); cipher.init(cipher.decrypt_mode、publickey); // public Key Decrypt byte [] decrypt = cipher.dofinal(encrypt); System.out.println( "public Key Decrypt 2:" + new String(decrypt)); }/** *秘密鍵暗号化、公開キーの復号化はcipher_algorithm_ecb1 = rsa/ecb/pkcs1padding * @param str * @throws例外 */static void method3(string str)throws exception {keypairgenererator keygenerator = keypairgenerator。 keypair keypair = keygenerator.generatekeypair(); publicKey = keypair.getPublic(); privateKey = keypair.getPrivate(); cipher = cipher.getInstance(cipher_algorithm_ecb1); cipher.init(cipher.encrypt_mode、privatekey); //秘密キー暗号化byte [] encrypt = cipher.dofinal(str.getBytes()); System.out.println( "秘密キー暗号化3:" + arrays.toString(encrypt)); cipher.init(cipher.decrypt_mode、publickey); // public Key Decryption byte [] decrypt = cipher.dofinal(encrypt); system.out.println( "3公開キーの復号化後:" + new String(decrypt)); }} DSAアルゴリズムとデジタル署名
DSAは通常、デジタル署名と認証に使用されます。
DSAは、SchnorrおよびElgamal Signature Algorithmsのバリアントであり、米国のNISTによってDSS(デジタル署名標準)として使用されています。
DSAは、整数有限ドメイン離散対数問題に基づいており、そのセキュリティはRSAに似ています。
DSAデジタル署名と認証では、送信者は独自の秘密鍵を使用してファイルまたはメッセージに署名し、受信者はメッセージを受信した後に送信者の公開キーを使用して署名の信頼性を確認します。 DSAは単なるアルゴリズムであり、RSAの違いは、暗号化と復号化、キー交換にも使用できないことです。
署名のみの場合、RSAよりもはるかに高速です。
パッケージcom.stone.security; java.security.keyをインポートします。 java.security.keyfactoryをインポートします。 java.security.keypairをインポートします。 java.security.keypairgeneratorをインポートします。 java.security.privatekeyをインポートします。 java.security.publickeyをインポートします。 java.security.securerandomをインポートします。 java.security.signatureをインポートします。 java.security.spec.pkcs8encodedkeyspecをインポートします。 java.security.spec.x509encodedkeyspecをインポートします。 java.util.hashmapをインポートします。 java.util.mapをインポートします。 sun.misc.base64decoderをインポートします。 sun.misc.base64encoderをインポートします。 /*** DSA-Digital Signature Algorithmは、SchnorrおよびElgamal Signature Algorithmsのバリアントであり、米国のNISTによってDSSとして使用されます。 *要するに、これはデジタル署名として使用されるより高度な検証方法です。パブリックキーとプライベートキーだけでなく、デジタル署名も。秘密キー暗号化は、デジタル署名、公開キー検証データ、および署名を生成します。 *データと署名が一致しない場合、検証は失敗したと見なされます!つまり、送信のデータは暗号化できなくなりました。受信者がデータを取得した後、データが有効かどうかを確認するために公開キーと署名を取得します。 */ public class dsa {/ ***DSAアルゴリズムを使用できるだけでなく、デジタル署名にRSAアルゴリズムを使用することもできます*/ public static final string key_algorithm = "rsa"; public static final string signature_algorithm = "md5withrsa";*/ public static final string key_algorithm = "dsa"; public static final string signature_algorithm = "dsa"; public static final string default_seed = "$%^*%^()(hjg8awfjas7"; //デフォルトシードpublic static final string public_key = "dsapublickey"; public static final string private_key = "dsaprivatekey"; public static void main(String [] args)Throws Strows {String str = " you*()_ + "; byte [] data = str.getbytes(); map <string、object> keymap = initkey(); //キーpublickeypublickey =(publickey)keymap.get(public_key); privatekey privatekey =(privatekey)keymap.get(private_key); system.out.out.println(private keykey.get(); system.out.println( "signature sign = getprivatekey(keymap)を生成する公開キー形式:" verify1) } / *** KENATE KEY** @Param Seed Seed* @return Key Object* @Throws Exception* / public Static Map <String、object> initkey(string seed)throws exception {system.out.println( "generate key"); keypairgenerator keygen = keypairgenerator.getInstance(key_algorithm); securerandom securerandom = new Securerandom(); securerandom.setseed(seed.getBytes()); //モジュラスサイズは512〜1024の範囲で、64 keygen.Initialize(640、securerandom)の倍数である必要があります。 keypair keys = keygen.genkeypair(); privatekey privatekey = keys.getPrivate(); publicKey publicKey = keys.getPublic(); map <string、object> map = new hashmap <string、object>(2); map.put(public_key、publickey); map.put(private_key、privatekey);マップを返します。 } / ***デフォルトキーを生成** @returnキーオブジェクト* @Throws例外* / public static Map <string、object> initkey()throws exception {return initkey(default_seed); } / ** *秘密鍵を取得 * * @param keymap * @return * @throws例外 * / public static string getPrivateKey(Map <String、Object> KeyMap)スロー例外{key key =(key)keymap.get(private_key); return encryptbase64(key.getEncoded()); // base64暗号化秘密鍵}/** *公開キーを取得 * * @return * @return */public static string getpublickey(map <string、object> keymap)throws exception {key key =(key)keymap.get(public_key); return encryptbase64(key.getEncoded()); // base64暗号化公開キー}/** *秘密鍵を使用して情報にデジタルに署名します * @paramデータ暗号化されたデータ * @param privatekeyプライベートキー-base64 basypted * @return */public static string sign(byte [] data、string privatekey)throws exception byte [] keybytes = decryptbase64(privatekey); pkcs8encodedkeyspec keyspec = new pkcs8encodedkeyspec(keybytes); KeyFactory Factory = keyFactory.getInstance(key_algorithm); privateKey prikey = factory.genereTprivate(keyspec); // private key // grivate key signature signature = signature.getInstance(signature_algorithm); signature.initsign(prikey); signature.update(data); return encryptbase64(signature.sign()); } / *** base64Encoder encryption* @paramデータ暗号化されるデータデータ。 string encode = encoder.encode(data);エンコードを返します。 } / *** base64Decoder decrypt* @param data string to decrypted* @return decrypted byte []* @throws例外* / private staticbase64(] decryptbase64(string data)throws {base64decoder decoder = new base64decoder(); byte [] buffer = decoder.decodebuffer(data);バッファーを返します。 } / *** Digital Signatureの検証* @Param Data暗号化データ* @Param PublicKey* @Param Sign Digital Signature* @return* / Public Static Boolean Verify(byte [] data、string publickey、string sign)throws {byte [] keybytes = decryptbase64(publickey); X509ENCODEDKEYSPEC KEYSPEC = new X509ENCODEDKEYSPEC(keyBytes); KeyFactory keyFactory = keyFactory.getInstance(key_algorithm); publicKey pubkey = keyfactory.generepublic(keyspec);署名署名= signature.getInstance(signature_algorithm); signature.initverify(pubkey); signature.update(data); return signature.verify(decryptbase64(sign)); //署名を確認}}