Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Pascal/Delphi] Функция шифрования/дешифрования


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

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 

Автор: Limpopo 20.9.2006, 22:22
я бы помог если б смог 

Автор: vinter 20.9.2006, 22:25
Цитата

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

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

Автор: Snowy 20.9.2006, 22:31
Юзай этот код: http://forum.vingrad.ru/index.php?showtopic=14606&view=findpost&p=680266
Пропадут все проблемы.

ЗЫ. А почему тема в центре помощи, а не в дельфи?

Автор: Sartorius 20.9.2006, 22:47
 Мдя... когда - то писал на паскале....помниться там в нулевом элементе строки - длина, а ты ее не выставляешь.

Автор: Snowy 20.9.2006, 22:56
В дельфи запрещено обращение к нулевому элементу.
Да и длина уже давно не там - в паскале длина строки укладывалась в 255 байт - один байт описывал длину.
В дельфи строки до 2-х гигов. Длину одним байтом уже не пропишешь.
Да и не так теперь всё просто - строки требуют динамическое выделение памяти.
Выделять действительно нужно - через SetLength.
Но шифрование сдвигом - не просто ненадёжное, но и чревато ошибками.

Автор: Sartorius 20.9.2006, 23:03

Цитата

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



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

Цитата

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



Если ты имеешь ввиду переполнение - то ИМХО оно тут не помешает, при вычитании к исходному символу вернемся, или еще какие-нить подводные камни есть?

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

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

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

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

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

Скажите в чем дело??????????

Автор: Arhangel_76 21.9.2006, 12:12
Цитата(vinter @ 20.9.2006,  22:25)
Цитата

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

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

Выкладывай на С++ Я найду тех кто переведет на паскаль, есть знакомые у меня. Но хоть что то дайте!!!! Горю, весь проект встал

Автор: Snowy 21.9.2006, 12:42
Выкинь свою кривую функцию!
Она не работает!!!
Неужели так трудно вместо неё использовать то, что я дал?

Автор: vinter 21.9.2006, 13:58
Код

#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;
}

Автор: Arhangel_76 21.9.2006, 14:04
Snowy, 

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

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)