非对称加密——RSA算法工具类

关于RSA算法的介绍网上一大堆,一句话就是牛B。

package com.demo;

import org.springframework.util.StringUtils;

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;

public class RSAUtils {

    /**
     * 加密(对外暴露)
     * 如果使用 公钥 对数据 进行加密,只有用对应的 私钥 才能 进行解密。
     * 如果使用 私钥 对数据 进行加密,只有用对应的 公钥 才能 进行解密。
     * @param keyStr
     * @param data
     * @return
     * @throws Exception
     */
    public static String encryptData(String keyStr, String data, Boolean isPublicKey) throws Exception {
        if (StringUtils.isEmpty(keyStr)) {
            return "";
        }
        return encryptBASE64(encrypt(getKey(keyStr, isPublicKey), data.getBytes()));
    }

    /**
     * 解密(对外暴露)
     * 如果使用 公钥 对数据 进行加密,只有用对应的 私钥 才能 进行解密。
     * 如果使用 私钥 对数据 进行加密,只有用对应的 公钥 才能 进行解密。
     * @param keyStr
     * @param data
     * @return
     * @throws Exception
     */
    public static String decryptData(String keyStr, String data, Boolean isPublicKey) throws Exception {
        if (StringUtils.isEmpty(keyStr)) {
            return "";
        }
        return new String(decrypt(getKey(keyStr, isPublicKey), decryptBASE64(data)), "UTF-8");
    }

    /**
     * 加密
     * @param key
     * @param srcBytes
     * @return
     */
    private static byte[] encrypt(Key key, byte[] srcBytes) {
        if (key != null) {
            try {
                //Cipher负责完成加密或解密工作,基于RSA
                Cipher cipher = Cipher.getInstance("RSA");
                //对Cipher对象进行初始化
                cipher.init(Cipher.ENCRYPT_MODE, key);
                //加密,结果保存进resultBytes,并返回
                return cipher.doFinal(srcBytes);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    /**
     * 解密
     *
     * @param key
     * @param encBytes
     * @return
     */
    private static byte[] decrypt(Key key, byte[] encBytes) {
        if (key != null) {
            try {
                Cipher cipher = Cipher.getInstance("RSA");
                //对Cipher对象进行初始化
                cipher.init(Cipher.DECRYPT_MODE, key);
                //解密并将结果保存进resultBytes
                return cipher.doFinal(encBytes);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    /**
     * 根据key获取公有或者私有key对象
     * @param keyStr
     * @param isPublicKey
     * @return
     * @throws Exception
     */
    private static Key getKey(String keyStr, Boolean isPublicKey) throws Exception {
        if(isPublicKey){
            return getPublicKey(keyStr);
        }else{
            return getPrivateKey(keyStr);
        }
    }

    /**
     * 根据公有key获取公有key对象
     * @param key
     * @return
     * @throws Exception
     */
    private static RSAPublicKey getPublicKey(String key) throws Exception {
        byte[] keyBytes = Base64.getDecoder().decode(key);
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        return (RSAPublicKey) keyFactory.generatePublic(keySpec);
    }

    /**
     * 根据私有key获取私有对象
     * @param key
     * @return
     * @throws Exception
     */
    private static RSAPrivateKey getPrivateKey(String key) throws Exception {
        byte[] keyBytes = Base64.getDecoder().decode(key);
         PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);
    }

    /**
     * 获取公有/私有Key
     * @return
     */
    private static KeyPair getRSAKey() {
        KeyPair keyPair = null;
        try {
            //生成公钥和私钥对,基于RSA算法生成对象
            KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
            //初始化密钥对生成器,密钥大小为512位
            keyPairGen.initialize(1024);
            //生成一个密钥对,保存在keyPair中
            keyPair = keyPairGen.generateKeyPair();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return keyPair;
    }

    /**
     * 对字符串进行BASE64Decoder
     * @param key
     * @return
     * @throws Exception
     */
    private static byte[] decryptBASE64(String key) throws Exception {
        return Base64.getDecoder().decode(key);
    }

    /**
     * 对字节数组进行BASE64Encoder
     * @param key
     * @return
     * @throws Exception
     */
    private static String encryptBASE64(byte[] key) throws Exception {
        return  Base64.getEncoder().encodeToString(key);
    }

    public static void main(String[] args) throws Exception {
        // 生成的一对key保存好
        try {
            //得到私钥和公钥
            KeyPair keyPair = getRSAKey();
            RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
            RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();

            String pubKey = encryptBASE64(publicKey.getEncoded());
            String priKey = encryptBASE64(privateKey.getEncoded());
            System.out.println("公钥:" + pubKey);
            System.out.println("私钥:" + priKey);

            // 测试
            String message = "QWERDF";

            System.out.println("明文:" + message);
            String jiami = encryptData(pubKey, message, true);
            System.out.println("公钥加密后:" + jiami);
            String jiemi = decryptData(priKey, jiami, false);
            System.out.println("用私钥解密后的结果是:" + jiemi);

            jiami = encryptData(priKey, message, false);
            System.out.println("私钥加密后:" + jiami);
            jiemi = decryptData(pubKey, jiami, true);
            System.out.println("用公钥解密后的结果是:" + jiemi);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

  

输出:

公钥:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCw2WgOrzQSnDnVNSFKPyI0FgC+urKg6cSFaAB3KuHo5dM5KQJyjLWas9OSSfGvkfbn9i7APscViTShbu0HbbTVNAIMr29EoReAM1zz4bXMnSmD1Unmks1e05mjXa19BitZnXNyJj6Az9mbkkcdf+u/pH8GQbx0Dp9FLGMP4JjMoQIDAQAB
私钥:MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALDZaA6vNBKcOdU1IUo/IjQWAL66sqDpxIVoAHcq4ejl0zkpAnKMtZqz05JJ8a+R9uf2LsA+xxWJNKFu7QdttNU0Agyvb0ShF4AzXPPhtcydKYPVSeaSzV7TmaNdrX0GK1mdc3ImPoDP2ZuSRx1/67+kfwZBvHQOn0UsYw/gmMyhAgMBAAECgYBkqoxh93cjtMvywjh94+wbS/8Gko2FrSuRaL8DFmTbxp7yZZagD9p8AirHldG+R88NAQRhqBp49s3/qn3AAcGxuMwI7Y82bvEzGqvy/dhjsb3yjmhNcUV9J4mqACL39lz9sn6xmsgvP3omaxrvZZyLZRj1uFfhVD2G9hTzTfxa9QJBAP33lJUvf4hJs7WDR4cRJ0gTAVfHpn9PTURg+oZ7i2qNronOS2+efAn76k4GJ8J95dxpNcHt88fmvTLEzj5FErMCQQCyQ8yS8XMv0p9p6G37y8VwvuOhmxDKZSmFyW5MnDFgnt5nXrcimUeUiWOhjweJgksp7tuuy8Bj71GbeyceT71bAkBzT0ILKnHBM5WAyIZlcQhg1SA69s9F5n+ymEWnYdi/HG0u7Jebql2vOs37dxf+WqNPHAXoc13IWZ91uZ3a8Am5AkALuIN54eA1875Bg2O/230G1bY3yO9Ir3AUeNMEvHxOowNyfnrCDpvzOzlOxQ20z9lLT4YoLwNeTrzp4SYISyvjAkEAzNblWl/dPb+ycxQ6IdGHIOhwweA5QCz7ibx7U154vx1W/sizfIkYKJWo4Nhx8p0SpCXn7FY9jnszVbeNXIdhQw==
明文:QWERDF
公钥加密后:QLmRoHyM7bepkqhXj/64QEFTMs5eq1L6XeUi0PQorpb4rsWsGV+PW9x/6xbLXeKfXLI6mrS08d6T37wXX9Ww8TWO9ikJuJQdnFnh6M6x9bvfj7KH01W66NoGNInu0rs3wiZpMolL7rFOp6tGOJ8iBJ+tYZSKb8srOxzwtQgc1Zg=
用私钥解密后的结果是:QWERDF
私钥加密后:LnS182WnGZ8StGvldATzLtzDnGh+GB02eVYuQvWPO6HbY0qS+prr4UipEQoaKK6JwuX1+C0sX4VxaEYG8UOpIgNKR5LCpHTAOXEaMmrLLO8QZeo9MGBLp3DofAlmWvmqOBzhQVq5DJfp4Oyyt4wVZ5UI8i1HoCc/LplW0NjWLbU=
用公钥解密后的结果是:QWERDF

  

原文地址:https://www.cnblogs.com/LUA123/p/11287715.html

时间: 2024-08-24 03:23:49

非对称加密——RSA算法工具类的相关文章

Crypto++应用:非对称加密RSA

1,非对称加密RSA: (1)乙方生成两把密钥(公钥和私钥).公钥是公开的,任何人都可以获得,私钥则是保密的. (2)甲方获取乙方的公钥,然后用它对信息加密. (3)乙方得到加密后的信息,用私钥解密. 2,使用CryptoPP实现RSA: CryptoPP是一套非常完整的加密解密开源解决方案,如何使用这里就不多说了,请自行Google. #include "..\cryptopp562\randpool.h" #include "..\cryptopp562\osrng.h&

非对称加密RSA的应用及在C#中的实现

quote: http://www.cnblogs.com/happinessCodes/archive/2010/07/27/1786404.html 一说到数据的加密,常常会涉及到这几个单词:算法.原文.密文和密钥.通常,发送者把原文通过一个加密的算法,用密钥进行加密后将密文发送给接收者,然后接收者再用密钥对密文进行解密,得到原文.由于常用的加密算法都是公开的,所以,对原文的加密的关键,就是密钥了.对于这种加解密都使用同样的密钥的算法,我们称之为对称加密,对称加密的代表算法就是DES家族了.

排序算法工具类

/** * 排序算法工具类 */ public class GeneratedArray { /** * * 生成随机长度数组[min,max) * * @param min 最小值 * @param max 最大值 * @param num * @return */ public static int[] randomGeneratedArray(int min, int max, int num) { //断言判断 assert max>min:"数组生成范围指定有误"; i

RSA加密和解密工具类

1 import org.apache.commons.codec.binary.Base64; 2 3 import javax.crypto.Cipher; 4 import java.security.*; 5 import java.security.spec.PKCS8EncodedKeySpec; 6 import java.security.spec.X509EncodedKeySpec; 7 import java.util.HashMap; 8 import java.util

JAVA的RSA加密算法工具类

需要用到一个jar http://www.bouncycastle.org/latest_releases.html 需要注意的问题 JS用同一秘钥生成的密文用java解密出来是逆序的,即js加密123456用java解密出来是654321,原因未知,需要解密js加密的密文请使用后缀为byJs的方法. HexUtil.java > 1]; // two characters form the hex value. for (int i = 0, j = 0; j >> 4]; out[j

非对称加密RSA加密文件

RSA加密文件 关于RSA非对称加密很多地方都有讲解. 下面是AES AES 类 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.security.Key; import java.security.SecureRandom; impor

非对称加密RSA的C#实现

1.对称加密算法 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key). 对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中.对称加密通常使用的是相对较小的密钥, 一般小于256 bit.因为密钥越大,加密越强,但加密与解密的过程越慢.如果你只用1 bit来做这个密钥,那黑客们可以先试着用0来解密, 不行的话就再用1解:但如果你的密钥有1 MB大,黑客们可能永远也无法破解,但加密和解密

加密算法之非对称加密RSA

一:非对称加密的由来 RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的.RSA取名来自开发他们三者的名字.RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准.RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥.RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作

非对称加密算法-RSA算法

??加密算法分为对称加密算法和非对称加密算法,其中非对称加密算法作为计算机通信安全的基石,在保证数据安全方面起着重要的作用.而相对于对称加密算法的易理解性,非对称加密算法存在一定的难度.下面通过对RSA算法的剖析,让我们更好的理解非对称加密算法的原理. 一.对称加密算法和非对称加密算法 1.对称加密算法 ??对称加密算法:加密和解密都使用同样规则(密钥)的算法. ??(1).A选择某一种规则对信息进行加密: ??(2).B使用同一规则(逆规则)对信息进行解密: 2.非对称加密算法 ??非对称加密