【Java】使用RSA进行加密解密(代码实现)

        RSA就是一种非对称加密算法,它使用一对公钥和私钥进行加密和解密。在RSA算法中,公钥可以公开给任何人使用,用于加密数据,而私钥则需要保密,用于解密数据。

        对称加密算法使用相同的密钥进行加密和解密,因此需要保证密钥的安全性,同时也限制了密钥的分发和管理。非对称加密算法使用一对不同的密钥,即公钥和私钥,公钥用于加密,私钥用于解密,因此不需要保证密钥的安全性,也便于密钥的分发和管理。

        RSA算法包括三个部分:密钥生成、加密和解密。在加密阶段,先用公钥对明文进行加密,得到密文,然后将密文发送给接收方。接收方收到密文后,用私钥对密文进行解密,得到原来的明文。

下面代码就是RSA的工具类,复制即可用,其中main()方法可以进行测试;

import javax.crypto.Cipher;
import java.security.*;
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 RSAUtill {
    private static final String ALGORITHM = "RSA";

    // 加密方法
    public static String encrypt(String plainText, PublicKey publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }


    // 解密方法
    public static String decrypt(String encryptedText, PrivateKey privateKey) throws Exception {
        byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
        return new String(decryptedBytes);
    }


    // 生成公钥和私钥
    public static Map<String, String> generateKeyPair() {
        HashMap<String, String> map = new HashMap<>();
        try {
            // 创建KeyPairGenerator对象,指定算法为RSA
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");

            // 初始化KeyPairGenerator对象,设置密钥长度为 1024 位
            keyPairGenerator.initialize(1024);

            // 生成KeyPair对象,即公钥和私钥
            KeyPair keyPair = keyPairGenerator.generateKeyPair();

            // 获取公钥和私钥
            PublicKey publicKey = keyPair.getPublic();
            PrivateKey privateKey = keyPair.getPrivate();

            // 将公钥和私钥转换为字符串格式
            String publicKeyStr = Base64.getEncoder().encodeToString(publicKey.getEncoded());
            String privateKeyStr = Base64.getEncoder().encodeToString(privateKey.getEncoded());

            // 打印公钥和私钥字符串
            System.out.println("公钥:" + publicKeyStr);
            System.out.println("私钥:" + privateKeyStr);
            map.put("publicKey", publicKeyStr);
            map.put("privateKey", privateKeyStr);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return map;
    }



    // 从字符串格式的公钥创建 PublicKey 对象
    public static PublicKey getPublicKeyFromString(String publicKeyString) throws Exception {
        byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyString);
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
        return keyFactory.generatePublic(keySpec);
    }

    // 从字符串格式的私钥创建 PrivateKey 对象
    public static PrivateKey getPrivateKeyFromString(String privateKeyString) throws Exception {
        byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyString);
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
        return keyFactory.generatePrivate(keySpec);
    }


    //测试
    public static void main(String[] args) throws Exception {
        //生成公钥私钥
        Map<String, String> keyPair = generateKeyPair();
        // 私钥加密,公钥解密
        System.out.println(keyPair.get("publicKey"));
        System.out.println(keyPair.get("privateKey"));

        //========================测试公钥加密私钥解密===================
        // 公钥和私钥的字符串格式
        String publicKeyString = null;
        String privateKeyString = null;
        //可以将公钥密钥写在配置文件中,然后读取
//        publicKeyString = "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAswV660WILus6g0HFT5+9IRoSFnsnl7RGdwOkIBBkhj+A+TDx27u6FIkDFT5ALKPKncFeByzkSDo0yte1MIEOI3w/cvTHCXuH6mfLVOywyPR50dc0le8m2/IaRbv2ci8g5BNMswsjZuUVSZkp+k6iL3UBwJBq5U4L9XUG7SdZN2I07OPnZ78/LsOJN+QAPRIDe8+PnSb2DdEUta/fHLNgyEfCoAQPruVTOSs2AaJRuO/YzWdSQLIhwvoYuy3KL4t84017VYkI+qZUWUNDImOptHRbHOlL6gIShYsbWL0tvQKBLzjfEgZ0lKIFyYn0M5bIKuMXoMCEBfGFfRsd/gg4vMNvGEkesiXm/o0SAc3wVMt+wwUfgRo4RW09jchh6mvQi8qDAAWIjRrB3TzS2AKB//V8NBcBmiXftGZykYAkvvCRKkOwVnueAUEPrHp9HhZWrOnJyueRgH5zIqoG3+BbmXVUr7STswIVqa/JoZqIaOh3gQPdWNDxtvbtH4f90ulLOSqJoarFzLRkThKOx90/1a1uRHaIP6rlGcAtNLGFpjFoGAZbYQGFC9veN/wd1sXdc7ZONfBV2ndrxH/2Kk6pzQ3z8IKMGqUr9P8hvl3r/WYzbUUA1K4mhqSpi+Zr8+9kWMgyRdFqu5kSbdVVSnz0waSoLg8isJ3hxFSeRZ9ccT8CAwEAAQ==";
//        privateKeyString = "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";
        publicKeyString = keyPair.get("publicKey");
        privateKeyString = keyPair.get("privateKey");

        // 从字符串格式的公钥和私钥创建公钥和私钥对象
        PublicKey publicKey = getPublicKeyFromString(publicKeyString);
        PrivateKey privateKey = getPrivateKeyFromString(privateKeyString);

        // 需要加密的明文
        String plainText = "password";
        // 使用公钥进行加密(开发过程中将公钥提供给前端进行rsa加密)
        String encryptedText = encrypt(plainText, publicKey);
        // 打印加密结果
        System.out.println("加密后: " + encryptedText);

        // 使用私钥进行解密(开发过程中使用私钥对前端传递经过rsa加密的字符串进行解密)
        String decryptedText = decrypt(encryptedText, privateKey);
        // 打印解密结果
        System.out.println("解密后: " + decryptedText);
        //========================测试公钥加密私钥解密===================
    }

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
RSA加密解密算法是公钥加密算法的代表,常用于加密信息和数字签名。在Java中,我们可以使用Java内置的BigInteger类和一些基本数学算法来实现RSA加密解密算法,以下是一个简单的实现过程: 1. 生成公钥和私钥 ```java import java.math.BigInteger; import java.util.Random; public class RSAKeyGenerator { private final static BigInteger ONE = new BigInteger("1"); private final static Random random = new Random(); public static void main(String[] args) { BigInteger p = BigInteger.probablePrime(512, random); BigInteger q = BigInteger.probablePrime(512, random); BigInteger n = p.multiply(q); BigInteger phiN = p.subtract(ONE).multiply(q.subtract(ONE)); BigInteger e = new BigInteger("65537"); BigInteger d = e.modInverse(phiN); System.out.println("Public Key: (" + e + ", " + n + ")"); System.out.println("Private Key: (" + d + ", " + n + ")"); } } ``` 2. 加密数据 ```java import java.math.BigInteger; public class RSAEncryptor { public static String encrypt(String message, BigInteger e, BigInteger n) { byte[] bytes = message.getBytes(); BigInteger m = new BigInteger(bytes); BigInteger c = m.modPow(e, n); return c.toString(); } } ``` 3. 解密数据 ```java import java.math.BigInteger; public class RSADecryptor { public static String decrypt(String ciphertext, BigInteger d, BigInteger n) { BigInteger c = new BigInteger(ciphertext); BigInteger m = c.modPow(d, n); byte[] bytes = m.toByteArray(); return new String(bytes); } } ``` 以上是一个简单的Java实现RSA加密解密算法的过程,需要注意的是,RSA算法的安全性高度依赖于大素数的难以分解性,因此在实际应用中需要选取足够大的素数。另外,由于BigInteger类的运算速度较慢,因此在实际应用中需要考虑使用更高效的算法实现RSA加密解密

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mxin5

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值