RSA加密算法

74 阅读2分钟
package org.example.test;


import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;

public class RSATest {
        public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, InvalidKeySpecException {


//            KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
//            keyGen.initialize(2048);
//            KeyPair keyPair = keyGen.generateKeyPair();
//
//            Cipher cipher = Cipher.getInstance("RSA");
//            PublicKey publicKey = keyPair.getPublic();
//            PrivateKey aPrivate = keyPair.getPrivate();
//
//            System.out.println(Base64.getEncoder().encodeToString(publicKey.getEncoded()));
//
//
//            System.out.println(Base64.getEncoder().encodeToString(aPrivate.getEncoded()));






            String publicKeyStr = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjPLVIo+ytnZ6fNlE7JQdZyWGHvWwKIdsvwqNy5iCNyVncHq6oc8TKdDk1W0zawCKQScZVifa+XKtnuaHwsOnx2nG1Q8xCbYEniJLSi3e+dl8FcUV3fI4g7Hofqc/kJ5KENUR3iqWYUa0OMq/KOiTafr1RBm/drQkmuH9S/zoDuFZFi3bZMfdhw0AiDD6IGU82lU0Ds95GFJLJfw3KLFdZLX3zqaB1HWiDgoBuzmq5jef7TpGYFS74jbhSuJ3UqJG+JyHTCuAXnS2KapiZ9N5n/J0RYelvbo5GKcb/njhJKjZNwwm4H2lVv4/DyEY1yG0sl44bnWG6w0+Wccr8jzxyQIDAQAB";

            String privateKeyStr  = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCM8tUij7K2dnp82UTslB1nJYYe9bAoh2y/Co3LmII3JWdwerqhzxMp0OTVbTNrAIpBJxlWJ9r5cq2e5ofCw6fHacbVDzEJtgSeIktKLd752XwVxRXd8jiDseh+pz+QnkoQ1RHeKpZhRrQ4yr8o6JNp+vVEGb92tCSa4f1L/OgO4VkWLdtkx92HDQCIMPogZTzaVTQOz3kYUksl/DcosV1ktffOpoHUdaIOCgG7OarmN5/tOkZgVLviNuFK4ndSokb4nIdMK4BedLYpqmJn03mf8nRFh6W9ujkYpxv+eOEkqNk3DCbgfaVW/j8PIRjXIbSyXjhudYbrDT5ZxyvyPPHJAgMBAAECggEAB3IUfDznDeh4U/wOPgkc/IPo792+roVo4zalgunNhyg8rJ5vGXkc5Aqa7ANWwgJHS2XLWtfEI4VBUrGO3mUDie82h67DwmWRHOFm5MZDjyNEAMpme1D+V0agp4AiRXt3Iih/RyMsynq3roBXVMvkbabKKgzKJnUhseTaQpdbkt2UMipGeC0tpRjD6UpbD9r0YPeZneQd/hCUMoXjimyU0skv8oqx5th/e5EPeNqbNJ9X+JmYukpuVEhQ55sXz8WLi87+t22v6W3+dMiHb8/FWr9hXMI0ZKulrbs6Vw8kXLF0PAOug3ekWZJ0wJmJhgQSAqhJnlofityjj4Mi+TLlGQKBgQDk1Wu6hDRmKbFKHOzSGV7sxPuo94wVOKbayJvpwxZ9OF8yDIt0ocDj0l4KJ90IKS/4HwDN1yS5wl64DXA3F1u4HfCsHBc78bMS/Lbjgzn2F37QzP+Viu0z2VpOCo0CxznIfCvV/quwoqJG8FWYpQFkjeGNJ3ovI/jNbVOwLMvR4wKBgQCdrnV5SGv+Espon794wrKWyAEPo6HA4kobZMOuPhvkgkNYMNQtxKUwsj2QNLSgbd4N2tPFcp9THbnnSUccFQTx12CwRJsxaYJ/CFlgZvNYdVHDZ7Qyl6jowAvf+W5/3+M9SNuxOOqq0SNzYjZE7KW1is5I4dfbVAHGiqSyBcjNYwKBgHHwsotUeKLF77jvXhve9hz+mDAx0lZetvYJHVjwAqqm/v90r5uLTvghLyHvZ2dA2tm41jWoAmlcFr2eM1m7D7hFcCjCc+8tEfVKT+ZI2PtoB4UADeLwIdvHRefF6SCRAnyJF2qeO+7fi922nWg8AM2It94I4hXG24OuBBWcuH/xAoGAfo2BnTjB6+Y666Oi8hIZcajOKTYkYYF9BuVlpBgXHNxrnoF6Gc2k4yN7A505hzUGrkn+A4+OThAin32Rg/lewZch8/bsM8lBwiD6UsPt9QYb/F/kIWLVXxCbt0QjKqCPaiVqpZ9PwI8gC8A8XC8uhDkGfTo9m7udvTKTIoo/8o8CgYA+RUKGFvcE+gYp+LNqwZP9MX9KpP1EfASErM8jfdhlOCzyFLfrYZEj9+GQEvH+BGOAGA9H23jH8BAD06rq3HxwZ6GVjCiV6Zu8jcg1ihm65snekSb8dyN9u4OsRrIhva3dOtPXp3fMOI5IrrCNIBvZtD+Dq1p/7fqn6ZL5C9JsHA==";

            byte[] publicKeyStrDecode = Base64.getDecoder().decode(publicKeyStr);


            X509EncodedKeySpec spec = new X509EncodedKeySpec(publicKeyStrDecode);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            PublicKey publicKey = keyFactory.generatePublic(spec);

            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            byte[] cipherTextBytes = cipher.doFinal("你好呀".getBytes(StandardCharsets.UTF_8));
            String encryptedText = Base64.getEncoder().encodeToString(cipherTextBytes);

            System.out.println(encryptedText);


            // 用私钥解密
            byte[] privateKeyStrDecode = Base64.getDecoder().decode(privateKeyStr);
            PKCS8EncodedKeySpec  spec1 = new PKCS8EncodedKeySpec(privateKeyStrDecode);
            PrivateKey privateKey = keyFactory.generatePrivate(spec1);
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
            String decryptedText = new String(decryptedBytes, StandardCharsets.UTF_8);

            System.out.println(decryptedText);
        }
}