首页 > 代码库 > java加解密之RSA使用

java加解密之RSA使用

最近为了分析一段请求流,不得不去研究一下RSA加密。

首先,强调一点:密钥的“钥”读“yue”,不是“yao”,额。。。

网上关于RSA的原理一抓一大把的,这里只是简单说说我的理解:

1. 两个足够大的互质数p, q;

2. 用于模运算的模 n=p*q;

3. 公钥KU(e, n)中的e满足 1<e< (p-1)(q-1),且与(p-1)(q-1)互质;

4. 密钥KR(d, n)中的d满足  d*e % (p-1)(q-1)= 1,%是取余运算。

因为公钥是公开的,所以我知道了e和n,那么根据2,3,4式子的关系,我们只要从n的值推出p, q的值则可计算出d的值,也就能找到密钥。

然而,关键就在这里, n=p*q,如果两个互质数p和q足够大,那么根据目前的计算机技术和其他工具,至今也没能从n分解出p和q,这是数学上的一个难题,也正是这个难题成为了RSA加密至今被广泛使用的原因。换句话说,只要密钥长度n足够大(一般1024足矣),基本上不可能从公钥信息推出私钥信息。


好了,这里作为研究的随笔,记录一下java如何使用,以下主要有三种方法,基本大同小异,只是获取公钥私钥的途径不一样就是了:

方法一:

利用KeyPairGenerator直接生成公钥和密钥,一般私钥保留给服务端,公钥交给客户端。

public class RSACryptography {
	
	public static String data=http://www.mamicode.com/"hello world";>

运行结果:

技术分享

方法二:

实际上,方法一只是用来生成密钥就OK了,生成的密钥需要保存到本地文件中,所以一般不会在客户端调用KeyPairGenerator进行密钥的生成操作。

这里,我们可以将方法一得到的密钥保存到文件,下次我们直接读取就可以了。我假设以String的形式保存在文件内,那么接下来直接使用读取到的String生成密钥即可。

当然,你也可以使用openssl来生成也可以,不过我觉得麻烦就不弄了。

public class RSACryptography {
	
	public static String data=http://www.mamicode.com/"hello world";>运行结果:

技术分享

方法三:

除了保存密钥字符串之外,其他的做法一般是只保存 模n(modulus),公钥和私钥的e和d(exponent)。

其中,n, e, d可以这样获取到,获取到后可以保存到本地文件中。

		//获取公钥
		RSAPublicKey publicKey=(RSAPublicKey) getPublicKey(publicKeyString);
		BigInteger modulus1=publicKey.getModulus();
		BigInteger exponent1=publicKey.getPublicExponent();
			
		//获取私钥
		RSAPrivateKey privateKey=(RSAPrivateKey) getPrivateKey(privateKeyString);		
		BigInteger modulus2=privateKey.getModulus();
		BigInteger exponent2=privateKey..getPrivateExponent();

这里,假设我已经从文件中读取到了modulus和exponent:

public class RSACryptography {
	
	public static String data=http://www.mamicode.com/"hello world";>运行结果:

技术分享

这里三种方式总结起来也就是

1,.KeyPairGenerator获取key;

2. String获取key;

3. modulus和exponent获取key。

然而,当加密的数据太长的时候需要



java加解密之RSA使用