【Java工具类】非对称加密之RSA算法工具类

import javax.crypto.Cipher;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

/**
 * 非对称加密RSA算法工具类
 */
public class RSACoder {
    
    
    //非对称密钥算法
    public static final String KEY_ALGORITHM = "RSA";
    /**
     * RSA密钥长度必须是64的倍数,在512~65536之间。默认是1024
     */
    public static final int KEY_SIZE = 2048;

    //公钥
    private static final String PUBLIC_KEY = "publicKey";

    //私钥
    private static final String PRIVATE_KEY = "privateKey";


    /**
     * 初始化密钥对
     *
     * @return Map 甲方密钥的Map
     */
    public static Map<String, Object> initKey() throws Exception {
    
    
        //实例化密钥生成器
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM);

        //初始化密钥生成器
        keyPairGenerator.initialize(KEY_SIZE);

        // 生成一个密钥对,保存在keyPair中
        KeyPair keyPair = keyPairGenerator.generateKeyPair();

        //甲方公钥
        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
        System.out.println("系数:" + publicKey.getModulus() + "  加密指数:" + publicKey.getPublicExponent());

        //甲方私钥
        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
        System.out.println("系数:" + privateKey.getModulus() + "解密指数:" + privateKey.getPrivateExponent());

        //将密钥存储在map中
        Map<String, Object> keyMap = new HashMap<String, Object>();
        keyMap.put(PUBLIC_KEY, publicKey);
        keyMap.put(PRIVATE_KEY, privateKey);
        return keyMap;

    }



    /**
     * 公钥加密
     *
     * @param data 待加密数据
     * @param key  密钥
     * @return byte[] 加密数据
     */
    public static byte[] encryptByPublicKey(byte[] data, byte[] key) throws Exception {
    
    

        //实例化密钥工厂
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        //初始化公钥
        //密钥材料转换
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);
        //产生公钥
        PublicKey pubKey = keyFactory.generatePublic(x509KeySpec);

        //数据加密
        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
        cipher.init(Cipher.ENCRYPT_MODE, pubKey);
        return cipher.doFinal(data);
    }

    /**
     * 私钥解密
     *
     * @param data 待解密数据
     * @param key  密钥
     * @return byte[] 解密数据
     */
    public static byte[] decryptByPrivateKey(byte[] data, byte[] key) throws Exception {
    
    
        //取得私钥
        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        //生成私钥
        PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
        //数据解密
        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        return cipher.doFinal(data);
    }


    /**
     * 私钥加密
     *
     * @param data 待加密数据
     * @param key  密钥
     * @return byte[] 加密数据
     */
    public static byte[] encryptByPrivateKey(byte[] data, byte[] key) throws Exception {
    
    
        //取得私钥
        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key);
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        //生成私钥
        PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
        //数据加密
        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
        cipher.init(Cipher.ENCRYPT_MODE, privateKey);
        return cipher.doFinal(data);
    }

    /**
     * 公钥解密
     *
     * @param data 待解密数据
     * @param key  密钥
     * @return byte[] 解密数据
     */
    public static byte[] decryptByPublicKey(byte[] data, byte[] key) throws Exception {
    
    

        //实例化密钥工厂
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        //初始化公钥
        //密钥材料转换
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key);
        //产生公钥
        PublicKey pubKey = keyFactory.generatePublic(x509KeySpec);
        //数据解密
        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
        cipher.init(Cipher.DECRYPT_MODE, pubKey);
        return cipher.doFinal(data);
    }

    /**
     * 取得私钥
     *
     * @param keyMap 密钥map
     * @return byte[] 私钥
     */
    public static byte[] getPrivateKey(Map<String, Object> keyMap) {
    
    
        Key key = (Key) keyMap.get(PRIVATE_KEY);
        return key.getEncoded();
    }

    /**
     * 取得公钥
     *
     * @param keyMap 密钥map
     * @return byte[] 公钥
     */
    public static byte[] getPublicKey(Map<String, Object> keyMap) throws Exception {
    
    
        Key key = (Key) keyMap.get(PUBLIC_KEY);
        return key.getEncoded();
    }

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
    
    
        //初始化密钥
        //生成密钥对
        Map<String, Object> keyMap = RSACoder.initKey();

        //公钥
        byte[] publicKey = RSACoder.getPublicKey(keyMap);
        System.out.println("\n公钥:" +  Base64.getEncoder().withoutPadding().encodeToString(publicKey));//由于加密后的密文都是字节码形式的,我们要以字符串方式保存或传输的话,可以使用Base64编码。
        //私钥
        byte[] privateKey = RSACoder.getPrivateKey(keyMap);
        System.out.println("\n私钥:" + Base64.getEncoder().withoutPadding().encodeToString(privateKey));//由于加密后的密文都是字节码形式的,我们要以字符串方式保存或传输的话,可以使用Base64编码。


        System.out.println("\n===========1.公钥加密,私钥解密==============");
        String str = "aattaggcctegthththfef/aat.mp4";
        System.out.println("原文:" + str);

        //使用公钥进行数据的加密
        byte[] code1 = RSACoder.encryptByPublicKey(str.getBytes(), publicKey);
        System.out.println("公钥加密后的数据:" +   Base64.getEncoder().withoutPadding().encodeToString(code1));
        //使用私钥进行数据的解密
        byte[] decode1 = RSACoder.decryptByPrivateKey(code1, privateKey);
        System.out.println("私钥解密后的数据:" + new String(decode1));


        System.out.println("\n===========2.反向进行操作,私钥加密,公钥解密==============");
        str ="4b9d373bed9f40b389f0e42ebaf729b4";
        System.out.println("原文:" + str);

        //使用私钥进行数据的加密
        byte[] code2 = RSACoder.encryptByPrivateKey(str.getBytes(), privateKey);
        System.out.println("私钥加密后的数据:" +Base64.getEncoder().withoutPadding().encodeToString(code2));
        //使用公钥进行数据的解密
        byte[] decode2 = RSACoder.decryptByPublicKey(code2, publicKey);
        System.out.println("公钥解密后的数据:" + new String(decode2));
    }
}

main方法执行结果

系数:25673086491181252696735907678323359012290479118460249182240942943781022994992575396590727636402349564925636011579483415535025350805322419881144350331454228457159864635273352797075670117225640053564150779878581672826043466730442466562220815297498994632148250863062496794801485613090601179615469513565622072320713419491283100791224145056532853893350394503766393820017518906472919715328843855105481040100067458333759790298618468832658166599809135248953553073655427587148287992213804301398790107769457487285016468303621342838245142810915126734720967207513720464121646170199288480519720222247070607912244425592472384699833  加密指数:65537
系数:25673086491181252696735907678323359012290479118460249182240942943781022994992575396590727636402349564925636011579483415535025350805322419881144350331454228457159864635273352797075670117225640053564150779878581672826043466730442466562220815297498994632148250863062496794801485613090601179615469513565622072320713419491283100791224145056532853893350394503766393820017518906472919715328843855105481040100067458333759790298618468832658166599809135248953553073655427587148287992213804301398790107769457487285016468303621342838245142810915126734720967207513720464121646170199288480519720222247070607912244425592472384699833解密指数:5951226482353870194986220142043249921642994930613975396746943027632044514395337067992223236526305668406400388908792163950258710795954318977590444637921367147125633818134378682166922203043958736190954402061666124076067753277825990692483003890925808725629739339787378905147079808872429514941456167509787303701594458366179085655994722382066825611874856877831944821823855957870861590255730073317554239720440140157947209450604893997531142179043822700188495148788044375693219726672614185030409346413260290559526517250002718058539432864497234239894526319410363940220217629293027556378044752569803302642220451834422341413473

公钥:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy165kj4sGDx2rtzHZmTrA++C7LiCX8j7J0OI0MwnLSDp1lNaVsrBU0u1UNHuaKAXzAvDZI8U1rm6cHfh9AhCePNTY2JwCTwf/Xnj1/S7OreIpxxaGuRbnVwCcFbDQ/S8JSpD4bYe5LrkKk1WW15tA6ZaLq1gcbfgRw3ZCB5wkqI4T7jrapS2uNpeGYKdXYRCwArlPSTr3UB33IKA4DXVzE0Gop97GJ4lT+HeewfBUQ7rkIOMka85NL+yi0yB34kHX4uqaySMWe4edNXGJDC1lRxCYTo7QBPBSqS5ibeHpn8Z3RRiYpWRv0UkC75FUyN3yudUhBDAKoOdIuiF2+H9uQIDAQAB

私钥:MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDLXrmSPiwYPHau3MdmZOsD74LsuIJfyPsnQ4jQzCctIOnWU1pWysFTS7VQ0e5ooBfMC8NkjxTWubpwd+H0CEJ481NjYnAJPB/9eePX9Ls6t4inHFoa5FudXAJwVsND9LwlKkPhth7kuuQqTVZbXm0DplourWBxt+BHDdkIHnCSojhPuOtqlLa42l4Zgp1dhELACuU9JOvdQHfcgoDgNdXMTQain3sYniVP4d57B8FRDuuQg4yRrzk0v7KLTIHfiQdfi6prJIxZ7h501cYkMLWVHEJhOjtAE8FKpLmJt4emfxndFGJilZG/RSQLvkVTI3fK51SEEMAqg50i6IXb4f25AgMBAAECggEALySOL/BpmFSrzm0va/UI5ain2OgMkNeuILPvCzfH/RYcHqrDzkrB9eUe6tU/RtGVsp8ndDAWzI/RQDEKF9+ySQde1TMEdZ+SatfOkUkR/dJ9wv83g/RbqGajyhbSvPYGhzb89V2aW7tXGNdEpXmGG8p8LUXTjYjqXI5BOTiVL+gwvx4eEpgpNzpfKdySyCkpvxuznIqxdvp2w4EZ4Ic9zvhSntCDclAvtjRs/mJClWyx+Fr/JrBhZ/FtMdE4nfyacdjgKA4ubtwz4clEsw7eAMIqksGx8RAv9DvPp1362z3EZpYjuXxZuh9uI7T/uH2u5efL8H8m6BNBMGPHbiQqYQKBgQD2EBKDPDIPG4WyfJxrGoy6B2VI9lOHJnkV5imlfTEBKd/SozjsU5CthvyaisPqjJiq8DiJUtLJT0XT4uoqA1RDoicwUe+MeKBwlPHcnJno/jO8cDtimBalpHivExnnRA5Og+ES82HV2qcFnTTrdKVbnHaKEQzwLegFMM56mJQ4GwKBgQDTlUWpjQzaUAaCSlV4JaWscNZdc7zNKW8fIcHql7W5+QEx/XXjPyCTlQ9FgkY/ybtIw6ns+U7jJs9i2XsbWEav0HqvvHy+JMw3rplBFPE8wYE0TLpI55UE7Ul/jslESkyr/+o0nSuXYsc7F81fCLswNRFzW8aeqP2T1w50HGsmuwKBgHshgdIQHlC3CglOGAv0hjVVHBcNxLCdzPvraC263vnhFXLXYNXJ310mbmN7Sxyk7ISlnvUA8B/yvlOQenM5pUIO86NXbRMTDd4oentWFiKkigki9GSbDMIo8odRfKXgxXP+xHNyPSQBvZCuoVutzE1yl1Lxw1Kw9ikaykhI7+q/AoGAFhobwtBnLU76vxWAxCI6oj7PRcfXSx8u6nOeTCE47IpkY5J0hB6OCpyhkcNAD13FYJ5/269XXEcrlsndIEgiai8/AaiQ51P0uURV4gSMBqq4EnyJYSA/4tneuaJyx91zEOyUzJY2fYPmB/g+jdTdqPWCMyi9IMnKY20tp1doog0CgYBO83gSEdqGmR3+qix2cUBZYXGCNRKFtFX8edIEeluT6AOMA6/kMe5i/y8e3m5Oh9LWE45l04dsVHeqAA6l9Ps/l6WkeLEiIsRY0yF0DcppXo8DJ5TrL+DIJeJ1yxBEGcLjBea5t16zwLqwFASr0ieF622kk40Gn7QH+ZBrMaN1Qw

===========1.公钥加密,私钥解密==============
原文:aattaggcctegthththfef/aat.mp4
公钥加密后的数据:EfjUSb8my/YWrzOziQYKGuB9KbJeZO6uZSRsRZgaEu1m5zHujZ+FA9QK1abjn/ELgCmQw5B91BGFZia2ySbtMLe3n0bD32udI0ufeLA5n/uPEyuiKdrPQcgN22ugJXcrNL9Hbd6WbYbXzeraTK03k61yM2KmgfW/usjbGMjxJ+zoHtw6zHg6lX3O5QrHlx1Q/GUWI61gn4Lp3TsqlRg0YG5/BAOFsRSSdQibK2h2BHxwsiivTidbSc7Z7eSrWPC6T/j0PCgYjsW6O9lRKNdtSlMC6S3Nh9723i0MkqgcE0g8/QV0DxetSbvkFibvaNgh059KLsE0JWyIvINY6bDYFw
私钥解密后的数据:aattaggcctegthththfef/aat.mp4

===========2.反向进行操作,私钥加密,公钥解密==============
原文:4b9d373bed9f40b389f0e42ebaf729b4
私钥加密后的数据:mQr+BUTDHakOJsUqt+g4UHeUC+pGBM6YjZmMcTFXT3mJw4EcbBdh1UF+R1rWCJc7l2ofsnWMnwosWCPuPJTN8LI2PYNICeXHOLCOWZ2DKz6ARdpZuebpPfnLJ0D5dK1oh/8ndgUiN/SBDaGgIK//3MQp2yRn+O+d3Xv193T2i7vRx/oDyI3/F0Ftbwj3L8RtSPIYv3Zf7c69xTsiYkwGZ3UWCLcEwaLD9d2k60VX2CQntWhJ5mTYHYdjA7z57oMz0hEx7WdUFMM+RLkhOIo8hljY3RjhwDN1BLru6wFfQ5ztnZ6kDaaJRKEdfzjePxZ4MQqI4hgHtHC1NrYV3ZIM0w
公钥解密后的数据:4b9d373bed9f40b389f0e42ebaf729b4

猜你喜欢

转载自blog.csdn.net/qq877728715/article/details/115212510