Java实现RSA非对称加解密和AES对称加解密,并动态选择AES的加解密模式

RSAAES是两种常用的加密算法,分别用于非对称加密对称加密。RSA使用一对公钥和私钥,而AES使用单一的密钥。在实际应用中,我们通常会使用RSA来加密AES的密钥,然后将该密钥用于AES加密数据,这种方法称为混合加密

RSA非对称加密解密

import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

public class RSA {
    public static void main(String[] args) {
        try {
            // 生成密钥对
            KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
            kpg.initialize(2048);
            KeyPair pair = kpg.generateKeyPair();

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

            // 待加密的明文
            String plainText = "Hello";
            byte[] encryptedText = encrypt(publicKey, plainText);
            String decryptedText = decrypt(privateKey, encryptedText);

            // 打印结果
            System.out.println("原文: " + plainText);
            System.out.println("解密后: " + decryptedText);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 使用公钥加密
    public static byte[] encrypt(PublicKey publicKey, String plainText) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        return cipher.doFinal(plainText.getBytes());
    }

    // 使用私钥解密
    public static String decrypt(PrivateKey privateKey, byte[] encryptedText) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        return new String(cipher.doFinal(encryptedText));
    }
}

AES对称加密解密,动态选择AES的加解密模式(ECB, CBC, PCBC, CTR, CTS)

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import java.util.Base64;

public class AES {
    public static void main(String[] args) {
        try {
            // 生成AES密钥
            KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
            keyGenerator.init(256);
            SecretKey secretKey = keyGenerator.generateKey();

            // 待加密的明文
            String plainText = "Hello";
            
            // 动态选择加密模式
            String mode = "CBC"; // 可以是"ECB", "CBC", "PCBC", "CTR", "CTS"等
            IvParameterSpec iv = new IvParameterSpec(new byte[16]); // 16字节的随机IV

            // 加密
            byte[] encryptedText = encrypt(secretKey, mode, iv, plainText);
            // 解密
            String decryptedText = decrypt(secretKey, mode, iv, encryptedText);

            // 打印结果
            System.out.println("原文: " + plainText);
            System.out.println("解密后: " + decryptedText);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 使用密钥、模式和IV进行加密
    public static byte[] encrypt(SecretKey secretKey, String mode, IvParameterSpec iv, String plainText) throws Exception {
        Cipher cipher = Cipher.getInstance("AES/" + mode + "/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
        return Base64.getEncoder().encode(cipher.doFinal(plainText.getBytes()));
    }

    // 使用密钥、模式和IV进行解密
    public static String decrypt(SecretKey secretKey, String mode, IvParameterSpec iv, byte[] encryptedText) throws Exception {
        Cipher cipher = Cipher.getInstance("AES/" + mode + "/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
        return new String(cipher.doFinal(Base64.getDecoder().decode(encryptedText)));
    }
}
  • KeyPairGenerator.getInstance("RSA")KeyGenerator.getInstance("AES"):分别获取RSA和AES的密钥生成器实例。
  • kpg.initialize(2048)keyGenerator.init(256):分别设置RSA和AES密钥的长度。
  • cipher.init():初始化Cipher对象,设置加密或解密模式,以及所需的密钥或密钥对和初始化向量IV(对于需要IV的模式)。
  • "AES/" + mode + "/PKCS5Padding":动态地根据传入的模式参数设置AES的加密模式和填充方式。
  • Base64.getEncoder().encode()Base64.getDecoder().decode():用于将加密后的字节数据编码为可打印的字符串形式,以及将编码后的字符串解码回字节数据,便于存储和传输。
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值