使用Java实现RSA算法的程序
RSA算法的名字来源于其发明者,它用于以高安全性加密文本。RSA技术是最常用的文本加密技术之一,因为它是一种非对称加密算法。它利用素数的数学特性来加密文本。
在RSA算法中,发送方和接收方都有私钥。此外,还存在一个共同的公钥,发送方与接收方共享。发送方使用自己的公钥和私钥加密明文,接收方使用其私钥和共同的公钥解密消息。
问题陈述 - 我们需要使用RSA算法生成与给定明文相关的密文。
示例
输入
prime1 = 5, prime2 = 7, message = 32
输出
2.0
解释 - 我们使用RSA算法加密文本。
输入
prime1 = 11, prime2 = 23, message = 3434
输出
228.0
解释 - 我们根据RSA算法执行操作来解密它。
方法一
在这种方法中,我们将按照RSA算法编写Java代码。RSA技术包含三个部分。在第一部分中,我们需要找到私钥。在第二部分中,我们需要加密消息,在最后部分中,我们需要解密消息。
下面,我们提供了编写RSA算法的分步指南。
算法
步骤1 - 将变量'd'初始化为0(私钥),'e'用于存储指数。还要定义prime1和prime2变量并初始化它们。
步骤2 - 同样,将消息初始化为正整数。
步骤3 - 之后,将prime1和prime2相乘并将结果存储在primeMul变量中。
步骤4 - 接下来,将prime1 - 1和prime2 - 1相乘并将结果存储在primeMul1变量中。
步骤5 - 现在,我们需要找到'e'的值,以便'e'和primeMul1的最大公约数为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),因为我们找到了GCD。
空间复杂度 - O(1),因为我们使用了常量空间。
我们学习了如何实现RSA算法。它是加密重要消息的最佳技术之一。但是,对于大型消息和素数,它也很耗时,但是当我们使用大型素数时,它变得更加复杂,并且对于黑客来说很难破解消息。