javaで実現されたRSA暗号化アルゴリズムの詳細解


本明細書の例は、java実装のRSA暗号化アルゴリズムを説明する。皆さんに参考にしてあげます。具体的には以下の通りです。
一、何が非対称暗号化ですか?
1、暗号化された鍵は暗号化された鍵とは違っています。このような暗号化アルゴリズムを非対称暗号化と呼びます。
2、鍵は公開鍵、秘密鍵に分けられます。
公開鍵:誰に対しても暗号化と暗号解読が可能なパスワードは公開されています。
秘密鍵:秘密鍵で公開鍵を生成することができますが、公開鍵から公開鍵を生成できないと考えられています。
3、暗号化するコンテンツを公開鍵で暗号化する場合は、秘密鍵でしか復号できません。
暗号化するコンテンツを秘密鍵で暗号化する場合は、公開鍵でしか復号できません。
4、公開鍵と秘密鍵の関係は、簡単な数式を用いて公開鍵と秘密鍵、すなわち非対称暗号化の公開鍵と秘密鍵との間にある数式関係を生成する。
5、一般的な非対称暗号化アルゴリズム
RSA、DSA
二、RSAアルゴリズムは何ですか?
RSAアルゴリズムは非対称暗号アルゴリズムであり、非対称とは、このアルゴリズムは一対の鍵を必要とし、その中の一つの暗号を使用すると、もう一つの暗号を解読することができる。
RSAのアルゴリズムは、3つのパラメータ、n、e 1、e 2に関する。
ここで、nは2つの大きな素数p,qの積であり、nのバイナリ表現で占有されるビット数は、いわゆる鍵長である。
e 1とe 2は一対の相関値であり、e 1は任意に取り得るが、e 1と(p-1)*(q-1)の相互性が要求される。e 2を選択して、(e 2*e 1)mod((p-1)*(q-1)=1を要求します。
(n,e 1)、(n,e 2)は鍵ペアです。ここで(n,e 1)は公開鍵であり、(n,e 2)は秘密鍵である。
RSAは解読のアルゴリズムをプラスして完全に同じで、Aを明文にして、Bを密文にして、A=B^e 2 mod n;B=A^e 1 mod n;(公開鍵暗号化システムでは、一般的に公開鍵で暗号化され、秘密鍵が復号されます。
e 1とe 2は交換して使用することができます。
A=B^e 1 mod n;B=A^e 2 mod n
三、RSA暗号化アルゴリズムの使用
1、RSA鍵の生成は、KeyPairオブジェクトに戻ります。
KeyPairは非対称暗号化に使用され、KeyPairには公開鍵と秘密鍵が含まれています。

/**
*                   
* @param keySize     1024,2048 ,     1024
* @return
*/
public static KeyPair generateRSAKeyPair(int keySize){
    KeyPair ret = null;
    try {
      //1、    
      KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
      //2、   ,      
      generator.initialize(keySize);
      //3、  ,    
      ret = generator.generateKeyPair();
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
    }
    return ret;
}

2、秘密鍵と公開鍵の取得
PublicKeyとPrivate Keyは全部Keyタイプです。

KeyPair keyPair = EncryptUtil.generateRSAKeyPair(1024);
//    ,      
PublicKey publicKey = keyPair.getPublic();
 //    
PrivateKey privateKey = keyPair.getPrivate();

3、RSA暗号化

/**
* RSA   
* @param data        
* @param key     PublicKey,    PrivateKey
* @return
*/
public static byte[] rsaEncrypt(byte[] data ,Key key){
    byte[] ret = null;
    if (data != null
        && data.length>0
        && key!=null) {
      // 1、  Cipher   RSA
      try {
        Cipher cipher = Cipher.getInstance("RSA");
        //  Key
        cipher.init(Cipher.ENCRYPT_MODE,key);
        ret = cipher.doFinal(data);
      } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
      } catch (NoSuchPaddingException e) {
        e.printStackTrace();
      } catch (InvalidKeyException e) {
        e.printStackTrace();
      } catch (BadPaddingException e) {
        e.printStackTrace();
      } catch (IllegalBlockSizeException e) {
        e.printStackTrace();
      }
    }
    return ret;
}

4、RSA復号

/**
* RSA   
* @param data       
* @param key     PublicKey,    PrivateKey
* @return
*/
public static byte[] rsaDecrypt(byte[] data ,Key key){
    byte[] ret = null;
    if (data != null
        && data.length>0
        && key!=null) {
      // 1、  Cipher   RSA
      try {
        Cipher cipher = Cipher.getInstance("RSA");
        //  Key
        cipher.init(Cipher.DECRYPT_MODE,key);
        ret = cipher.doFinal(data);
      } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
      } catch (NoSuchPaddingException e) {
        e.printStackTrace();
      } catch (InvalidKeyException e) {
        e.printStackTrace();
      } catch (BadPaddingException e) {
        e.printStackTrace();
      } catch (IllegalBlockSizeException e) {
        e.printStackTrace();
      }
    }
    return ret;
}

5、公開鍵と秘密鍵の保存
公開鍵と秘密鍵のペアが作成されたら、保存してから使用します。

//       
PrivateKey privateKey = keyPair.getPrivate();
PublicKey publicKey = keyPair.getPublic();
//   PublicKey PrivateKey         ,        、       
byte[] publicKeyEncoded = publicKey.getEncoded();
byte[] privateKeyEncoded = privateKey.getEncoded();
//       Base64               
String publickey = Base64.encodeToString(publicKeyEncoded, Base64.NO_WRAP);
String privatekey = Base64.encodeToString(privateKeyEncoded, Base64.NO_WRAP);
//      
 。。。。

6、公開鍵と秘密鍵のロード
通常1、鍵ペア2を取得し、公開鍵、秘密鍵3を取得し、公開鍵、秘密鍵を保存し、保存形式は基本的に文字列形式である。
その後の使用では、公開鍵と秘密鍵を取得して使用する必要があります。
知っている必要があります
6.1、KeyFactoryは、対応する公開鍵と秘密鍵をロードすることができる。
6.2、公開鍵ローディングはX509EncodedKeySpec(byte[])を使用する。
6.3、秘密鍵のロードはPCKS8EncodedKeySpec(byte[])を使用する。

//    
//str_publickey           (      byte[]        )
//  
byte[] publicdecode = Base64.decode(new String(str_publickey), Base64.NO_WRAP);
//  X509EncodedKeySpec  
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicdecode);
//      
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
//    
PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);
//  
//    
//str_private            
byte[] privatedecode = Base64.decode(new String(str_private), Base64.NO_WRAP);
//  X509EncodedKeySpec  
PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(privatedecode);
//      
keyFactory = KeyFactory.getInstance("RSA");
//    
PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);

PS:暗号解読に興味のある友達は、当駅のオンラインツールも参照できます。
MD 5オンライン暗号化ツール:
http://tools.jb51.net/password/CreateMD5Password
雷、快速、旋風URL暗号化/復号ツール:
http://tools.jb51.net/password/urlrethunder
オンラインハッシュ/ハッシュアルゴリズム暗号化ツール:
http://tools.jb51.net/password/hash_encrypt
オンラインMD 5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160暗号化ツール:
http://tools.jb51.net/password/hash_md 5_share
オンラインshar 1/shar 224/shar 256/shar 384/shar 512暗号化ツール:
http://tools.jb51.net/password/sha_アンコール
java関連の内容についてもっと興味がある読者は、当駅のテーマを調べてもいいです。「Java数学演算技術のまとめ」、「Javaデータ構造とアルゴリズム教程」、「Java文字と文字列操作テクニックのまとめ」、「java日付と時間操作テクニックのまとめ」、「Java操作DOMノード技術のまとめ」、「Javaキャッシュ操作テクニックのまとめ
本論文で述べたように、皆さんのjavaプログラムの設計に役に立ちます。