|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Шифровка с заданием ключа от 1 до 9 символов (можно больше)
Доброго время суток!
Нужна помощь. Пишу программу, в которой необходима шифровка с заданием ключа. Перерыл несколько различных методов, но все они дают одну и ту же проблему - если он например видет на своём пути hag5mo (это только так к примеру, на деле он сталкивается с другими значениями, но понять причину ни как не могу), то шифрует до 5, а что дальше пропускает мимо глаз... У каждого метода свои "значения затупка". Короче мне нужен хороший метод шифровки, с заданием ключа от 1 до 9 цифр (можно и больше). |
#2
|
|||
|
|||
Я делаю так:
Код:
for key:=1 to length(s) do begin t:=ord(s[key]); t:=t+key; s[key]:= chr(t); end; принцип работы: Например есть слово "РЕКЛАМА". при key=1 слово станет СЕКЛАМА, при 2 СЗКЛАМА, при 3 СЗНЛАМА и т.д. Можно еще и так: Код:
key:=Random(round(9)); //функция round необходима для того, чтобы не было дробных значений!! for m:=1 to length(s) do begin t:=ord(s[m]); t:=t+key; s[m]:= chr(t); end; edit1.text:=s+key; Надеюсь тебе поможет!!!!; при дешифровании считывай последний символ в строке или слове(смотря куда будешь ключ писать) и пиши t:=t-key; И будет тебе счастье!!!!))))) ПЫ.СЫ. Писал прямо на форуме, поэтому могут быть ошибки!!! Последний раз редактировалось ~ SaM ~, 04.04.2007 в 18:16. |
#3
|
|||
|
|||
Гы.Забыл сказать....
Ключ должен быть только типа integer!!! |
#4
|
||||
|
||||
to ~ SaM ~
Random никогда не вернет дробного значения, если вызывается с параметром to TitiS Если никаких серьезных требований к шифрованию не предъявляется, то можно написать простые функции с применением xor и not. Вот пример Код:
// Кодирование строки function Decode(text, key: string): string; var code: Longint; i: integer; begin if Length(text) = 0 then Exit; if Length(key) = 0 then begin Result := text; Exit; end; code := 0; for i := 1 to Length(key) do Inc(code, Ord(key)); for i := 1 to Length(text) do Result := Result + Chr(not((Ord(text) + i) xor code)); end; // Декодирование строки function Encode(text, key: string): string; var code: Longint; i: integer; begin if Length(text) = 0 then Exit; if Length(key) = 0 then begin Result := text; Exit; end; code := 0; for i := 1 to Length(key) do Inc(code, Ord(key[i])); for i := 1 to Length(text) do Result := Result + Chr((not(Ord(text[i]) xor code)) - i); end; |
#5
|
|||
|
|||
Decoding, твой код не срабатывает - пишет не совпадение типов переменных... =(
~ Sam ~ пойду разбираться с твоим способом |
#6
|
||||
|
||||
to TitiS
странно, но похоже, что форум проглючило. Я вставил код прямо из Delphi методом Copy/Paste, но посмотрев его после твоего сообщения, увидел, что код не соответствует оригиналу… Выкладываю исходники… Decode.zip |
#7
|
|||
|
|||
Да, Decoding, у тебя хороший метод шифровки, но в моём случае он не подходит надо шифровать не одну строку, а бесконечное число строк (strings а если точнее, то items), есть ли что нибудь на этот счет? Заменив edit's - memo's - вроде как всё работает, но при разном ключе он поразному меняет 'свой предел строк' что мне не допустимо... Эх... программа то уже можно сказать написана, да вот только с этой шифровкой проблемы
|
#8
|
||||
|
||||
А если шифровать каждую строку отдельно, в цикле?
|
#9
|
|||
|
|||
to Decoding
Код:
to ~ SaM ~ Random никогда не вернет дробного значения, если вызывается с параметром не знал!Спасибо за подсказку! |
#10
|
|||
|
|||
Decoding, честно, пытаюсь это реализовать, но писал то прогу сначал с учтением, что будет использоваться именно Strings, а не String. Сейчас придётся изучать весь код (потому что уже не помню что не так - пытался добавить несколько циклов и изменил типы переменных, но какие то глюки, которые возможно из-за использованных компонентов) и подкорректировать. Буду пользоваться твоим методом, т.к. он мне очень понравился Так что благодарность тебе
Но если кто знает о хорошем методе, который отвечает требованиям в первом посту, то, пожалуйста, пишите. |
#11
|
|||
|
|||
Вот посмотри этот файл. Я давно делал уже точно не помню как там и что. Но есть мето шифрования/дешифрования с ключем "EnCryptSum" - Шифрует вроде суммированием кодов символов.
А есть без ключа по методу Виженера, там надо задать алфавит который используется. Если что не понятно, спрашивай, вместе разберемся) |
#12
|
|||
|
|||
Спасибо, гляну, как будет свободное время. Надеюсь твой метод будет оченб надёжным и Key Book Plus ( http://www.denasoft.net/keybook.htm )наконец выйдет из Alpha 0.5
|
#13
|
|||
|
|||
Метод должен быть надежным) пиши если что.
|
#14
|
|||
|
|||
Наконец дошли руки до твоего юнита Извени, что так долго - дел по горло было... Сейчас вроде освободился.
Парочка эксперементов с функциями Function EnCryptSum(Text,Password:string):string; Function DeCryptSum(Code,Password:string):string; дали очень даже хорошие результаты: использовал слизанный словарь паролей (около 200 штук) и метод Sum шифровал/дешифровал без единого "лишнего" или "нетого" символа. Это при том, что в качестве ключа использовались несколько длиной 9..18 символов... Сохранял результат в текстовой файл, после чего этот файл расшифровывал - всё впорядке, лишних символов переноса не обнаружено Таких результатов мне ещё не удалось увидеть (подчеркну - с выбором ключа шифровки) Есть правда вопрос: Чем Sum лучше Sub,CryptSymbolVij? В каких случаях лучше ту или иной тип шифровки использовать? P.S. Парень, что писал функции - молодец, если это ты, то вдвойне молодец Пойду дальше эксперементировать... Если найду что -то, сообщу Последний раз редактировалось TitiS, 29.06.2007 в 06:01. |
#15
|
|||
|
|||
Писал я) Спасибо.
Sum и Sub это в принципе одно и тоже, разница тока в том, что в первом случае коды складываются, а во втором вычитаются)) Знаю, может это и лишнее, но я собирался делать модуль с разными процедурами шифрования. En(De)CryptSymbolVij - ну это не главная функция, она вспомогательная(шифрует/расшифровывает один символ по таблице Виженера), используется в функции: function En(De)CryptVij(Text, Key, ABC:string):string; - Шифрует(Расшифровывает) уже строку целиком CryptSymbolVij - Это метод шифрования Виженера, он намного надежнее Sum, тем более если используется не стандартный алфавит (ABC), поэтому лучше использовать этот алгоритм, если данные ценные и хранятся длительное время в шифрованном виде. Тока в нем ограничение, в алфавите должны быть все символы которые есть в кодируемой строке, иначе не будет работать. А так, при кодировании нужно все запятые, пробелы и другие спец символы удалять, там вроде есть функция, которая это делает. Последний раз редактировалось Burka, 29.06.2007 в 13:50. |