2015-03-05 2 views
0

Я пытаюсь расшифровать зашифрованное сообщение некоторое время, но он не работает так, как мне бы хотелось. У меня есть результаты для шифрования, но я не могу расшифровать зашифрованное сообщение!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); 
} 
} 
+0

Не удаляйте свой вопрос, когда получите полезный ответ. Stack Overflow - это сайт, на котором другие могут найти существующие ответы на похожие вопросы. Вместо этого нажмите зеленую галочку рядом с наиболее полезным ответом, чтобы принять ее. – chrylis

+0

Этот вопрос использует китайскую теорему останова для вычисления части частного ключа. Это также означает, что avh неверно, вам не нужен частный показатель d. Вы можете решить эту проблему с помощью показателя d, но это, вероятно, не путь. –

+0

Получаете ли вы какие-либо отрицательные значения в любом месте во время шифрования/дешифрования? Обычно эти вычисления выполняются либо с помощью модульного возведения в степень, либо из «BigInteger». 'int' в Java - это 32-разрядное число,' (x * y)% n' может быть не идентичным тому, что вы ожидаете, если просто посмотрите на математику. –

ответ

1

Ваш код для шифрования и дешифрования посмотрите, хорошо, симметричный. Это не трюк с RSA. В RSA у вас есть открытый ключ e для шифрования и закрытый ключ d для дешифрования. Я даже не вижу d в вашем коде дешифрования ?!

+0

О, вот в чем проблема! Однако, где я должен поместить формулу ** (C^D)% PQ **? – Dongbae

+0

@ Dongbae Нет, это не проблема. RSA одинаково в обоих направлениях, просто с другим ключом. – EJP

+0

@EJP, Не могли бы вы привести мне пример? Я очень расстроен этим. – Dongbae

0

@ EJP был прав.

Я положил ключ дешифрования, и он работал отлично! Итак, вместо моего ключа шифрования newE, я переключил его с newD, и он, наконец, работает сейчас. Это была глупая, небольшая ошибка с моей стороны. Спасибо за подсказки!

+0

Если avh решила вашу проблему, тогда вы должны дать ему кредиты и принять, а не публиковать свой ответ. Я не понимаю, что этот ответ приносит в дополнение к ответу avh. –

+0

@avh был неправ: я был прав. Я не понимаю, как вы можете описать это как решение своей проблемы. – EJP

Смежные вопросы