欢迎访问宙启技术站
智能推送

Java函数:如何实现基于RSA算法的加密和解密?

发布时间:2023-06-16 18:23:34

概述:

RSA算法是一种非对称加密算法,被广泛应用于加密通信和数字签名领域。本题要求实现基于RSA算法的加密和解密,涉及到RSA算法的原理、公钥和私钥的生成、加密和解密的过程。本文将从这些方面逐一介绍。

RSA算法的原理:

RSA算法是基于大数分解问题的难度来实现加密。其核心原理是使用两个大质数p和q的乘积n为模数,通过选择合适的指数e和d,满足以下条件:

1. e和(p-1)(q-1)互质

2. (e * d) % (p-1)(q-1) = 1

其中,e是公开的加密指数,d是私有的解密指数。对于明文m,加密得到的密文c为:

c = m^e % n

对于密文c,解密得到明文m为:

m = c^d % n

公钥和私钥的生成:

RSA算法的安全性依赖于两个非常大的互质质数p和q,因此生成公钥和私钥的关键是生成这两个质数。一般采用如下步骤:

1.选择两个大质数p和q,计算n=p*q,?(n)=(p-1)*(q-1)

2.选择一个与?(n)互质的正整数e,满足1< e <?(n)

3.求解d,使得e * d ≡ 1(mod ?(n))

4.公钥为(n,e),私钥为(n,d)

Java实现:

首先定义一个RSAUtils类,其中包含以下方法:

/**
 * 生成公私钥对
 * @param keySize 长度,1024、2048、3072、4096、8192等
 * @return keyPair 公私钥对
 */
public static KeyPair generateKeyPair(int keySize)

/**
 * 加密
 * @param publicKey 公钥
 * @param plainBytes 明文byte数组
 * @return cipherBytes 密文byte数组
 */
public static byte[] encrypt(PublicKey publicKey, byte[] plainBytes)

/**
 * 解密
 * @param privateKey 私钥
 * @param cipherBytes 密文byte数组
 * @return plainBytes 明文byte数组
 */
public static byte[] decrypt(PrivateKey privateKey, byte[] cipherBytes)

1. 生成公私钥对:

public static KeyPair generateKeyPair(int keySize) {
    try {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");//RSA算法
        SecureRandom secureRandom = new SecureRandom();//随机数
        keyPairGenerator.initialize(keySize, secureRandom);//设置长度和随机数
        return keyPairGenerator.generateKeyPair();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return null;
}

2. 加密

public static byte[] encrypt(PublicKey publicKey, byte[] plainBytes) {
    try {
        Cipher cipher = Cipher.getInstance("RSA");//RSA算法
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);//加密模式和公钥
        return cipher.doFinal(plainBytes);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

其中cipher.init(Cipher.ENCRYPT_MODE, publicKey)指定加密模式和公钥,doFinal方法返回密文byte数组。

3. 解密

public static byte[] decrypt(PrivateKey privateKey, byte[] cipherBytes) {
    try {
        Cipher cipher = Cipher.getInstance("RSA");//RSA算法
        cipher.init(Cipher.DECRYPT_MODE, privateKey);//解密模式和私钥
        return cipher.doFinal(cipherBytes);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

其中cipher.init(Cipher.DECRYPT_MODE, privateKey)指定解密模式和私钥。

完整代码:

import javax.crypto.Cipher;
import java.security.*;

public class RSAUtils {

    /**
     * 生成公私钥对
     */
    public static KeyPair generateKeyPair(int keySize) {
        try {
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");//RSA算法
            SecureRandom secureRandom = new SecureRandom();//随机数
            keyPairGenerator.initialize(keySize, secureRandom);//设置长度和随机数
            return keyPairGenerator.generateKeyPair();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 加密
     */
    public static byte[] encrypt(PublicKey publicKey, byte[] plainBytes) {
        try {
            Cipher cipher = Cipher.getInstance("RSA");//RSA算法
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);//加密模式和公钥
            return cipher.doFinal(plainBytes);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 解密
     */
    public static byte[] decrypt(PrivateKey privateKey, byte[] cipherBytes) {
        try {
            Cipher cipher = Cipher.getInstance("RSA");//RSA算法
            cipher.init(Cipher.DECRYPT_MODE, privateKey);//解密模式和私钥
            return cipher.doFinal(cipherBytes);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) {
        String plainText = "RSA算法测试";
        int keySize = 1024;//密钥长度,单位bit
        KeyPair keyPair = generateKeyPair(keySize);//生成公私钥对
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();
        byte[] plainBytes = plainText.getBytes();
        byte[] cipherBytes = encrypt(publicKey, plainBytes);//加密明文
        byte[] decryptedBytes = decrypt(privateKey, cipherBytes);//解密密文
        String decryptedText = new String(decryptedBytes);
        System.out.println("明文:" + plainText);
        System.out.println("密文:" + new String(cipherBytes));
        System.out.println("解密后明文:" + decryptedText);
    }
}

注意事项:

1. 公钥和私钥需要严格保密,不可泄露。

2. 不可使用过于简单的质数,否则会导致加密的不安全。

3. RSA加密算法只适合加密较短的数据,一般使用RSA加密非常小的随机密码,然后再用这个密码加密数据,称为混合加密。