Где этот алгоритм шифрования / дешифрования идет не так? - PullRequest
0 голосов
/ 29 февраля 2012

Я работал над базовым алгоритмом шифрования / дешифрования строк в C ++ (источник здесь: http://pastebin.com/MLnn8D82)

Проблема в том, что она не расшифровывается должным образом. Уравнение шифрования:

strInput[nPos]=(((strInput[nPos])+(nPos+1))*2);

И уравнение расшифровки:

strPassword[nPos]=(((strPassword[nPos])-(nPos+1))/2);

Когда я пробую это только с помощью операторов сложения / вычитания, это работает отлично. Но когда я умножаюсь в шифровании и делю в дешифровании, я получаю, казалось бы, случайную строку.

Сначала я подумал, что это может быть из-за того, что пароль записывается и извлекается из файла перед расшифровкой, но я попытался вывести его напрямую из основной функции, и в результате я получил те же результаты.

Есть ли проблема с делением / умножением строк? Раньше он работал со строками в стиле C (массив символов), но я думаю, что это может быть иначе.

Любая помощь приветствуется!

Редактировать: Спасибо за ответы до сих пор. Я знаю, что это небезопасно, и что я не должен его использовать; Я делаю это только для практики.

Кроме того, это не проблема памяти. Я попытался разделить на этапе шифрования, а не умножения, но я все еще получаю случайную строку, а не исходную строку.

Ответы [ 3 ]

8 голосов
/ 29 февраля 2012

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

Кстати, почему вы сами пишете алгоритм шифрования?Если вы собираетесь использовать его для чего-то реального, а не просто для обучения, вам будет гораздо лучше использовать библиотеку, написанную экспертами по криптографии, которая, как известно, безопасна.Что-то вроде Keyczar было бы хорошей идеей, потому что оно разработано так, чтобы его было трудно ошибиться (что очень легко сделать очень тонкими способами, когда дело доходит до криптографии).

1 голос
/ 29 февраля 2012

Здесь есть два вопроса.

Кажется, что это происходит от использования строк и потоков ввода / вывода. Если вы установите точку останова и пройдете через нее, вы поймете, что в функции fRetrieve значения strPassword[nPos] могут быть отрицательными. По сути, вы читаете двоичные данные в строку и пытаетесь воздействовать на нее.

То, что вы должны делать, это обрабатывать ваши строки в двоичном буфере данных. Например, массив символов. Это исключительно хранит байты. Затем при расшифровке вы получите обратно двоичные данные и сможете преобразовать их в строку. Это обеспечит целостность ваших данных при записи / чтении из файла. Игра со строками и высокими значениями ASCII требует неверной интерпретации данных.

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

Например, предположим, что A (65) и nPos равны 0. Шифрование:

65 + (0+1) = 66 * 2 = 132

Затем обратный ход:

132 - (0+1) = 131 / 2 = 65.5

Это может быть округлено или усечено, так как это целочисленный тип данных. Правильный реверс -

(strPassword[nPos] / 2) - (nPos+1)
1 голос
/ 29 февраля 2012

В этом алгоритме есть несколько ошибок:

  1. Это просто базовое изменение стандарта Vigenère Cipher , который, как известно, очень ненадежен,Не используйте его для чего-то большего, чем для написания писем девушке, которые другие студенты не должны читатьДаже несколько приличный учитель математики сможет легко расшифровать его.

  2. Никогда не пытайтесь изобрести криптографический алгоритм, если у вас нет докторской степени в теории чисел или криптографии.Даже имея степень в одной из этих областей, написание криптографического алгоритма, который является довольно безопасным, является очень сложной задачей.И даже если вы найдете алгоритм, не пытайтесь реализовать его самостоятельно, а попробуйте найти реализацию, которая уже доступна.Существует много ошибок, которые вы можете ошибиться, о чем свидетельствуют различные недостатки безопасности, вызванные плохо реализованными криптографическими алгоритмами.

  3. У вас нет поддержки парольной фразы вваш алгоритм.Это означает, что любой, кто знает алгоритм, может легко расшифровать ваши зашифрованные данные.Обычно криптографический алгоритм принимает в качестве ввода фразу-пароль, которая затем используется для расшифровки данных.Таким образом, алгоритм может быть обнародован, и только секретная фраза должна храниться в секрете.Если алгоритм хранится в секрете, криптографическое сообщество считает это фатальной ошибкой.

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

  5. Порядок действий неправильный.На вашем этапе шифрования вы сначала добавляете, а затем умножаете.Посмотрите на уравнение результата.Решение этого уравнения для ввода означает, что вы также должны изменить порядок.В вашем случае это означает, что вы должны сначала разделить, а затем вычесть.Однако в своем коде вы сначала вычитаете, а затем делите.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...