Я пытаюсь расшифровать зашифрованное сообщение некоторое время, но он не работает так, как мне бы хотелось. У меня есть результаты для шифрования, но я не могу расшифровать зашифрованное сообщение!RSA Шифрование и расшифровка JAVA
Вот мои значения: P: 67 Q: 71 PQ: 4757 PhiPQ: 4620 Е: 13 D: 1777
Здесь это мой вывод для зашифрованного сообщения (когда вводится «привет»): ????
(Который работает отлично)
Вот мой выход для расшифрованного сообщения (когда «привет» вводится): 1109 314 2309 2309 4015
(который работает, но не дает мне обратно символы «привет»)
Мы должны реализовать эту формулу в коде (C^D)% PQ, но я не совсем уверен, как его реализовать при расшифровке зашифрованного сообщения.
Я не уверен, что проблема есть, вот мой код ниже:
ENCRYPTION
String encryptedMessage = "";
String message = JOptionPane.showInputDialog(null, "Enter a message: ");
int c = 0;
for (int i = 0; message.length() > i; i++) {
char l = message.charAt(i);
int m = l;
c = 1;
int newE = e;
while (newE > 0) {
if (newE % 2 != 0) {
c = ((c * m) % (pq));
}
newE = newE/2;
m = (((m * m)) % (pq));
}
encryptedMessage = encryptedMessage + (char) c;
}
System.out.println("Encrypted Message is: " + encryptedMessage);
РАСШИФРОВЫВАНИЕ
String decryptedMessage = "";
c = 0;
for (int i = 0; encryptedMessage.length() > i; i++) {
char l = encryptedMessage.charAt(i);
int m = l;
c = 1;
int newE = e;
while (newE > 0) {
if (newE % 2 != 0) {
c = ((c * m) % (pq));
}
newE = newE/2;
m = (((m * m)) % (pq));
}
decryptedMessage = decryptedMessage + " " + (c);
}
// prints out 'decryptedMessage' value
System.out.println("Decrypted Message is: " + decryptedMessage);
}
}
Не удаляйте свой вопрос, когда получите полезный ответ. Stack Overflow - это сайт, на котором другие могут найти существующие ответы на похожие вопросы. Вместо этого нажмите зеленую галочку рядом с наиболее полезным ответом, чтобы принять ее. – chrylis
Этот вопрос использует китайскую теорему останова для вычисления части частного ключа. Это также означает, что avh неверно, вам не нужен частный показатель d. Вы можете решить эту проблему с помощью показателя d, но это, вероятно, не путь. –
Получаете ли вы какие-либо отрицательные значения в любом месте во время шифрования/дешифрования? Обычно эти вычисления выполняются либо с помощью модульного возведения в степень, либо из «BigInteger». 'int' в Java - это 32-разрядное число,' (x * y)% n' может быть не идентичным тому, что вы ожидаете, если просто посмотрите на математику. –