2016-12-16 2 views
-2

Я пытаюсь решить проблему с расшифровкой в ​​алгоритме RSA.Неверный результат с формулой дешифрования в алгоритме RSA с использованием Arraylist в java

ArrayList<Integer> m=convertTextToInt(str,e,n,listc); 

    for (int elem1 : m){ 
    System.out.print(elem1+ " "); 

} 

Здесь я передаю ул, которая является строкой из пользователя будет преобразована в целые числа в методе convertTextToInt, число е и п вычислить зашифрованный текст и массива список для сохранения значения после стоимости шифротекст с формулой

int c= (int)(Math.pow(Coded,e))%n; 
     listc.add(c); 

тогда я пишу это, в основном, проблема заключается в том, что всякий раз, когда я выполнил эту петлю, что дает тот же самый результат, который 144 !!:

System.out.print("plain text is: "); 
for (int element : m){ 
int plain = (int)(Math.pow(element,d))%n; 
listp.add(plain); 

System.out.print("listp:"+listp); 
    } 

Я попытался изменить тип данных для равнины, чтобы удвоить, и это дает мне другое число, но не правильное число.

мой вопрос: почему формула простого текста (описание) дает мне тот же и неправильный результат каждый раз, когда это 144! :(

+0

Алгоритм «обмана» является ошибочным, если он не может [* обмануть *] (http://www.dictionary.com/browse/deceive), а также ввести в заблуждение, обмануть, обмануть, обмануть, ... – Andreas

+0

Пожалуйста, уточните свой вопрос. Я голосую, чтобы закрыть – pedrofb

+0

Я имею в виду расшифровку ** извините! –

ответ

0

Near надуть Storing large numbers for RSA encryption in java

Вы не даете никакого понятия, какие номера вы используете, но RSA является безопасным только при использовании номеров, по меньшей мере, около 1000 бит (около 330 десятичных цифр), которые абсолютно необходимы . BigInteger в Java Даже это пограничное небезопасные;. ток безопасность стандартов как и те, для WWW от CA/браузер форума и для правительства США от NIST требуется 2048 бит

Даже для чисел «игрушечных» (часто используется в курсовая работа, где не требуется никакой реальной безопасности), которые соответствуют Java int (9 + десятичные цифры) или long (18 + цифр), условное «необработанное» вычисление дешифрования c d НЕ подходит. Math.pow - это плавающая точка, поэтому она сначала возвращает неточный результат (округленный), а усечение до int или long превращает это в совершенно неправильный и бесполезный результат. Вместо этого вы должны выполнять модульное возведение в степень по этапам с каждый этап modulo n, as explained in Wikipedia, связанный с article on RSA. Если вы используете BigInteger (как и для корпусов для не игрушек), его метод modPow уже делает это.

Также примечание «учебник» RSA - только возведение в степень по модулю большого полупервира - на практике практически не защищено. Это также кратко объясняется тем, что статья Википедии и https://crypto.stackexchange.com/ имеют десятки Q & Как и на опасности и ограничения учебника RSA и что делать вместо этого. Если вам действительно нужна безопасность на Java, по крайней мере, «настольная» или «телефонная» Java (например, Android, но не смарт-карты и встроенные устройства), Java Cryptography Extensions уже правильно реализует RSA, , включая, дополнительные вещи, которые вам нужны, такие как PKCS1 обивка.

+0

Большое вам спасибо, это очень полезно! Я использовал «BigInteger», и теперь он работает! Спасибо огромное! –