Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Pascal/Delphi] Функция шифрования/дешифрования, текста 
V
    Опции темы
Arhangel_76
Дата 20.9.2006, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 20.9.2006

Репутация: нет
Всего: нет



Люди, спасайте!!!! Горю!!!! Второй день пытаюсь зашифровать текс но ничего не выходит. Облазил все. И то что вы тут пишите тоже не помогает. 
Дело в том что есть на диске файл текстовый, и моя программа в него поле каждой сесссии ДОПИСЫВАЕТ текст. Шифрую непосредственно в проге, и дописываю уже шифрованный текст. Все бы хорошо, но когда пытаешься расшифровать, происходит что то странное. Либо только начальный кусок расшифровывается, а остальное - бяка кулибяка, либо при шифровании шифрует не всю строку, а тока чать. В общем ничего не могу сообразить, как надо. Сейчас вам код напишу как сохраняю в файл:

procedure SaveToLog (Str:String);
var
f:TextFile;
Filedir:String;
windir: array[0..255] of char;
begin
GetWindowsDirectory(windir,255);
Filedir:=windir+'\text.log';
assignFile(f, filedir);
 if not FileExists(Filedir) then
  begin
   Rewrite(f);
   CloseFile(f);
  end;
Append(f);
 Write(f, str);
//Writeln(f, str); //пробовал и так, результат тот же
Flush(f);
CloseFile(f);
end;

а вот и ваша функция, только она не расшифровывает потом все, а тока начало небольшое (может быть length() выдает неправильную длинну строки, а? )

function Crypt(CryptStr: string): string;
var
  e : string;
  i : Integer;
begin
  for i := 1 to length(CryptStr) do begin
    e[i] := chr(ord(CryptStr[i])+12); //тут можешь поставить любое число
  end;
  Result:=(e);
end;


НАПИШИТЕ НОРМАЛЬНЫЙ ПРИМЕР ПЛИЗЗ!!!!!!!!!!!!  smile 
PM MAIL   Вверх
Limpopo
Дата 20.9.2006, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 20.9.2006

Репутация: 0
Всего: 1



я бы помог если б смог 
PM MAIL   Вверх
vinter
Дата 20.9.2006, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 1
Всего: 56



Цитата

я бы помог если б смог 

 smile  smile 
я могу на с++ выложить пойдет??


--------------------
Мой блог
PM MAIL WWW   Вверх
Snowy
Дата 20.9.2006, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 4
Всего: 484



Юзай этот код: http://forum.vingrad.ru/index.php?showtopi...st&p=680266
Пропадут все проблемы.

ЗЫ. А почему тема в центре помощи, а не в дельфи?
PM MAIL   Вверх
Sartorius
Дата 20.9.2006, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



 Мдя... когда - то писал на паскале....помниться там в нулевом элементе строки - длина, а ты ее не выставляешь.
PM MAIL ICQ   Вверх
Snowy
Дата 20.9.2006, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 4
Всего: 484



В дельфи запрещено обращение к нулевому элементу.
Да и длина уже давно не там - в паскале длина строки укладывалась в 255 байт - один байт описывал длину.
В дельфи строки до 2-х гигов. Длину одним байтом уже не пропишешь.
Да и не так теперь всё просто - строки требуют динамическое выделение памяти.
Выделять действительно нужно - через SetLength.
Но шифрование сдвигом - не просто ненадёжное, но и чревато ошибками.
PM MAIL   Вверх
Sartorius
Дата 20.9.2006, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37




Цитата

В дельфи запрещено обращение к нулевому элементу.



 Да я думаю Arhangel_76  под TP 5.0 - 7.0  пишет. 

Цитата

Но шифрование сдвигом - не просто ненадёжное, но и чревато ошибками



Если ты имеешь ввиду переполнение - то ИМХО оно тут не помешает, при вычитании к исходному символу вернемся, или еще какие-нить подводные камни есть?
PM MAIL ICQ   Вверх
Snowy
Дата 20.9.2006, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 4
Всего: 484



Цитата(Sartorius @  20.9.2006,  23:03 Найти цитируемый пост)
 Да я думаю Arhangel_76  под TP 5.0 - 7.0  пишет. 
TP7 не может работать с WinAPI.

Цитата(Sartorius @  20.9.2006,  23:03 Найти цитируемый пост)
Если ты имеешь ввиду переполнение - то ИМХО оно тут не помешает, при вычитании к исходному символу вернемся, или еще какие-нить подводные камни есть?
Ну про ненадёжность такого "шифрования" я молчу - шифрованием это назвать просто нельзя.
А переполнение более, чем реально, т.к. русская таблица в вин кодировке как раз в конце живёт.
PM MAIL   Вверх
Arhangel_76
Дата 21.9.2006, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 20.9.2006

Репутация: нет
Всего: нет



Конечно смотрел!!!!!!!!! Я и пример взял оттуда. НЕПОЛУЧАЕТСЯ!!!! Если шифровать только 1 текстовый файл (строку) то все нормально. Но если каждый раз к шифрованной строке дописывать еще (тоже предварительно зашифровав) то уже не поддается расшифровке, тока 1 часть расшифровывается. Вообще все как то странно. Если надо могу исходники выложить, чтоб было понятней

Добавлено @ 12:03 
Кто нибудь нормально код написать может? пишу я на Delphi7. От шифрования единственное что я хочу, это то чтобы открыв блокнотом файл мой с текстом, прочесть нельзя было его. И было бы непонятно что это вообще такое за абра кодабра. Понятно что если возьмут расшифровывать расшифруют еще и не такое. 
Я тут подумал, ведь 
Writeln(f, str); дописывает символ окончания строки 
а когда расшифровываем то 
length() как отпределяет конец строки? может до этого символа? оттого и все траблы?

я вообще в инете нашел уже кода 3 или 4 шифрования. И все почемуто примерно одинаково ошибки дают в том как я их использую. При расшифровке. 
Может вообще нельзя к зашифрованному тексту дописывать, а??????
но я пробовал и по другому:
перед тем как дописать, извлекал зашифрованный приедыдущий текст, расшифровывал, к нему прибавлял новый, зашифровывал все, и сохранял. 
Но всеравно ничего не помогало

Скажите в чем дело??????????
PM MAIL   Вверх
Arhangel_76
Дата 21.9.2006, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 20.9.2006

Репутация: нет
Всего: нет



Цитата(vinter @ 20.9.2006,  22:25)
Цитата

я бы помог если б смог 

 smile  smile 
я могу на с++ выложить пойдет??

Выкладывай на С++ Я найду тех кто переведет на паскаль, есть знакомые у меня. Но хоть что то дайте!!!! Горю, весь проект встал
PM MAIL   Вверх
Snowy
Дата 21.9.2006, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 4
Всего: 484



Выкинь свою кривую функцию!
Она не работает!!!
Неужели так трудно вместо неё использовать то, что я дал?
PM MAIL   Вверх
vinter
Дата 21.9.2006, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 1
Всего: 56



Код

#include<iostream>
#include<fstream>
#include<conio.h>
using namespace std;

char* crypt(char* source);
char* decrypt(char* source);

void main()
{
    char *source;
    char strInFileName[20];
    char strOutFileName[20];
    int x;
    ifstream inFile;
    ofstream outFile;
    cout << "Type full name of the file that you want to crypt/decrypt:\n->" ;
    cin >> strInFileName;
    cout << "Type full name of the file that you want to write results:\n->" ;
    cin >> strOutFileName;
    inFile.open(strInFileName);
    outFile.open(strOutFileName);
    if(!inFile.is_open())
    {
        cout << "\n+-----------+\n|   ERROR   |\n+-----------+\n ";
        system("pause");
        exit(0);
    }       
    inFile.seekg(0, ios::end);
    long size_file = inFile.tellg();
    source = new char[size_file];               // Y3HAEM PA3MEP FILE     //
    inFile.seekg(0, ios::beg);
    char* buf = new char[size_file];

    cout << "1-crypt, 2-decrypt" << endl;
    cout <<  "\n->";
    cin    >> x;
    switch (x)
    {
    case 1:    
        while(!inFile.eof())
        {
            inFile >> source; 
            strcpy(buf,crypt( source));
            outFile    << buf << endl;
        };                
        break;
    case 2:    
        while(!inFile.eof())
        {
            inFile >> source; 
            strcpy(buf,decrypt( source));
            outFile    << buf << "\n";
        };        
        break;
    default: cout << "Error\n";
    }
    outFile.close();
    delete []source;
    delete []buf;
    system("pause");
}
char* crypt(char* source)
{
    if(!strcmp(source,""))
        return "";
    char* result=new char[strlen(source)+1];
    char pass[]="abcd";
    int pl=strlen(pass);
    for(unsigned int ii=0;ii<strlen(source);ii++)
        result[ii]=char(source[ii]+pass[ii%pl+1]);
    result[strlen(source)]='\0';
    return result;
}
char* decrypt(char* source)
{
    if(!strcmp(source,""))
        return "";
    char* result=new char[strlen(source)+1];
    char pass[]="abcd";
    int pl=strlen(pass);
    for(unsigned int ii=0;ii<strlen(source);ii++)
        result[ii] = char(source[ii]-pass[ii%pl+1]);
    result[strlen(source)]='\0';
    return result;
}



--------------------
Мой блог
PM MAIL WWW   Вверх
Arhangel_76
Дата 21.9.2006, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 20.9.2006

Репутация: нет
Всего: нет



Snowy, 

то что ты дал, помоему вообще некомпилируемо на дельфи. Покрайне мере не для моего ума. Я все скопировал, функции их обявления. Там вообще Дельфи орет что все не так. Какието ошибки вылетают что "ожидалось an indetifer а найдено =" и ожидалось : а найдено = 

Конечно я сомневаюсь что кто то из модераторов может так коряво писать, но темнееменее я перенести это к себе в прогу немогу smile 
В отличии от "кривой" функции, которая хоть как то работает 

P.S. что же будет тогда дальше? когда мне понадобится зашифрованный файл упаковать еще и в Zip  smile  Мне уже страшно

PM MAIL   Вверх
Snowy
Дата 21.9.2006, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 4
Всего: 484



Arhangel_76, ты вынуждаешь меня делать за себя свою работу smile
Уже ведь всё разжевал и в рот положил.
Это элементарно, Ватсон!
Держи.

Присоединённый файл ( Кол-во скачиваний: 27 )
Присоединённый файл  CryptTest.zip 10,79 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0577 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.