RSA加密算法

RSA(Rivest-Shamir-Adleman)是一种常用的非对称加密算法,可以用于数据的加密和解密。它是由Ron Rivest、Adi Shamir和Leonard Adleman在1977年共同提出的,目前被广泛应用于网络通信和数据安全领域。本文将介绍RSA加密算法的原理以及如何在Java中使用RSA进行加密和解密。

RSA算法原理

RSA算法基于数论中的两个重要定理:欧拉定理和费马小定理。其核心原理为:选择两个不同的大素数p和q,计算n = p * q,选择一个整数e作为公钥,使得e与(p-1)(q-1)互质,计算d使得d = e^(-1) mod ((p-1)(q-1)),d即为私钥。公钥(n, e)可以公开,而私钥d必须保密。

加密过程:

  1. 将明文转换为对应的数字形式m;
  2. 计算密文c = m^e mod n。

解密过程:

  1. 计算明文m = c^d mod n;
  2. 将数字形式的明文转换为对应的明文。

Java实现RSA加密算法

生成密钥对

首先,我们需要生成RSA加密算法所需的公钥和私钥。Java提供了KeyPairGenerator类来生成密钥对,示例代码如下:

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;

public class RSAKeyGenerator {
    public static void main(String[] args) {
        try {
            // 创建RSA密钥对生成器
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
            // 初始化密钥对生成器,设置密钥长度为1024位
            keyPairGenerator.initialize(1024);
            // 生成密钥对
            KeyPair keyPair = keyPairGenerator.generateKeyPair();
            // 获取公钥和私钥
            PublicKey publicKey = keyPair.getPublic();
            PrivateKey privateKey = keyPair.getPrivate();
            // 输出公钥和私钥
            System.out.println("公钥:" + Base64.getEncoder().encodeToString(publicKey.getEncoded()));
            System.out.println("私钥:" + Base64.getEncoder().encodeToString(privateKey.getEncoded()));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
}

运行上述代码,将会输出生成的公钥和私钥。

加密和解密

在生成密钥对之后,我们可以使用公钥对数据进行加密,使用私钥对数据进行解密。Java提供了Cipher类来实现加密和解密操作,示例代码如下:

import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

public class RSAEncryptDecrypt {
    public static void main(String[] args) {
        try {
            // 假设这里有一个明文需要加密
            String plainText = "Hello, RSA!";
            byte[] plainBytes = plainText.getBytes();
            
            // 假设这里有一个公钥字符串
            String publicKeyStr = "公钥字符串";
            byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyStr);
            
            // 使用公钥进行加密
            PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(publicKeyBytes));
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            byte[] encryptedBytes = cipher.doFinal(plainBytes);
            String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);
            System.out.println("加密后的密文:" + encryptedText);
            
            // 假设这里有一个私钥字符串
            String privateKeyStr = "私钥字符串";
            byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyStr);
            
            // 使用私钥进行解密
            PrivateKey privateKey = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(privateKeyBytes));
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
            String decryptedText = new String(decryptedBytes);
            System.out.println("解密后的明文:" + decryptedText);
        } catch