2012-02-28 2 views
0

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

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

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

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

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

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

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

Есть ли проблема с разделительными/размножающимися строками? Ранее он работал с строками C-style (char array), но я предполагаю, что это может быть другим.

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

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

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

+1

Что произойдет, если этот результат вычисления приведет к значению, которое больше, чем может содержать символ? – Joe

+1

Вы уже ошиблись, создав свой собственный алгоритм вместо стандартного алгоритма. – CodesInChaos

ответ

8

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

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

+0

@DmitrySavy Потому что это вопрос на C++ .. – spencercw

+0

Извините, я только что заметил, что был на стороне C++ –

1

Есть несколько вещей неправильно с этим алгоритмом:

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

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

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

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

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

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

1

Здесь есть две проблемы.

Похоже, что это связано с использованием строк и потоков ввода/вывода. Если вы установите точку останова и пройдете через это, вы поймете, что в функции 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) 
Смежные вопросы