直到今天,我才不再认为“RSA算法只在考试用过”,因为最近做的支付就用到了这个算法,我才可以有理有据地告诉我自己:“RSA不单单在考试用到啊!”。你要问我为什么,我只能告诉你,继续看下去!
◔ 加密历史
不知道提到加密算法,正在看博客的你,最先想到的是哪种加密?
我只能告诉你,我最先想到的是公钥加密,这是一种很6的加密。因为在公钥加密出现之前,所有的加密都是一种模型:
1)甲使用某种规则对文件加密,将文件和加密方式告诉乙;
2)乙使用同一种规则对文件进行解密;
在上述模式(也就是俗称的“对称加密”)中,人们不得不为秘钥的保存和传递进行担忧,因为在这个加密过程中,甲必须将加密的规则告诉乙,否则乙方无法完成解密;这个让加密专家头疼的问题一直持续到--Rivest、Shamir 和 Adleman 这三个人在1977年提出的“非对称加密”算法。这种算法就是我们一直在说的“RSA加密算法”;
这种算法非常可靠,因为它使用的秘钥越长,破解难度系数就会越高,这样文件的传输过程就会越安全。据记载,目前被破解的最长RSA秘钥是768个二进制位。也就是说,当前秘钥长度超过768位的秘钥,还无人能破解。所以我们基本上可以认为:1024位的RSA秘钥基本安全,2048位的秘钥及其安全。
◔ RSA算法的必备知识
要想知道RSA公钥和私钥的秘密,我们需要先回顾一些数学知识:素数、互质数、指数运算、模运算;下面举一个栗子:
主人公就是大家熟悉的:李雷和韩梅梅;
李雷要向韩梅梅传递消息,但是不想轻易的被别人破解,所以对这则消息进行了加密:
▶ 选择两个不相等的比较大的质数(X,Y),并且计算出X与Y的乘积Z;
李雷选择的这两个质数分别是 61和53(实际应用中,这两个质数越大,就破解的难度系数就越高),并计算出两个质数的乘积:Z = 61 * 53 = 3233;也就意味着当前秘钥的长度是3233 的二进制位,也就是110010100001,一共12位,所以当前李雷使用的秘钥就是12位;
▶ 使用叫 欧拉函数 的这个东西,计算出r = (X-1)(Y-1)
计算所得:3120;
▶ 随机选择一个整数e,确保1 < e < r,而且e和r互质;
李雷在1和3120之间随机选择了17,;
▶ 利用公式: e * d = 1(mod r)计算出一组整数解(a,b)=(2753,-15)
▶ 组装私钥和公钥
上述过程中,Z=3233,e=17,d=2753,所以李雷获取到的公钥就是(3233,17),私钥就是(3233,2753);
所以整个过程归为一张图就是:
借用一个例子给大家展示RSA算法的实例:
public class RSA {
/**
* 加密、解密算法
* @param key 公钥或密钥
* @param message 数据
* @return
*/
public static long rsa(int baseNum, int key, long message){
if(baseNum < 1 || key < 1){
return 0L;
}
//加密或者解密之后的数据
long rsaMessage = 0L;
//加密核心算法
rsaMessage = Math.round(Math.pow(message, key)) % baseNum;
return rsaMessage;
}
public static void main(String[] args){
//基数
int baseNum = 3 * 11;
//公钥
int keyE = 3;
//密钥
int keyD = 7;
//未加密的数据
long msg = 24L;
//加密后的数据
long encodeMsg = rsa(baseNum, keyE, msg);
//解密后的数据
long decodeMsg = rsa(baseNum, keyD, encodeMsg);
System.out.println("加密前:" + msg);
System.out.println("加密后:" + encodeMsg);
System.out.println("解密后:" + decodeMsg);
}
}
程序运行执行的结果为:
加密前:24
加密后:30
解密后:24
以上就是RSA算法加密解密的相关东西,关于支付的相关知识会在下篇中写到,谢谢大家关注!