之前分享过三种常用MD5、SHA2和AES加密算法(点这里)实现源码,前三者分别属于哈希加密和对称加密,而另一种很常用的非对称加密RSA算法实现这次分享出来。RSA算法的原理和用途大家可以网上自行搜索。虽然其算法原理很简单,但是由于其密钥长度很长(一般至少1024位),所以实际在其相互运算以及大质数查找会牵扯很多算法理论,因此我这里代码实现中数学运算是直接基于GMP(The GNU Multiple Precision Arithmetic Library),我将其linux64位下编译好的动静态库都已上传,如果环境相同可以不用安装直接使用。另外针对RSA算法内的大质数p和q以及公钥e和私钥d等也是有要求的(参考这里),这块我是参考JDK内RSA算法的实现。
下面开始准备工作,首先是大质数的选取,由于大质数判断是相当困难,所以当前对于大质数的选取都是概率选取,先看下JDK内实现(我查看的代码版本是jdk-10.0.1)
BigInteger.java内762-769行,其中SMALL_PRIME_THRESHOLD为常量95 ,DEFAULT_PRIME_CERTAINTY为常量100,rnd入参是一个随机数,所以是按95位为分界对应两个不同方法,我这里只考虑长密钥所以直接看大的
public static BigInteger probablePrime(intbitLength, Random rnd) {if (bitLength < 2)throw new ArithmeticException("bitLength < 2");return (bitLength < SMALL_PRIME_THRESHOLD ?smallPrime(bitLength, DEFAULT_PRIME_CERTAINTY, rnd) :
largePrime(bitLe