• RSA---应用最广泛的非对称加密算法


    package com.ant.jdk8.encrypt;
    
    import org.apache.commons.io.FileUtils;
    
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.NoSuchPaddingException;
    import java.io.File;
    import java.io.IOException;
    import java.security.*;
    import java.util.Base64;
    
    public class JavaApiRSADemo {
    
        private static final String KEY_ALGORITHM_RSA = "RSA";
        private static final String ENCODING_UTF8 = "UTF-8";
        private static final int KEY_SIZE = 2048;
    
        public static void main(String[] args) throws NoSuchAlgorithmException, IOException, NoSuchPaddingException,
                InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
            String data = "横看成岭侧成峰";
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM_RSA);
            keyPairGenerator.initialize(KEY_SIZE);
            KeyPair keyPair = keyPairGenerator.generateKeyPair();
    
            PublicKey publicKey = keyPair.getPublic();
            String publicKeyBase64Str = Base64.getEncoder().encodeToString(publicKey.getEncoded());
            FileUtils.writeStringToFile(new File("D:\java-api-rsa-public-key.pem"), publicKeyBase64Str, ENCODING_UTF8);
    
            PrivateKey privateKey = keyPair.getPrivate();
            String privateKeyBase64Str = Base64.getEncoder().encodeToString(privateKey.getEncoded());
            FileUtils.writeStringToFile(new File("D:\java-api-rsa-private-key.pem"), privateKeyBase64Str, ENCODING_UTF8);
    
            Cipher cipher = Cipher.getInstance(KEY_ALGORITHM_RSA);
    
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            byte[] bytesEncrypted = cipher.doFinal(data.getBytes(ENCODING_UTF8));
            System.out.println("加密后的数据:
    "+Base64.getEncoder().encodeToString(bytesEncrypted));
    
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            byte[] bytesDecrypted = cipher.doFinal(bytesEncrypted);
            System.out.println("解密后的数据:
    "+new String(bytesDecrypted));
        }
    }

    加密后的数据:EUwDvYCQnwfzsu3GhlEjseQyK4W1Ws1bmBuBuvHuHrhHkGZ7OFBK5o4kcLyBYrSSMZVhTqa9ZHN+r7E3dUpCx6lfR6yaIguAcvX/GVEgm5Rmqw5xahoP4La/VdKVvyB8Nf7OD67zjWjy8ycn86c5c6+EmifuKIKfVRXzHLr102LHT1ZLgyxcB0qmOD1PMdx6U0T3Vblgb8dp4RIJTEikQWMUaEuIwVTV233e6n3JDKPpEkNDeHtfxasXSBvWQETg3yWC1AzHjT40fG+nkM7EQGHuGefuT+WDWrcHDY+9Ry/NzqnYoAhm53BtfPFHa0lGxKrdsjuJIxe5LHvmCBv2eg==

    生成的公钥(注意与openssl生成的密钥对的格式进行对比):

    生成的私钥(注意与openssl生成的密钥对的格式进行对比):

    =============================================================================

    package com.ant.jdk8.encrypt;
    
    import org.apache.commons.io.FileUtils;
    
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.NoSuchPaddingException;
    import java.io.File;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.security.*;
    import java.security.spec.InvalidKeySpecException;
    import java.security.spec.PKCS8EncodedKeySpec;
    import java.security.spec.X509EncodedKeySpec;
    import java.util.Base64;
    
    public class JavaApiRSAUtil {
    
        private static final String KEY_ALGORITHM_RSA = "RSA";
        private static final String ENCODING_UTF8 = "UTF-8";
    
        public static void main(String[] args) throws NoSuchAlgorithmException, IOException, InvalidKeySpecException,
                IllegalBlockSizeException, InvalidKeyException, BadPaddingException, NoSuchPaddingException {
            String data = "横看成岭侧成峰";
            System.out.println("加密前的数据:"+data);
            PublicKey publicKey = getPublicKey("D:\java-api-rsa-public-key.pem");
            String encryptedData = encrypt(publicKey, data);
            PrivateKey privateKey = getPrivateKey("D:\java-api-rsa-private-key.pem");
            decrypt(privateKey, encryptedData);
        }
    
        /**
         * 从磁盘上的公钥文件生成PublicKey
         * @param publicKeyPath
         * @return
         * @throws IOException
         * @throws NoSuchAlgorithmException
         * @throws InvalidKeySpecException
         */
        public static PublicKey getPublicKey(String publicKeyPath) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {
            byte[] bytesPublicKeyBase64 = FileUtils.readFileToByteArray(new File(publicKeyPath));
            byte[] bytesPublicKey = Base64.getDecoder().decode(bytesPublicKeyBase64);
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytesPublicKey);
            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM_RSA);
            PublicKey publicKey = keyFactory.generatePublic(keySpec);
            return publicKey;
        }
    
        /**
         * 从磁盘上的私钥文件生成PrivateKey
         * @param privateKeyPath
         * @return
         * @throws IOException
         * @throws NoSuchAlgorithmException
         * @throws InvalidKeySpecException
         */
        public static PrivateKey getPrivateKey(String privateKeyPath) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {
            byte[] bytesPrivateKeyBase64 = FileUtils.readFileToByteArray(new File(privateKeyPath));
            byte[] bytesPrivateKey = Base64.getDecoder().decode(bytesPrivateKeyBase64);
            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytesPrivateKey);
            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM_RSA);
            PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
            return privateKey;
        }
    
        /**
         * 加密数据并Base64编码
         * @param publicKey
         * @param originalData
         * @return
         * @throws NoSuchPaddingException
         * @throws NoSuchAlgorithmException
         * @throws InvalidKeyException
         * @throws UnsupportedEncodingException
         * @throws BadPaddingException
         * @throws IllegalBlockSizeException
         */
        public static String encrypt(PublicKey publicKey, String originalData) throws NoSuchPaddingException, NoSuchAlgorithmException,
                InvalidKeyException, UnsupportedEncodingException, BadPaddingException, IllegalBlockSizeException {
            Cipher cipher = Cipher.getInstance(KEY_ALGORITHM_RSA);
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            byte[] bytesEncrypt = cipher.doFinal(originalData.getBytes(ENCODING_UTF8));
            String encryptedDataBase64 = Base64.getEncoder().encodeToString(bytesEncrypt);
            System.out.println("加密后的数据:"+encryptedDataBase64);
            return encryptedDataBase64;
        }
    
        /**
         * 解密数据
         * @param privateKey
         * @param encryptedData
         * @return
         * @throws NoSuchPaddingException
         * @throws NoSuchAlgorithmException
         * @throws InvalidKeyException
         * @throws UnsupportedEncodingException
         * @throws BadPaddingException
         * @throws IllegalBlockSizeException
         */
        public static String decrypt(PrivateKey privateKey, String encryptedData) throws NoSuchPaddingException, NoSuchAlgorithmException,
                InvalidKeyException, UnsupportedEncodingException, BadPaddingException, IllegalBlockSizeException {
            Cipher cipher = Cipher.getInstance(KEY_ALGORITHM_RSA);
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            byte[] bytesEncrypt = Base64.getDecoder().decode(encryptedData.getBytes(ENCODING_UTF8));
            byte[] bytesDecrypt = cipher.doFinal(bytesEncrypt);
            String originalData = new String(bytesDecrypt);
            System.out.println("解密后的数据:"+originalData);
            return originalData;
        }
    }
    

  • 相关阅读:
    C语言 · 9-1九宫格
    Lodop打印控件指定打印任务某几页
    Lodop打印控件不打印css背景图怎么办
    Lodop打印项对象类型属性区分
    Lodop打印如何隐藏table某一列
    Lodop打印控件 打印‘接下一页’‘以下空白’
    Lodop连续打印内容逐渐偏移怎么办
    C-Lodop打印服务没启动怎么办
    LODOP.FORMAT格式转换【回调和直接返回值】
    C-Lodop设置页面一加载就打印
  • 原文地址:https://www.cnblogs.com/i-hard-working/p/9693578.html
Copyright © 2020-2023  润新知