RSA算法原理演示
计算公钥和密钥 假设p = 3、q = 11(p,q都是素数即可。),则N = pq = 33; r = (p-1)(q-1) = (3-1)(11-1)= 20; 根据模反元素的计算公式,我们可以得出,e·d ≡ 1 (mod 20),即e·d = 20n+1 (n为正整数);我们假设n=1,则e·d =21。e、d为正整数,并且e与r互质,则e = 3,d = 7。(两个数交换一下也可以。) 到这里,公钥和密钥已经确定。公钥为(N, e) = (33,3),密钥为(N, d) = (33, 7)。
对于要加密的数字m, m^e%N=c, c就是加密之后的密文。c^d%N=m, 就能解密得到m
public class SimpleRsaAlgorithm {
/**
* 加密、解密算法
*
* @param n 基数
* @param key 公钥或密钥
* @param input 数据
* @return
*/
public static long rsa(int n, int key, long input) {
if (n < 1 || key < 1) {
return 0L;
}
// 加密或者解密之后的数据
long rsaMessage = 0L;
// 加密核心算法
rsaMessage = Math.round(Math.pow(input, key)) % n;
return rsaMessage;
}
public static void main(String[] args) {
// 基数
int n = 3 * 11;
// 公钥
int keyE = 3;
// 密钥
int keyD = 7;
// 未加密的数据
long input = 24L;
// 加密后的数据
long encodeData = rsa(n, keyE, input);
// 解密后的数据
long decodeData = rsa(n, keyD, encodeData);
System.out.println("加密前:" + input);
System.out.println("加密后:" + encodeData);
System.out.println("解密后:" + decodeData);
}
public static void test2() {
System.out.println("输入所求数:");
// Scanner r = new Scanner(System.in);
// long n = r.nextLong();
long n = 999999;
int flag = 0;
for (long i = 2; i <= n; i++) {
if (n % i == 0) {
flag++;
if (flag == 1) {
System.out.print(n + "=" + i);
} else {
System.out.print("×" + i);
}
n = n / i;
i--;
}
}
if (flag == 0) {
System.out.println(n + "为质数");
} else {
System.out.println("共有" + flag + "个质因数");
}
}
}