常用加解密算法

分类

  • 对称加密:对称式加密方式对加密和解密使用相同的密钥。通常,这种加密方式在应用中难以实施,因为用同一种安全方式共享密钥很难。如:RC4、RC2、DES 和 AES 系列加密算法。
  • 非对称加密:非对称密钥加密(Asymmetric Key Encryption):非对称密钥加密使用一组公共/私人密钥系统,加密时使用一种密钥,解密时使用另一种密钥。公共密钥可以广泛的共享和透露。当需要用加密方式向服务器外部传送数据时,这种加密方式更方便。如: RSA
  • 签名算法(数字证书):数字证书是一种非对称密钥加密,但是,一个组织可以使用证书并通过数字签名将一组公钥和私钥与其拥有者相关联。

对称加密之AES

特点:

  • 密钥建立时间短、灵敏性好、内存需求低(不管怎样,反正就是好)
  • 最常用的对称加密算法

以下为AES的实现细节:
AES
AES的常用工作模式有ECB和CTR,其中CTR需要设置IV参数,可参考第八章 对称加密算法–AES,以下代码为ECB模式的实现:

package com.sean.test.security;

import org.apache.xerces.impl.dv.util.Base64;

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;

public class AESUtil {

    private static final String SECRET_ALGORITHM = "AES"; //加密算法
    public static final String SECRET_ALGORITHM_TYPE = "AES/ECB/PKCS5Padding"; //转换声明,“算法/模式/填充”
    private static final int SECRET_ALGORITHM_SIZE = 128; //指定随机生成的秘钥的长度

    /**
     * 生成秘钥
     * @return byte[] 二进制秘钥
     * @throws NoSuchAlgorithmException
     */
    public static byte[] initKey() throws NoSuchAlgorithmException {
        // 实例化
        KeyGenerator keyGenerator = KeyGenerator.getInstance(SECRET_ALGORITHM);
        // 设置秘钥长度
        keyGenerator.init(SECRET_ALGORITHM_SIZE);
        // 生成秘钥
        SecretKey secretKey = keyGenerator.generateKey();
        return secretKey.getEncoded();
    }

    /**
     * 将秘钥进行转换
     * @param keyByte
     * @return
     */
    public static Key toKey(byte[] keyByte) {
        return new SecretKeySpec(keyByte, SECRET_ALGORITHM);
    }

    /**
     * 加密
     * @param key
     * @param data
     * @return
     * @throws NoSuchPaddingException
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeyException
     * @throws BadPaddingException
     * @throws IllegalBlockSizeException
     */
    public static byte[] encrypt(byte[] key, byte[] data) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        // 转换秘钥
        Key toKey = toKey(key);
        // 实例化
        Cipher cipher = Cipher.getInstance(SECRET_ALGORITHM_TYPE);
        // 设置为加密模式
        cipher.init(Cipher.ENCRYPT_MODE, toKey);
        // 执行加密操作
        return cipher.doFinal(data);
    }

    public static byte[] decrypt(byte[] key, byte[] data) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        // 转换秘钥
        Key toKey = toKey(key);
        // 实例化
        Cipher cipher = Cipher.getInstance(SECRET_ALGORITHM_TYPE);
        // 设置为解密模式
        cipher.init(Cipher.DECRYPT_MODE, toKey);
        // 执行解密操作
        return cipher.doFinal(data);
    }

    public static void main(String[] args) throws Exception {
        String str = "AES";
        System.out.println("原文为:" + str);
        byte[] key = initKey();
        System.out.println("加密秘钥为:"+ Base64.encode(key));
        byte[] encryptData = AESUtil.encrypt(key, str.getBytes());
        System.out.println("加密后的内容为:"+ Base64.encode(encryptData));
        byte[] decryptData = AESUtil.decrypt(key, encryptData);
        System.out.println("解密后的内容为:"+ new String(decryptData));
         /**
         * 运行结果:
             原文为:AES
             加密秘钥为:lTeHhjrBBbHVO3j2MGxEGQ==
             加密后的内容为:7EGu1+m7k9/z60XMoNu1Fw==
             解密后的内容为:AES
         * 
         */
        
    }
}

秘钥交换算法之DH

特点:

  • 发送方和接收方均有一个密钥对(公钥+私钥),其中公钥传播,私钥自己保存,不需要传播
  • 私钥不需要传播的特性解决了对称加密算法中密钥传播的困难(这个困难一般通过线下传递可以解决)
  • 加密安全性极高,只用于一些电子商务网站,加解密速度远低于对称加密
  • 一般情况下,为了解决非对称加密算法加解密速度低的问题,采用非对称加密(使用公钥+私钥对对称加密的密钥进行加解密)+对称加密(加解密数据)相结合的方式。

步骤:

  1. 甲方生成公钥和私钥,并将公钥发送给乙方
  2. 乙方根据甲方公钥生成公钥和私钥,将公钥发给甲方
  3. 甲乙双方拼接各自持有的公钥和私钥生成相同的秘钥,解决秘钥的传输问题
  4. 甲乙双方可根据生成的秘钥加密数据和解密对方加密的数据
package com.sean.test.security;

import org.apache.commons.codec.binary.Base64;

import javax.crypto.*;
import javax.crypto.interfaces.DHPublicKey;
import javax.crypto.spec.DHParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.*;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

/**
 * <p></p>
 * 无法保证对称加密算法秘钥的传输问题,可通过DH加密方式进行解决(DH本身无法对数据进行加解密)
 * 步骤:
 * 1.甲方生成公钥和私钥,并将公钥发送给乙方
 * 2.乙方根据甲方公钥生成公钥和私钥,将公钥发给甲方
 * 3.甲乙双方拼接各自持有的公钥和私钥生成相同的秘钥,解决秘钥的传输问题
 * 4.甲乙双方可根据生成的秘钥加密数据和解密对方加密的数据
 *
 * @version V1.0
 * @modificationHistory=========================逻辑或功能性重大变更记录
 * @modify by user: {修改人} 2019/2/13
 * @modify by reason:{方法名}:{原因}
 */
public class DHUtil {
    private static final String ENCODING = "UTF-8";
    private static final String DH_KEY_ALGORITHM = "DH";//非对称加密密钥算法
    private static final String SECRET_ALGORITHM = "AES";//产生本地密钥的算法(对称加密密钥算法)
    private static final String CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";//加解密算法 格式:算法/工作模式/填充模式 注意:ECB不使用IV参数
    private static final int DH_KEY_SIZE = 512;//非对称密钥长度(512~1024之间的64的整数倍)

    /**
     * 生成甲方密钥对
     */
    public static KeyPair initKey() throws NoSuchAlgorithmException {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(DH_KEY_ALGORITHM);//密钥对生成器
        keyPairGenerator.initialize(DH_KEY_SIZE);//指定密钥长度
        KeyPair keyPair = keyPairGenerator.generateKeyPair();//生成密钥对
        return keyPair;
    }

    /**
     * 生成乙方密钥对
     *
     * @param key 甲方公钥
     */
    public static KeyPair initKey(byte[] key) throws NoSuchAlgorithmException,
            InvalidKeySpecException,
            InvalidAlgorithmParameterException {
        KeyFactory keyFactory = KeyFactory.getInstance(DH_KEY_ALGORITHM);//密钥工厂
        PublicKey publicKey = keyFactory.generatePublic(new X509EncodedKeySpec(key));//还原甲方公钥
        DHParameterSpec dHParameterSpec = ((DHPublicKey) publicKey).getParams();

        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(keyFactory.getAlgorithm());//乙方密钥对生成器
        keyPairGenerator.initialize(dHParameterSpec);//使用甲方公钥参数初始化乙方密钥对生成器
        KeyPair keyPair = keyPairGenerator.generateKeyPair();//生成密钥对
        return keyPair;
    }

    /**
     * 获取公钥
     */
    public static byte[] getPublicKey(KeyPair keyPair) {
        return keyPair.getPublic().getEncoded();
    }

    /**
     * 获取私钥
     */
    public static byte[] getPrivateKey(KeyPair keyPair) {
        return keyPair.getPrivate().getEncoded();
    }

    /**
     * 根据本方私钥与对方公钥构建本地密钥(即对称加密的密钥)
     *
     * @param publicKey  对方公钥
     * @param privateKey 本方私钥
     */
    public static byte[] getSecretKey(byte[] publicKey, byte[] privateKey) throws NoSuchAlgorithmException,
            InvalidKeySpecException,
            InvalidKeyException {
        KeyFactory keyFactory = KeyFactory.getInstance(DH_KEY_ALGORITHM);//密钥工厂
        PublicKey pubkey = keyFactory.generatePublic(new X509EncodedKeySpec(publicKey));//还原公钥
        PrivateKey prikey = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(privateKey));//还原私钥

        KeyAgreement keyAgreement = KeyAgreement.getInstance(keyFactory.getAlgorithm());
        keyAgreement.init(prikey);
        keyAgreement.doPhase(pubkey, true);
        return keyAgreement.generateSecret(SECRET_ALGORITHM).getEncoded();//生成本地密钥(对称加密的密钥)
    }

    /**
     * DH加密
     *
     * @param data    带加密数据
     * @param keyByte 本地密钥,由getSecretKey(byte[] publicKey, byte[] privateKey)产生
     */
    public static byte[] encrypt(String data, byte[] keyByte) throws NoSuchAlgorithmException,
            NoSuchPaddingException,
            InvalidKeyException,
            IllegalBlockSizeException,
            BadPaddingException,
            UnsupportedEncodingException {
        Key key = new SecretKeySpec(keyByte, SECRET_ALGORITHM);//生成本地密钥

        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, key);//设置加密模式并且初始化key
        return cipher.doFinal(data.getBytes(ENCODING));
    }

    /**
     * DH解密
     *
     * @param data    待解密数据为字节数组
     * @param keyByte 本地密钥,由getSecretKey(byte[] publicKey, byte[] privateKey)产生
     */
    public static byte[] decrypt(byte[] data, byte[] keyByte) throws NoSuchAlgorithmException,
            NoSuchPaddingException,
            InvalidKeyException,
            IllegalBlockSizeException,
            BadPaddingException {
        Key key = new SecretKeySpec(keyByte, SECRET_ALGORITHM);//生成本地密钥
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, key);
        return cipher.doFinal(data);
    }


    /**
     * 测试
     */
    public static void main(String[] args) throws NoSuchAlgorithmException,
            InvalidKeySpecException,
            InvalidAlgorithmParameterException,
            InvalidKeyException,
            NoSuchPaddingException,
            IllegalBlockSizeException,
            BadPaddingException,
            UnsupportedEncodingException {
        byte[] pubKey1;//甲方公钥
        byte[] priKey1;//甲方私钥
        byte[] key1;//甲方本地密钥
        byte[] pubKey2;//乙方公钥
        byte[] priKey2;//乙方私钥
        byte[] key2;//乙方本地密钥

        /*********************测试是否可以正确生成以上6个key,以及key1与key2是否相等*********************/
        KeyPair keyPair1 = DHUtil.initKey();//生成甲方密钥对
        pubKey1 = DHUtil.getPublicKey(keyPair1);
        priKey1 = DHUtil.getPrivateKey(keyPair1);

        KeyPair keyPair2 = DHUtil.initKey(pubKey1);//根据甲方公钥生成乙方密钥对
        pubKey2 = DHUtil.getPublicKey(keyPair2);
        priKey2 = DHUtil.getPrivateKey(keyPair2);

        key1 = DHUtil.getSecretKey(pubKey2, priKey1);//使用对方公钥和自己私钥构建本地密钥
        key2 = DHUtil.getSecretKey(pubKey1, priKey2);//使用对方公钥和自己私钥构建本地密钥

        System.out.println("甲方公钥pubKey1-->" + Base64.encodeBase64String(pubKey1) + "@@pubKey1.length-->" + pubKey1.length);
        System.out.println("甲方私钥priKey1-->" + Base64.encodeBase64String(priKey1) + "@@priKey1.length-->" + priKey1.length);
        System.out.println("乙方公钥pubKey2-->" + Base64.encodeBase64String(pubKey2) + "@@pubKey2.length-->" + pubKey2.length);
        System.out.println("乙方私钥priKey2-->" + Base64.encodeBase64String(priKey2) + "@@priKey2.length-->" + priKey2.length);
        System.out.println("甲方密钥key1-->" + Base64.encodeBase64String(key1));
        System.out.println("乙方密钥key2-->" + Base64.encodeBase64String(key2));

        /*********************测试甲方使用本地密钥加密数据向乙方发送,乙方使用本地密钥解密数据*********************/
        System.out.println("甲方-->乙方");
        String data = "找一个好姑娘啊!";
        byte[] encodeStr = DHUtil.encrypt(data, key1);
        System.out.println("甲方加密后的数据-->" + Base64.encodeBase64String(encodeStr));
        byte[] decodeStr = DHUtil.decrypt(encodeStr, key2);
        System.out.println("乙方解密后的数据-->" + new String(decodeStr, "UTF-8"));

        /*********************测试乙方使用本地密钥加密数据向甲方发送,甲方使用本地密钥解密数据*********************/
        System.out.println("乙方-->甲方");
        String data2 = "找一个好姑娘啊!";
        byte[] encodeStr2 = DHUtil.encrypt(data2, key2);
        System.out.println("乙方加密后的数据-->" + Base64.encodeBase64String(encodeStr2));
        byte[] decodeStr2 = DHUtil.decrypt(encodeStr, key1);
        System.out.println("甲方解密后的数据-->" + new String(decodeStr2, "UTF-8"));
        /**
         * 运行结果:
             甲方公钥pubKey1-->MIHfMIGXBgkqhkiG9w0BAwEwgYkCQQD8poLOjhLKuibvzPcRDlJtsHiwXt7LzR60ogjzrhYXrgHzW5Gkfm32NBPF4S7QiZvNEyrNUNmRUb3EPuc3WS4XAkBnhHGyepz0TukaScUUfbGpqvJE8FpDTWSGkx0tFCcbnjUDC3H9c9oXkGmzLik1Yw4cIGI1TQ2iCmxBblC+eUykAgIBgANDAAJAO88L9b6mwa7WJPuoKq9lb3JFBJ0e8n+f7+d0UimJnJ2G07hs9FS7O0ZY9pfNwfmc+WBocMlNyHYjjrLHcf8tig==@@pubKey1.length-->226
             甲方私钥priKey1-->MIHSAgEAMIGXBgkqhkiG9w0BAwEwgYkCQQD8poLOjhLKuibvzPcRDlJtsHiwXt7LzR60ogjzrhYXrgHzW5Gkfm32NBPF4S7QiZvNEyrNUNmRUb3EPuc3WS4XAkBnhHGyepz0TukaScUUfbGpqvJE8FpDTWSGkx0tFCcbnjUDC3H9c9oXkGmzLik1Yw4cIGI1TQ2iCmxBblC+eUykAgIBgAQzAjEAojcUX/pTYDDxhECpaVdjkehOCNzX4XhgaL1SFCvtmCfWdU1L+33s206giO4eCtsD@@priKey1.length-->213
             乙方公钥pubKey2-->MIHfMIGXBgkqhkiG9w0BAwEwgYkCQQD8poLOjhLKuibvzPcRDlJtsHiwXt7LzR60ogjzrhYXrgHzW5Gkfm32NBPF4S7QiZvNEyrNUNmRUb3EPuc3WS4XAkBnhHGyepz0TukaScUUfbGpqvJE8FpDTWSGkx0tFCcbnjUDC3H9c9oXkGmzLik1Yw4cIGI1TQ2iCmxBblC+eUykAgIBgANDAAJAMmjodn9QSWY58RZuyptvFXu5iykvRPnCcvvhRDc7P7g5U0ytzrYZMt656W2rT4e4KcnyCakdK5Ec+7CbURb27A==@@pubKey2.length-->226
             乙方私钥priKey2-->MIHSAgEAMIGXBgkqhkiG9w0BAwEwgYkCQQD8poLOjhLKuibvzPcRDlJtsHiwXt7LzR60ogjzrhYXrgHzW5Gkfm32NBPF4S7QiZvNEyrNUNmRUb3EPuc3WS4XAkBnhHGyepz0TukaScUUfbGpqvJE8FpDTWSGkx0tFCcbnjUDC3H9c9oXkGmzLik1Yw4cIGI1TQ2iCmxBblC+eUykAgIBgAQzAjEAy3MWvMVmFQGDv6VLtfNUF+gI1x+Y4sKE5uYmC9FFO362rLVNrJtmNkld8mxwl8Ck@@priKey2.length-->213
             甲方密钥key1-->8PDDr3MoPptlybA224G14eufPvvOcNxeaPm6AqJsj5g=
             乙方密钥key2-->8PDDr3MoPptlybA224G14eufPvvOcNxeaPm6AqJsj5g=
             甲方-->乙方
             甲方加密后的数据-->iTZiR+/w/GhzmqQlBfaLWrmK8+0VUJUQIV1WBMrqU20=
             乙方解密后的数据-->找一个好姑娘啊!
             乙方-->甲方
             乙方加密后的数据-->iTZiR+/w/GhzmqQlBfaLWrmK8+0VUJUQIV1WBMrqU20=
             甲方解密后的数据-->找一个好姑娘啊!
         */
    }
}

注:上述代码运行时可能报错:Caused by: java.security.InvalidKeyException: Illegal key size or default parameters
解决:把里面的两个jar包:local_policy.jar 和 US_export_policy.jar 替换掉原来jdk安装目录C:\Program Files\Java\jre6\lib\security 下的两个jar包接可以了(JDK8下载地址

非对称加密之RSA

特点:

  • 使用一套密钥即可完成加解密(与DH不同)
  • 与DH不同的第二点是,RSA自己可以完成加解密,而DH需要依赖于对称加密算法
  • “私钥加密,公钥解密”或“公钥加密,私钥解密”
  • 公钥长度远小于私钥长度(对下边的代码进行测试,自己比较结果)

加解密流程:

  1. 发送方(假设为甲方)构建密钥对,自己保留私钥,将公钥发送给接收方(假设为乙方)

  2. 甲方使用密钥对消息进行加密,乙方使用公钥对消息解密(“私钥加密,公钥解密”,该方式的应用场景为数字签名)或者乙方使用公钥对消息进行加密,甲方使用私钥对消息解密(“公钥加密,私钥解密”)

注意:公钥加密方式存在安全隐患,如果需要更加安全的方式,就需要甲乙双方均存一份密钥对,仅仅使用“私钥加密,公钥解密”的方式,这种方式与DH类似,但是不同,在DH中甲乙双方各自保留着自己的公钥+私钥,而更安全的RSA是甲乙方法均保存着自己的私钥与对方的公钥,这是RSA与DH的第三点不同。

基于JDK实现RSA加解密代码:

package com.sean.test.security;

import org.apache.xerces.impl.dv.util.Base64;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.security.*;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

/**
 * <p></p>
 *  1.生成秘钥对
 *  2.通过秘钥对获取公钥或私钥
 *  3.通过公钥或私钥加密
 *  4.通过私钥或公钥解密
 *
 *
 *  私钥加密公钥解密(可用作加密使用):
 *      1.接收方将公钥发给发送方
 *      2.发送方通过公钥对数据进行加密后,将数据传给接收方
 *      3.接收方通过私钥进行解密,获取安全的数据
 *  公钥加密私钥解密(可用作签名使用):
 *      1.发送方将公钥发送给接收方
 *      2.发送方通过私钥对数据进行加密,将加密的数据和原有的数据发送给接收方
 *      3.接收方接受数据,对加密数据通过公钥解密,将解密的数据与原有数据进行对比,若一致,则数据未被他人拦截篡改
 * @version V1.0
 * @modificationHistory=========================逻辑或功能性重大变更记录
 * @modify by user: {修改人} 2019/2/13
 * @modify by reason:{方法名}:{原因}
 */
public class RSAUtil {

    private static final String KEY_ALGORITHM = "RSA";//非对称加密密钥算法
    private static final String CIPHER_ALGORITHM = "RSA/ECB/PKCS1Padding";//加解密算法 格式:算法/工作模式/填充模式
    private static final int KEY_SIZE = 512;//非对称密钥长度(512~1024之间的64的整数倍)

    // 初始化秘钥对
    public static KeyPair initKey() throws NoSuchAlgorithmException {
        // 秘钥对生成器
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM);
        // 指定秘钥长度
        keyPairGenerator.initialize(KEY_SIZE);
        // 生成秘钥对
        return keyPairGenerator.generateKeyPair();
    }

    // 获取公钥
    public static byte[] getPublicKey(KeyPair keyPair){
        return keyPair.getPublic().getEncoded();
    }

    // 获取私钥
    public static byte[] getPrivateKey(KeyPair keyPair){
        return keyPair.getPrivate().getEncoded();
    }

    // 转换公钥
    public static PublicKey toPublicKey(byte[] publicKey) throws InvalidKeySpecException, NoSuchAlgorithmException {
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        return keyFactory.generatePublic(new X509EncodedKeySpec(publicKey));
    }

    // 转换私钥
    public static PrivateKey toPrivateKey(byte[] privateKey) throws InvalidKeySpecException, NoSuchAlgorithmException {
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        return keyFactory.generatePrivate(new PKCS8EncodedKeySpec(privateKey));
    }

    // 公钥加密
    public static byte[] encryptByPublicKey(byte[] publicKey, byte[] data) throws InvalidKeySpecException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        PublicKey pk = toPublicKey(publicKey);
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
        // 设置模式并初始化key
        cipher.init(Cipher.ENCRYPT_MODE,pk);
        return cipher.doFinal(data);
    }

    // 公钥解密
    public static byte[] decryptByPublicKey(byte[] publicKey, byte[] data) throws InvalidKeySpecException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        PublicKey pk = toPublicKey(publicKey);
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
        // 设置模式并初始化key
        cipher.init(Cipher.DECRYPT_MODE,pk);
        return cipher.doFinal(data);
    }

    // 私钥加密
    public static byte[] encryptByPrivateKey(byte[] privateKey, byte[] data) throws InvalidKeySpecException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        PrivateKey pk = toPrivateKey(privateKey);
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
        // 设置模式并初始化key
        cipher.init(Cipher.ENCRYPT_MODE,pk);
        return cipher.doFinal(data);
    }

    // 公钥解密
    public static byte[] decryptByPrivateKey(byte[] privateKey, byte[] data) throws InvalidKeySpecException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        PrivateKey pk = toPrivateKey(privateKey);
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
        // 设置模式并初始化key
        cipher.init(Cipher.DECRYPT_MODE,pk);
        return cipher.doFinal(data);
    }

    public static void main(String[] args) throws Exception {
        String str = "RSA";
        System.out.println("原文为:" + str);
        byte[] data = str.getBytes();
        KeyPair keyPair = RSAUtil.initKey();
        byte[] publicKey = getPublicKey(keyPair);
        byte[] privateKey = getPrivateKey(keyPair);
        System.out.println("公钥为:"+ Base64.encode(publicKey));
        System.out.println("私钥为:"+ Base64.encode(privateKey));
        byte[] encryptByPublicKey = encryptByPublicKey(publicKey, data);
        System.out.println("公钥加密结果:"+Base64.encode(encryptByPublicKey));
        byte[] decryptByPrivateKey = decryptByPrivateKey(privateKey, encryptByPublicKey);
        System.out.println("私钥解密结果:"+new String(decryptByPrivateKey));

        byte[] encryptByPrivateKey = encryptByPrivateKey(privateKey, data);
        System.out.println("私钥加密结果:"+Base64.encode(encryptByPrivateKey));
        byte[] decryptByPublicKey = decryptByPublicKey(publicKey, encryptByPrivateKey);
        System.out.println("公钥解密结果:"+new String(decryptByPublicKey));
        /**
         * 运行结果: 
             原文为:RSA
             公钥为:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAI5k6ShF1SVRbKD22g0MEcQwuOQSDE8XPQGJjYMA2tXPHQXY4+wHuNQZr3NPSOfu16RJsqBPcOVJhrfGkag4ZqsCAwEAAQ==
             私钥为:MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAjmTpKEXVJVFsoPbaDQwRxDC45BIMTxc9AYmNgwDa1c8dBdjj7Ae41Bmvc09I5+7XpEmyoE9w5UmGt8aRqDhmqwIDAQABAkBwbPwp7/j6He/GpyBCbOUaId3ZNObDC3X/YLt6U5J0fHyroQBoSQlC52uJIXnwFwtZTKvmOloIvMYmLWk+WAMBAiEA8L/zSE4sRlkyxfENyq89M6Hobi7yzpLub9qh2WoYVPUCIQCXagFBA0rQ79D+KqREqkg5OOF6pwAs1aWVWGBUSTOJHwIhAOIwJZ0IPRa3FTndmUyVSdXpxxtGJr+oUjZq3ecLg+LFAiBpJiyIwYiLYH96gpJhPP+6/U1Yp/DvMc8zz5PV9J/dcQIgESXG/w2uDHD9JXOQaAMh/itAD6ZzjJxLKj/wZgAGVPw=
             公钥加密结果:EXkWhouJqBdoFUqp0L0c2mr+/pHgT7da+1hrNPPzmj4+N+TB+rMLO5WWK9CeXLWVMyA4u64CupWQSBZ0PBajcw==
             私钥解密结果:RSA
             私钥加密结果:Go6+TuPIgLnpMHTocVjbsWs7nxxsux4yUSeWP6heyNZQD1eCV02xBm0VB2ozQf9EBVAWmd38supwCJas1+8nxg==
             公钥解密结果:RSA
         */
    }

}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值