Java RSA算法进行解密

概要:

RSA算法的解密和加密类似,私钥对应的整数d和用于取模的整数n。其中的n和加密时的n完全相同。对于密文数字c,计算明文的公式是:cd mod n。之所以加密是由公式me mod n得到的密文c通过这个公式计算一下就可以反过来得到原来的明文m。本实例利用私钥文件Skey_RSA_priv.dat和密文文件Enc_RSA.dat进行解密。

| |目录

技术要点

使用RSA算法解密的技术要点如下:

  • 利用FileInputStream读取密文Enc_RSA.dat。

  • 利用RSAPrivateKey类的readObject()方法获取私钥。

  • 利用RSAPrivateKey类获取私钥的BigInteger类型的参数(d,n)。

  • 利用BigInteger的modPow()方法执行解密的公式计算。

  • 解析出明文整型数对应的字符串。

代码实现

说明:Enc_RSA.dat与Skey_RSA_priv.dat的获取地址:Java RSA算法进行加密

package net.xsoftlab.baike;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.math.BigInteger;
import java.security.interfaces.RSAPrivateKey;

public class Password_DEC {
	public static void main(String[] args) throws Exception {// 根据RSA私钥进行解密
		System.out.println("根据私钥破解密文:\n");
		// 读取密文
		BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("Enc_RSA.dat")));
		String ctext = in.readLine();
		BigInteger mi = new BigInteger(ctext);
		// 读取私钥
		FileInputStream f = new FileInputStream("Skey_RSA_priv.dat");
		ObjectInputStream b = new ObjectInputStream(f);
		RSAPrivateKey prk = (RSAPrivateKey) b.readObject();
		BigInteger d = prk.getPrivateExponent();// 返回此私钥的指数
		BigInteger n = prk.getModulus();// 返回此私钥的模
		System.out.println("私钥的指数d=" + d);
		System.out.println("私钥的模n=" + n);
		BigInteger jie = mi.modPow(d, n);// 进行解密操作
		System.out.println("m=" + jie);// 显示解密结果
		byte[] mt = jie.toByteArray();
		System.out.println("解密后的文本内容为:");
		for (int i = 0; i < mt.length; i++) {
			System.out.print((char) mt[i]);
		}
	}
}

程序解读

  1. 在获取私钥的参数(d,n)的时候可以使用RSAPrivateKey类的getPrivateExponent()和getModulus()方法分别获得公钥中d和n的值。

  2. 从生成的私钥文件Skey_RSA_priv.dat中读取私钥,由于生成该私钥使用的算法是RSA算法,因此从文件读取公钥对象后强制转换为RSAPrivateKey类型,以便后面读取RSA算法所需要的参数。

  3. RSA算法解密的结果m是一个很大的整数,为了计算出其对应的字符串的值,先使用BigInteger类的toByteArray()方法得到代表该整型数的字节数组,然后将数组中每个元素转换为字符,组成字符串。

  4. 从生成的密文文件Enc_RSA.dat中读取密文,由于实例162保存的只是一行字符串,因此只要一条readLine()语句即可。由于这一行字符串表示的是一个很大的整型数,因此使用BigInteger类来表示这个整型数。

  5. 使用BigInteger的modPow()方法计算前面的公式:cd mod n。方法返回的结果即明文对应的整型数m。


评论关闭
评论 还能输入200
评论关闭
评论 还能输入200
资料加载中...
已关注 , 取消