Java 实现RSA算法
RSA名称是由其发明者给出的,用于高安全性地加密文本。 RSA技术是最常用的文本加密技术之一,因为它是非对称加密算法。 它利用质数的数学特性来加密文本。
在RSA算法中,发送者和接收者拥有私钥。此外,存在一个公共密钥,发送者与接收者共享。发送者使用自己的公钥和私钥加密明文,接收者使用私钥和公共密钥解密消息。
问题陈述 - 我们需要使用RSA算法生成与给定明文相关的密文。
示例
输入
prime1 = 5, prime2 = 7, message = 32
输出
2.0
解释 - 我们使用RSA算法来加密文本。
输入
prime1 = 11, prime2 = 23, message = 3434
输出结果
228.0
解释 - 我们按照RSA算法执行操作以解密它。
方法1
在此方法中,我们将按照RSA算法编写Java代码。 RSA技术包含三个部分。 在第一部分中,我们需要找到私钥。 在第二部分中,我们需要加密消息,在最后一部分中,我们需要解密消息。
以下是编写RSA算法的逐步指南。
算法
步骤1 - 使用0,一个私钥来初始化’d’变量,并使用’e’来存储指数。 还要定义prime1和prime2变量并将其初始化。
步骤2 - 同样,使用正整数值初始化消息。
步骤3 - 然后,将prime1和prime2相乘,并将它们存储在primeMul变量中。
步骤4 - 接下来,将prime1-1和prime2-1相乘,并将它们存储在primeMul1变量中。
步骤5 - 现在,我们需要找到’e’的值,使得’e’和primeMul1的GCD为1。 e的值可以在2和primeMul1之间。
步骤5.1 - 在getGCD()函数中,如果模为零,则返回num的值。 否则,递归调用getGCD()函数。
步骤6 - 我们的公钥是{e,n}。
步骤7 - 现在,找到私钥。
步骤7.1 - 遍历1到9位数。 在循环中,如果1 +(m * primeMul1)可被’e’整除,则将(1 + (m * primeMul1))/e存储到’d’中,这将用于创建私钥。
步骤8 - 我们的私钥是{d,n}。
步骤9 - 要获取密码文本,使用Math.pow()方法找到消息,并将其与primeMul变量的值取模。
步骤10 - 我们成功获得了密码文本。我们需要解密密文以将其转换为明文。
步骤11 - 要再次获取明文,我们需要取(cipherd% primeMul)。
代码
import java.math.*;
import java.util.*;
public class Main {
public static int getGCD(int mod, int num) {
// If the mod is zero, return the num
if (mod == 0)
return num;
else
// recursive function call
return getGCD(num % mod, mod);
}
public static void main(String args[]) {
int d = 0, e; // Intialization
int message = 32; // number message
int prime1 = 5; // 1st prime number p
int prime2 = 7; // 2nd prime number q
int primeMul = prime1 * prime2; // performing operations
int primeMul1 = (prime1 - 1) * (prime2 - 1);
System.out.println("primeMul1 is equal to : " + primeMul1 + "\n");
// Finding the valid public key
for (e = 2; e < primeMul1; e++) {
// Here e is a public key
if (getGCD(e, primeMul1) == 1) {
break;
}
}
// Printing the public key
System.out.println("Public key e is = " + e);
// Calculating the private key
for (int m = 0; m <= 9; m++) {
// get the value of temp
int temp = 1 + (m * primeMul1);
// private key
if (temp % e == 0) {
d = temp / e;
break;
}
}
System.out.println("d is : " + d);
double cipher;
BigInteger d_message;
// getting the cipher text
cipher = (Math.pow(message, e)) % primeMul;
System.out.println("Cipher text is : " + cipher);
// Int to BigInteger
BigInteger bigN = BigInteger.valueOf(primeMul);
// Float to bigINt
BigInteger bigC = BigDecimal.valueOf(cipher).toBigInteger();
// decrypting the message
d_message = (bigC.pow(d)).mod(bigN);
// print decrypted message
System.out.println("Decrypted text is : " + d_message);
}
}
输出
primeMul1 is equal to : 24
Public key e is = 5
d is : 5
Cipher text is : 2.0
Decrypted text is : 32
时间复杂度 - O(logn)因为我们要找到最大公约数。
空间复杂度 - O(1)因为我们使用常量空间。
我们学会了实现RSA算法。它是加密重要信息的最佳技术之一。然而,对于大型消息和质数,它也是时间昂贵的,但由于我们使用大的质数,这使得对于黑客来说更加复杂和难以破解消息。