RSAキーペア、暗号化、復号化


RSAキーペア
最近のプロジェクトでは、送信したデータの暗号化と復号化が要求されているので、RSA非対称暗号化を用いているので、ここに記録しておきます.
まずRSA暗号化アルゴリズムとは何かをご紹介しましょう(コピー)
RSA暗号化アルゴリズムは非対称暗号化アルゴリズムである.公開鍵暗号化や電子商取引ではRSAが広く用いられている.RSAは1977年にロナルド・リーベスター(Ron Rivest)、アディ・サモア(Adi Shamir)とレンナード・アドマン(Leonard Adleman)とともに提案された.当時彼ら3人はマサチューセッツ工科大学に勤務していた.RSAは彼ら3人の姓の頭文字を綴ったものである.公開鍵暗号体制では暗号鍵PKは公開情報であり、復号鍵(秘密鍵)SKは秘密にする必要がある.暗号化アルゴリズムEと復号アルゴリズムDも公開されている.復号鍵SKは公開鍵PKによって決定されるが、大数nのEuler関数phi(N)を算出することはできないため、PKに基づいてSKを算出することはできないという理論に基づいて1978年に有名なRSAアルゴリズムが登場し、通常、一対のRSA鍵が生成され、そのうちの1つは秘密鍵であり、ユーザによって保存される.もう1つは公開鍵であり、外部に公開することができ、ネットワークサーバに登録することもできる.秘密保持強度を向上させるために、RSA鍵は少なくとも500ビット長であり、一般的に1024ビットの使用が推奨される.これにより、暗号化の計算量が大きくなります.計算量を減らすために、情報を送信する際には、従来の暗号化方法と公開鍵暗号化方法とを組み合わせた方法、すなわち、情報は改良されたDESまたはIDEA鍵で暗号化され、その後、RSA鍵を用いて対話鍵および情報要約が暗号化されることが多い.相手が情報を受け取った後、異なる鍵で復号し、情報の要約を確認することができる.RSAアルゴリズムは暗号化とデジタル署名を同時に使用できる最初のアルゴリズムであり、理解と操作も容易である.RSAは最も広く研究されている公開鍵アルゴリズムであり、提案から現在までの30年以上にわたって様々な攻撃の試練を経て徐々に受け入れられ、2017年までに最も優れた公開鍵案の一つとされている.
出典:https://www.jianshu.com/p/d614ba4720ec
データの暗号化と復号化の手順を次に示します.
public class RSAGenerator{
     
   public static void main(String[] args) throws Exception {
     

        String data = "abc";
        KeyPair keyPair = generateRSAKeyPair(DEFAULT_KEY_SIZE);
        PublicKey aPublic = keyPair.getPublic(); //   
        PrivateKey aPrivate = keyPair.getPrivate(); //   
        String strPriKey = new String(Base64.getEncoder().encode(aPrivate.getEncoded()));
        String strPubKey = new String(Base64.getEncoder().encode(aPublic.getEncoded()));

        System.out.println(strPubKey);
        System.out.println("-------------");
        System.out.println(strPriKey);
        System.out.println("--------------");
        System.out.println("    ");
        System.out.println("vvvvvvvvvvvv");
        byte[] encrypt = encrypt(data.getBytes(), aPublic);
        System.out.println(new String(encrypt));
        System.out.println("    ");
        System.out.println("vvvvvvvvvvvv");
        byte[] bytes1 = decrypt(encrypt, aPrivate);
        System.out.println(new String(bytes1));


    }

    public static final String RSA = "RSA";//          
    public static final String ECB_PKCS1_PADDING = "RSA/ECB/PKCS1Padding";//      
    public static final int DEFAULT_KEY_SIZE = 1024;//      
    public static final byte[] DEFAULT_SPLIT = "#PART#".getBytes();    //          bufferSize,   partSplit      
    public static final int DEFAULT_BUFFERSIZE = (DEFAULT_KEY_SIZE / 8) - 11;//               

    public static KeyPair generateRSAKeyPair(int keyLength) {
     
        try {
     
            KeyPairGenerator kpg = KeyPairGenerator.getInstance(RSA);
            kpg.initialize(keyLength);
            return kpg.genKeyPair();
        } catch (NoSuchAlgorithmException e) {
     
            e.printStackTrace();
            return null;
        }
    }


    //    
    public static byte[] encrypt(byte[] content, PublicKey publicKey) throws Exception{
     
        Cipher cipher=Cipher.getInstance(ECB_PKCS1_PADDING);//java  "RSA"="RSA/ECB/PKCS1Padding"
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        return cipher.doFinal(content);
    }

    //    
    public static byte[] decrypt(byte[] content, PrivateKey privateKey) throws Exception{
     
        Cipher cipher=Cipher.getInstance(ECB_PKCS1_PADDING);
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        return cipher.doFinal(content);
    }
}