2016-07-22 2 views
0

Прежде чем опубликовать свой код, я считаю, что лучше всего сначала создать пару вещей.Хранение больших чисел для шифрования RSA в java

Цель:

Выполните очень простой шифрования RSA на пару небольших количествах. Для тех из вас, кто знаком с RSA-шифрованием, я разместил значения, используемые для приведенного ниже алгоритма.

Текущий RSA номера/значения:

Р = 29

Q = 31

N = P * Q

Фи = ((P-1) * (Q -1))

Е = 11

Моя проблема:

Проблема возникает, когда я пытаюсь расшифровать свой код. Шифрование работает так, как было разработано.

Код:

long[] mesg = new long[]{8, 7, 26, 28}; 
long[] encrypted_mesg = new long[mesg.length]; 

for(int i=0; i<mesg.length; i++){ 
    encrypted_mesg[i]=(long)((Math.pow(mesg[i],E))%N); 
    System.out.print(encrypted_mesg[i] + " "); 
} 
System.out.println(); 

//Decrpyt (not functioning-long to small, Big Integer not working) 
for(int j=0; j<encryp_mesg.length; j++){ 
    BigInteger decrypt = new BigInteger(Math.pow(encryp_mesg[j],D) + ""); 
    System.out.print(decrypt.toString() + " "); 
} 

Первоначальная проблема заключалась в том, что D (частный показатель), когда применяется в качестве показателя, был путь к большим долго. Я сделал быстрый поиск Google и решил попробовать BigInteger. Когда я запускаю программу, он выдает эту ошибку:

Exception in thread "main" java.lang.NumberFormatException: For input string: "Infinity" 

at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
at java.lang.Integer.parseInt(Integer.java:580) 

at java.math.BigInteger.<init>(BigInteger.java:461) 
at java.math.BigInteger.<init>(BigInteger.java:597) 
at RSA_Riddles.main(RSA_Riddles.java:23)** 

То, что я пытался решить эту проблему:

Чтобы быть честным, я не пробовал на самом деле ничего, потому что я знаю, что ответ не вычислить до бесконечности, но BigInteger думает, что это так. Есть ли в любом случае, что я могу хранить число, такое как 130^611? Если да, то как?

Большой вопрос:

Как я могу хранить значения, необходимые для выполнения дешифрования?

Благодарим вас за любого, кто попытается мне помочь!

+0

Я не знаю, если это дизайн или удача, вы проверяете только значения до 28, когда ваш расчет шифрования приводит к неправильному результату для большинства значений от 29 до. Также расшифровка sigould аналогично будет mod n: m = c^d mod n , Кроме того, делать exponentiate и modulo по отдельности едва ли практично для вашего размера игрушки, но делать это для безопасных размеров займет гораздо больше времени, чем ваша жизнь (или ваш компьютер), поэтому фактические реализации чередуют их, как объяснено в Википедии, среди других, а затем для игрушек размер вам вообще не нужен. –

ответ

2

Ваша проблема возникает из-за того, что вы выполняете вычисления с примитивными типами данных, а затем сохраняете эти примитивы в BigInteger. Это побеждает цель использования BigInteger. Давайте посмотрим на ошибочную строку:

BigInteger decrypt = new BigInteger(Math.pow(encryp_mesg[j],D) + ""); 

Когда Java оценивает эту строку, он будет первым принять это выражение

Math.pow(encryp_mesg[j],D) + "" 

и оценить его. Затем он передаст результат этой оценки конструктору BigInteger. Однако на данный момент вы уже превысили границы типов данных, с которыми работаете.Вместо этого, вы должны делать математику с BigIntegers, как это:

BigInteger e = new BigInteger(Integer.toString(encryp_mesg[j])); 
BigInteger decrypt = e.pow(D); 

Теперь вы только делаете расчеты с использованием BigInteger, и только хранить в примитивных типов данных значений, которые уже были хранящимися в примитивных типов данных.

+0

Благодарим вас, я внесу немедленную замену. Кроме того, есть ли у BigInteger какие-либо ограничения? Если так, то кто они? – jpgamer31

+0

Рад, что я мог помочь! Если это сработает для вас, было бы здорово, если бы вы могли следовать инструкциям SO и принять ответ BigIntegers - это «произвольная точность», что означает, что они поддерживают столько же, сколько у вашего компьютера есть ресурсы (вы вряд ли побегите против этого предела) – James

+0

Я немного нуб для SO. Это был мой первый вопрос. Как принять ответ? – jpgamer31

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