我必须按照程序的要求使用p = 78511和q = 5657,代码可以无错误地执行,但是由于dec_key的值太大,因此我不会显示解密的文本,而是继续运行。我该如何解决?有没有办法减小dec_key的大小,或者我做的解密方法都是错误的。在这里,我现在尝试通过加密方法传递字符“ H”。 附加代码。 请不要阻止我的问题。我是新来的,不确定如何提出问题,只需告诉我我错了。谢谢!
package crypto.assgn4;
import static crypto.assgn4.Problem2.phi;
import java.math.BigInteger;
class Test {
static char[] characters = {' ', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
static BigInteger p = BigInteger.valueOf(78511);
static BigInteger q = BigInteger.valueOf(5657);
static BigInteger N = p.multiply(q);
static BigInteger phi = (p.subtract(BigInteger.ONE)).multiply(q.subtract(BigInteger.ONE));
static BigInteger e = BigInteger.ZERO, d;
public static void main(String args[]) {
e = new BigInteger("4");
while ((gcd(phi, e).intValue()>1)) {
e = e.add(new BigInteger("1"));
}
d = BigInteger.valueOf(mul_inverse(e, phi));
if (d.equals(e)) {
d.add(phi);
}
System.out.println("Encryption Key : "+e);
System.out.println("Decryption Key : "+d);
String c = encrypt("H",e,N);
String p = decrypt(c,d,N);
System.out.println("Cipher : "+c);
System.out.println("Text : " +p);
}
public static BigInteger gcd(BigInteger a, BigInteger b) {
while (b != BigInteger.ZERO) {
BigInteger temp = b;
b = a.mod(b);
a = temp;
}
return a;
}
public static int mul_inverse(BigInteger number, BigInteger sizeOfAlphabet) {
int a = number.intValue() % sizeOfAlphabet.intValue();
for (int x = 1; x < sizeOfAlphabet.intValue(); x++) {
if ((a * x) % sizeOfAlphabet.intValue() == 1) {
return getMod(x, sizeOfAlphabet.intValue());
}
}
return -1;
}
public static int getMod(int x, int y) {
int result = x % y;
if (result < 0) {
result += y;
}
return result;
}
/**
* ********************************************************************************
*/
static String encrypt(String plainText, BigInteger e, BigInteger N) {
StringBuilder cipherText = new StringBuilder();
for (int i = 0; i < plainText.length(); i++) {
int index = plainText.charAt(i);
cipherText.append("").append((char) (new BigInteger(index + "").pow(e.intValue()).mod(N).intValue()));
char c1 = (char) (new BigInteger(index + "").intValue());
}
return cipherText.toString();
}
static String decrypt(String cipherText, BigInteger d, BigInteger N) {
String plainText = "";
for (int i = 0; i < cipherText.length(); i++) {
int index = cipherText.charAt(i);
plainText += "" + (char) (new BigInteger(index + "").pow(d.intValue()).mod(N).intValue());
}
return plainText;
}
}
答案 0 :(得分:0)
您似乎在对加密/解密进行了全部错误的操作。
RSA的重点是采用String编码的整个位模式,并将其视为本身就是BigNumber(例如BigInteger)。 (注意:如果BigNumber是>模,则必须将字符串分块以使BigNumber成为<模。)
您在逐个字符的基础上执行的操作是不必要的过度杀伤,也可能是明显的错误,并且显然是长时间运行的原因。 (对单字符字符串进行加密可能仍然很好,因为即使在逐个字符的基础上,您也只会执行一次加密。但是它将产生一个长度为x的字符串,然后解密将进行x个BigInteger计算,这将不可避免地需要更长的时间。)