Я написал Java-код для шифрования и дешифрования RSA, где ключ дешифрования слишком велик, поэтому процесс дешифрования выполняется вечно - PullRequest
2 голосов
/ 26 марта 2019

Я должен использовать 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;
}

}

1 Ответ

0 голосов
/ 26 марта 2019

Похоже, что вы все неправильно выполняете шифрование / дешифрование.

Смысл RSA состоит в том, чтобы взять весь битовый шаблон кодирования строки и обработать его, как если бы это был BigNumber (например, BigInteger) сам по себе.(Примечание: если это BigNumber> по модулю, то строка должна быть разбита на порции таким образом, чтобы BigNumber становился <по модулю.) </p>

То, что вы делаете на посимвольной основе, является излишним излишним, вероятнопросто неправильно и очевидно источник длительного времени работы.(Шифрование вашей односимвольной строки может по-прежнему идти хорошо, потому что даже для посимвольного шифрования вы будете выполнять только одно шифрование. Но оно даст строку длины x, а затем при дешифровании будет выполнено x вычислений BigInteger, и это будетнеизбежно займет больше времени.)

...