RSA公钥加密与私钥解密的Java实现

引言

RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,广泛应用于信息安全领域。与对称加密算法不同,RSA使用一对密钥:公钥和私钥。数据使用公钥进行加密,而使用私钥进行解密。本篇文章将介绍如何在Java中实现RSA公钥加密和私钥解密,并附上相关的代码示例。


RSA原理概述

RSA算法的安全性建立在大数因子分解的困难性上。简而言之,RSA的密钥生成过程大致包括以下几个步骤:

  1. 选择两个大素数 ( p ) 和 ( q )。
  2. 计算模数 ( n = p \times q )。
  3. 计算欧拉函数 ( \phi(n) = (p-1)(q-1) )。
  4. 选择公钥 ( e ),使其满足 ( 1 < e < \phi(n) ) 且与 ( \phi(n) ) 互质。
  5. 计算私钥 ( d ),使得 ( d \times e \mod \phi(n) = 1 )。

Java实现RSA加密与解密

以下是实现RSA公钥加密和私钥解密的完整代码示例。

引入依赖

在使用RSA之前,需要在Java项目中引入相关依赖。确保项目中包含 java.securityjavax.crypto 包。

代码示例

以下是实现RSA加密、解密的完整Java代码:

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.SignatureException;
import java.util.Base64;

import javax.crypto.Cipher;

public class RSAExample {
    
    // 生成公钥与私钥
    public static KeyPair generateKeyPair() throws Exception {
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
        keyGen.initialize(2048);
        return keyGen.generateKeyPair();
    }
    
    // 公钥加密
    public static String encrypt(String data, PublicKey publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encryptedData = cipher.doFinal(data.getBytes());
        return Base64.getEncoder().encodeToString(encryptedData);
    }
    
    // 私钥解密
    public static String decrypt(String encryptedData, PrivateKey privateKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
        return new String(decryptedData);
    }

    public static void main(String[] args) {
        try {
            // 生成公钥和私钥
            KeyPair keyPair = generateKeyPair();
            PublicKey publicKey = keyPair.getPublic();
            PrivateKey privateKey = keyPair.getPrivate();
            
            // 原始数据
            String originalData = "Hello, RSA!";
            
            // 公钥加密
            String encryptedData = encrypt(originalData, publicKey);
            System.out.println("Encrypted Data: " + encryptedData);
            
            // 私钥解密
            String decryptedData = decrypt(encryptedData, privateKey);
            System.out.println("Decrypted Data: " + decryptedData);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

代码讲解

  1. KeyPair 生成:使用 KeyPairGenerator 来生成一对RSA密钥。
  2. 公钥加密:通过 Cipher 对象使用公钥对数据进行加密。加密后的数据采用Base64编码。
  3. 私钥解密:同样使用 Cipher 对象,通过私钥对加密数据进行解密,得到原始数据。

交互过程序列图

为了更好地理解RSA加密和解密的过程,我们用序列图来表示这一交互过程。

sequenceDiagram
    participant User
    participant PublicKey
    participant Cipher
    participant PrivateKey

    User->>PublicKey: 发送原始数据
    PublicKey->>Cipher: 公钥加密
    Cipher->>User: 返回加密数据
    User->>PrivateKey: 发送加密数据
    PrivateKey->>Cipher: 私钥解密
    Cipher->>User: 返回原始数据

数据安全性的重要性

RSA加密算法由于其非对称性,被广泛应用于HTTPS、数字签名等多种场合,可以说是网络安全的保护伞。然而,随着技术的进步,RSA的密钥长度逐渐成为安全的瓶颈,通常建议使用2048位或更长的密钥。

RSA使用的饼状图

为了直观展现RSA加密在信息安全中的占比,我们可以用饼状图来表示不同加密算法的使用情况。

pie
    title 加密算法使用情况
    "RSA": 30
    "AES": 50
    "DES": 15
    "其他": 5

结尾

本文介绍了RSA公钥加密和私钥解密的基本原理,并提供了相应的Java代码示例。在数字化时代,信息安全尤为重要,RSA算法作为一种经典的加密方法,不仅提升了数据传输的安全性,也为数字签名、身份验证等提供了有力的支持。希望通过本篇文章,读者能够对RSA有更深入的理解,并在实际项目中灵活运用。