JAVA实现RSA加密解密,RSA分段加密解密,直接用

前言

RSA加密方式是一种非对称加密算法,与对称加密算法不同的是,RSA算法有两个不同的密钥,一个是公钥,一个是私钥。

RSA算法常用于非对称加密,非对称加密流程如下

  1. 甲方生成一对密钥(公钥和私钥)。
  2. 乙方获取甲方的公钥,然后用它对信息加密。
  3. 乙方再使用自己保存的私钥对信息进行解密。

一.生成密钥

这段直接在测试类中就可以运行,就没有写成方法,这没什么说的

把打印的公钥私钥保存就可以用,公钥私钥在加密解密时 必须是对应的

try {
      // 创建KeyPairGenerator对象,指定算法为RSA
      KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");

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

      // 生成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);
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
    }

二.使用密钥进行加密解密

通过上面的方法生成的公钥和私钥来进行加密解密

getPublicKeyFromString() 和 getPrivateKeyFromString() 这两个方法可以提出来新写一个类

这里为了方便就写在一起了

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 void main(String[] args) throws Exception {

    // 公钥和私钥的字符串格式
    String 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==";
    String privateKeyString = "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";

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

    // 要加密的明文
    String plainText = "Hello, RSA!";
    // 使用公钥进行加密
    String encryptedText = encrypt(plainText, publicKey);
    // 打印加密结果
    System.out.println("Encrypted: " + encryptedText);

    // 使用私钥进行解密
    String decryptedText = decrypt(encryptedText, privateKey);
    // 打印解密结果
    System.out.println("Decrypted: " + decryptedText);
  }

  // 从字符串格式的公钥创建 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);
  }

}

测试结果  --  没问题

三.明文过长的问题

在正常使用的时候,加密的明文有可能比较长,我们可以在生成密钥的时候修改keyPairGenerator.initialize(2048)对象来设置密钥的长度,RSA的加密长度是根据密钥的长度来决定的,但是这只能解决一小部分问题,要是明文的长度在超过密钥长度还是会出现问题

    String plainText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus ac augue et justo iaculis fermentum. Fusce a velit id tortor ultricies vulputate. In vestibulum velit a nisi volutpat, vel euismod erat dictum. Sed non nisi eget urna dictum vehicula. Nullam gravida erat eu mauris elementum congue. Vivamus facilisis arcu nec purus sollicitudin, id hendrerit odio eleifend. Nulla facilisi. Donec mattis magna in sem euismod, eget tincidunt sapien iaculis. Proin vulputate dui vitae tortor iaculis, eu hendrerit urna euismod. Sed non aliquet velit. Sed posuere semper quam, at hendrerit nunc bibendum eu. Etiam mattis eleifend urna, a placerat odio congue eu. Phasellus quis neque sed leo fringilla consequat. Vivamus vel vestibulum eros, nec blandit odio.";
    String encryptedText = encrypt(plainText, publicKey);
    System.out.println("Encrypted: " + encryptedText);

这是密钥长度为2048时,使用这个明文进行加密的话就会报错,可以测试一下

四.解决明文长度过长问题

RSA加密明文数据过长的问题,可以通过分段加密、分段解密的方式进行解决。如果明文超出长度,可以采用这种方式。也可以使用"AES/ECB/PKCS5Padding"模式,这个模式会自动处理数据的填充,有很多方法,下面带来一种解决方法

public class RSAUtil {
  /**
   * AES_ALGORITHM常量定义了对称加密算法AES的名称
   */
  private static final String AES_ALGORITHM = "AES";
  /**
   * AES_KEY_SIZE常量定义了AES密钥的长度
   */
  private static final int AES_KEY_SIZE = 256;
  /**
   * RSA_ALGORITHM常量定义了非对称加密算法RSA的名称
   */
  private static final String RSA_ALGORITHM = "RSA";

  /**
   * 使用RSA公钥加密消息
   *
   * @param plainText  明文
   * @param publicKey 公钥
   * @return 加密后的字符串
   */
  public static String encrypt(String plainText, PublicKey publicKey) throws GeneralSecurityException {
    // 生成随机AES密钥以进行对称加密
    KeyGenerator keyGen = KeyGenerator.getInstance(AES_ALGORITHM);
    keyGen.init(AES_KEY_SIZE);
    SecretKey secretKey = keyGen.generateKey();

    // 使用AES加密明文
    Cipher aesCipher = Cipher.getInstance(AES_ALGORITHM);
    aesCipher.init(Cipher.ENCRYPT_MODE, secretKey);
    byte[] encryptedBytes = aesCipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));

    // 使用RSA加密AES密钥
    Cipher rsaCipher = Cipher.getInstance(RSA_ALGORITHM);
    rsaCipher.init(Cipher.ENCRYPT_MODE, publicKey);
    byte[] encryptedAESKey = rsaCipher.doFinal(secretKey.getEncoded());

    // 组合AES密钥和加密的消息
    String encryptedAESKeyStr = Base64.getEncoder().encodeToString(encryptedAESKey);
    String encryptedMessageStr = Base64.getEncoder().encodeToString(encryptedBytes);

    return encryptedAESKeyStr + ":" + encryptedMessageStr;
  }

  /**
   * 使用RSA私钥解密消息
   *
   * @param encryptedText 密文
   * @param privateKey    私钥
   * @return 解密后的字符串
   */
  public static String decrypt(String encryptedText, PrivateKey privateKey) throws GeneralSecurityException {
    // 将输入分成加密的AES密钥和加密的消息两部分
    String[] parts = encryptedText.split(":");
    if (parts.length != 2) {
      throw new IllegalArgumentException("无效的输入格式");
    }

    String encryptedAESKeyStr = parts[0];
    String encryptedMessageStr = parts[1];

    // 使用RSA私钥解密AES密钥
    Cipher rsaCipher = Cipher.getInstance(RSA_ALGORITHM);
    rsaCipher.init(Cipher.DECRYPT_MODE, privateKey);
    byte[] encryptedAESKey = Base64.getDecoder().decode(encryptedAESKeyStr);
    byte[] decryptedAESKey = rsaCipher.doFinal(encryptedAESKey);

    // 使用AES解密消息
    SecretKey secretKey = new SecretKeySpec(decryptedAESKey, 0, decryptedAESKey.length, AES_ALGORITHM);
    Cipher aesCipher = Cipher.getInstance(AES_ALGORITHM);
    aesCipher.init(Cipher.DECRYPT_MODE, secretKey);
    byte[] decryptedBytes = aesCipher.doFinal(Base64.getDecoder().decode(encryptedMessageStr));

    return new String(decryptedBytes, StandardCharsets.UTF_8);
  }

  
  public static void main(String[] args) throws Exception {

    // 公钥和私钥的字符串格式
    String 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==";
    String privateKeyString = "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";

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

    // 加密的密文 
    String plainText = "不会限制长度的";
    // 使用公钥进行加密
    String encryptedText = encrypt(plainText, publicKey);
    打印加密结果
    System.out.println("Encrypted: " + encryptedText);

    // 使用私钥进行解密
    String decryptedText = decrypt(encryptedText, privateKey);
    // 打印解密结果
    System.out.println("Decrypted: " + decryptedText);
  }

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

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

}

这就可以解决明文加密的长度过长的问题了  可以试一下  解决的方法有很多种  不唯一

要是觉得有用的话 那就顺手点个赞

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java中可以通过使用Java Cryptography Architecture(JCA)提供的RSA类来实现RSA加密解密。首先,您需要生成一对RSA密钥,其中一个是公钥,另一个是私钥。然后,您可以使用公钥对数据进行加密,使用私钥对加密后的数据进行解密。 下面是一个简单的示例代码,展示了如何使用Java实现RSA加密解密: ```java import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Security; import javax.crypto.Cipher; public class RSAExample { public static void main(String[] args) throws Exception { // 生成RSA密钥对 KeyPair keyPair = generateKeyPair(); // 待加密的明文 String plaintext = "Hello, RSA!"; // 使用公钥加密明文 byte[] encryptedData = encrypt(plaintext, keyPair.getPublic()); // 使用私钥解密密文 String decryptedText = decrypt(encryptedData, keyPair.getPrivate()); System.out.println("明文: " + plaintext); System.out.println("加密后的密文: " + new String(encryptedData)); System.out.println("解密后的明文: " + decryptedText); } // 生成RSA密钥对 public static KeyPair generateKeyPair() throws Exception { Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA", "BC"); keyPairGenerator.initialize(2048); return keyPairGenerator.generateKeyPair(); } // 使用公钥加密 public static byte[] encrypt(String plaintext, PublicKey publicKey) throws Exception { Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", "BC"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); return cipher.doFinal(plaintext.getBytes()); } // 使用私钥解密 public static String decrypt(byte[] encryptedData, PrivateKey privateKey) throws Exception { Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", "BC"); cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] decryptedData = cipher.doFinal(encryptedData); return new String(decryptedData); } } ``` 请注意,上述示例使用了Bouncy Castle加密库,您需要在项目中添加Bouncy Castle的相关依赖。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值