2016-06-14 4 views
0

Я пишу программу для шифрования и расшифровки текста с помощью RSA. Значения P, Q и E предоставляются пользователем и проверяются, являются ли они первичными. Программа находит N и D. Сбой в работе шифрования и дешифрования. Я рассмотрел несколько вопросов здесь, и большинство из них используют библиотеки, которые для этого задания я не собираюсь использовать. Фрагмент кода шифрования:Расшифровка RSA в Java, библиотеки RSA не используются

JMenuItem mntmEncrypt = new JMenuItem("Encrypt"); 
mntmEncrypt.addActionListener(new ActionListener() { 
    @SuppressWarnings("null") 
    public void actionPerformed(ActionEvent ev) { 

     textArea_1.setText(""); 
     String blah = textArea.getText(); 
     int something; 

     for(int i=0; i<blah.length();i++){ 
      something =(int)(blah.charAt(i)); 

      enc = BigInteger.valueOf((long) (Math.pow(something, e)%n)); 

      textArea_1.append(blah.valueOf(enc) + " "); 
     } 

И неисправно дешифрования:

JMenuItem mntmDecrypt = new JMenuItem("Decrypt"); 
mntmDecrypt.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent em) { 
     textArea_1.setText(""); 
     String blah2 = textArea.getText(); 
     String[] somethingElse = blah2.split(" "); 
     char character; 
     for(int i=0;i<somethingElse.length;i++){ 
      int cipher = Integer.parseInt(somethingElse[i]);      

      dec = BigInteger.valueOf((long)Math.pow(cipher, d)%n); 

      System.out.println("Cipher: "+cipher); //print check 

      System.out.println("d: "+d); //print check 

      System.out.println("n: "+n); //print check 

      System.out.println("dec: "+dec); //print check 

      BigInteger x = BigInteger.valueOf(dec); 
      int x2 = x.intValue(); 
      char c = (char) x2; 

      System.out.println(cipher + " " + dec); 
      String textBack = new String(dec.toByteArray()); 

      textArea_1.append(String.valueOf(dec)); 
     } 
    } 
}); 

Я проверил значение дес с помощью this calculator и это совершенно неправильно, но я не могу понять, почему. Любая помощь будет оценена по достоинству. Я НЕ МОГУ сделать ничего BigInteger, кроме enc и dec.

ответ

1

Ответ прост: Вы используете Math.pow

Math.pow работает на double значениях - следовательно, он использует числа с плавающей точкой. Номера с плавающей запятой никогда не точны, поэтому ваш результат уже прикручен в этой точке.

Если вы действительно хотите вычислить RSA вручную, вы можете использовать BigInteger.modPow(..).

Однако ваш проект не является учебным проектом. Я настоятельно рекомендую использовать расширение криптографии Java. Поэтому используйте значения BigInteger и создайте RSAPrivateKeySpec/RSAPublicKeySpec и используйте их с классом Cipher.

Смотрите, например этот вопрос: Generating RSA keys for given modulus and exponent

+0

Ладно, но переключение на BigInteger.modPow() требует, чтобы его аргументы все BigIntegers для начала, не так ли? Не имея возможности бросить = они должны быть BigIntegers для начала. Это вызывает проблемы с большим количеством вещей, включая n = (p-1) (q-1). Вычитание одного из BigIntegers - это боль. Как мне это сделать? Я бы предпочел использовать расширение криптографии, но для этого нужно решить его вручную. – Goblinette

+1

Вы получили это, вы должны все с BigInteger - каждый расчет, если ваш номер не вписывается в 'long'. Вы можете легко вычесть: 'value = value.subtract (BigInteger.ONE)' – Robert

+0

Я пытаюсь заставить его работать, но поскольку я использую для циклов, чтобы проверить, являются ли номера у меня главными или нет, есть еще больше проблем для Решите сейчас = (BigInteger имеет метод probablePrime, но не метод CheckIfPrime. – Goblinette

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