首页 > 代码库 > 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使用