Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Алгоритмы и примеры шифрования


Автор: Rome 4.11.2005, 13:15
Привет Всем!!! smile
Решил создать топик "Алгоритмы и примеры шифрования", думаю будет полезен Всем кто шифрует инфо.

Если Вы сделали свой алгоритм шифрования, и хотите поделиться с народом форума Vingrad то сделайте это прямо сейчас! smile

Не имеет значения, на каком языке программирования написан пример.

Внимание!!!
Запрещено обговаривать алгоритм.

Автор: Akina 4.11.2005, 13:40
Цитата(Rome @ 4.11.2005, 14:15)
Если Вы сделали свой алгоритм шифрования

то 99,(9)% за то, что он - дерьмовый. ну и смысл?
я понимаю модификация стандартных и ПОДМЕНА их в исходном коде... в этом есть какой-то практический смысл... а то что-то вроде "все украли еще до вас".

Или ты о чем-то ином?

Автор: Mayk 4.11.2005, 14:51
Цитата(Rome @ 4.11.2005, 17:15)
Запрещено обговаривать алгоритм.

А какой тогда смысл, если не обсуждать? Всё равно что кричать в пустоту.

Цитата(Akina @ 4.11.2005, 17:40)
я понимаю модификация стандартных и ПОДМЕНА их в исходном коде

Не дошло. Можешь пояснить смысл слова "подмена"? smile

Автор: DeadSoul 4.11.2005, 14:56
Цитата(Rome @ 4.11.2005, 13:15)
Запрещено обговаривать алгоритм.

А смысл тогда? СТАНДАРТНОЕ требование криптоанализа - алгоритм известен.

Автор: maxim1000 4.11.2005, 15:09
Цитата
СТАНДАРТНОЕ требование криптоанализа - алгоритм известен

интересно smile
насколько я знаю, стандартное требование криптоанализа - алгоритм известен

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

Автор: codelord 4.11.2005, 19:51
Темка конечно интересная.
Ладно вот простенкий алгоритм который я встроил в написанный мною блокнот, как он называется мне неизвестно (потому как сам выдумал smile ) на сколько он стоек тоже не знаю. на форме Три Edit и две кнопки (зашифровать и расшифровать)
в первом Edit ключ для зашифровки во втором путь к исходному файлу ну а в третьем готовый файл, писал в Cpp Builder.
зашифровать
Код

void __fastcall TEncrypt::Button1Click(TObject *Sender)
{
if(Edit1->Text=="") {Label2->Caption="Необходимо ввести ключ шифрования"; Abort(); }
if(Edit2->Text=="") {Label2->Caption="Необходимо выбрать файл для шифрования"; Abort();}
if(Edit3->Text=="") {Label2->Caption="Необходимо выбрать конечный файл для шифрования"; Abort();}
        else
        {
        int len=Edit1->Text.Length();    int m=1;
        int *key= new int[len];
        int i;
        AnsiString st=Edit1->Text;
         for(i=1;i<len;i++)
                {
                key[i]=st[i];
                }
       FILE *in, *out;
        in=fopen(Edit2->Text.c_str(),"rb");
        out=fopen(Edit3->Text.c_str(),"wb");
        int c;
        while((c=getc(in))!=EOF)
                {
                 c=c+key[m];
                 if(c>256)c=c-256;
                 m++;
                 if(m>=(len-1)) m=1;
                 
                 putc(c,out);
                }
        fclose(in);
        fclose(out);
        }
//Form1->SynEdit1->Lines->LoadFromFile("c:\\windows\\new2.txt");
Close();        
}

и расшифровать:

Код

void __fastcall TEncrypt::Button2Click(TObject *Sender)
{
if(Edit1->Text=="") {Label2->Caption="Необходимо ввести ключ шифрования"; Abort(); }
if(Edit2->Text=="") {Label2->Caption="Необходимо выбрать файл для шифрования"; Abort();}
if(Edit3->Text=="") {Label2->Caption="Необходимо выбрать конечный файл для шифрования"; Abort();}
        else
        {
        int len=Edit1->Text.Length();    int m=1;
        int *key= new int[len];
        int i;
        AnsiString st=Edit1->Text;
         for(i=1;i<len;i++)
                {
                key[i]=st[i];
                }
       FILE *in, *out;
        in=fopen(Edit2->Text.c_str(),"rb");

        out=fopen(Edit3->Text.c_str(),"wb");
        int c;
        while((c=getc(in))!=EOF)
                {
                 c=c-key[m];
                 if(c<=0)c=c+256;
                 m++;
                 if(m>=(len-1)) m=1;
                 
                 putc(c,out);
                }
        fclose(in);
        fclose(out);
        }
Close();        
}

только не надо меня ругать smile
вот попробуйте что-нибудь зашифровать а потом расшифровать незная ключа.. и алгоритма smile

Автор: Mayk 4.11.2005, 21:21
Писал на коленке можно сказать(примерно такое просто уже использовал). Вроде работает smile
Код

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>

void explode_key(const char* key, char* ekey)
{
    int idx=4;
    int key_gen[8] = {
        0x32749808,
        0x98789123,
        0xd39842df,
        0x3984911f,
        0xff3849d2,
        0xcdb23324,
        0xdd929323,
        0x54324424
    };

    memset(ekey,0,128);

    while(*key){
        for(int i = 0; i != 8; ++i){
            int j = key_gen[i];
            j ^= key[0] + ekey[1];
            j ^= ((ekey[0] ^ key[1]) << 8);
            key_gen[i] = j;

            uint8_t* a = (uint8_t*)&j;

            int m = (idx % 4) * 32;
            for(int k=0; k!=4;++k){
                ekey[m+i*4+k] ^= (a[k]-*key);
            }
        }
        ++key;
        ++idx;
    }
    
}


void crypt(const char* buffer, int buflen, char* buf2, const char* key)
{
    char explodedkey[128];
    explode_key(key, explodedkey);
    int i = 0;
    int l = strlen(key);
    int ki=0;
//    printf("%s\n",key);

    while(--buflen >=0){
        buf2[buflen]=buffer[buflen]^explodedkey[i];
        i+=l + explodedkey[(i+1)%128] -explodedkey[(i-1)%128]+key[ki++];
        i %= 128;
        ki %= l;
    }

}

int main()
{
    
    char key[] = "hello world";
    char buf[] = "000000000009389dfjakdljds;faklvcznm,vdsaf98u4qoidjfijdfkljadsoifu09ufdsa";
    char* buf2 = malloc(sizeof(buf));
    char* buf3 = malloc(sizeof(buf));
    crypt(buf,sizeof(buf), buf2, key);
    crypt(buf2,sizeof(buf), buf3, key);
//    fwrite(buf2, sizeof(buf), 1, stderr);
//    fwrite(buf3, sizeof(buf), 1, stderr);        
}

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

Кстати, а ты уверен что
if(c>256)c=c-256;
несет смысл? Всё равно в файл запишутся только младшие 8 бит (0-255), которые не будут изменены после вычитания.
(не проверял)

Автор: Akina 4.11.2005, 23:39
Цитата(Mayk @ 4.11.2005, 15:51)
Не дошло. Можешь пояснить смысл слова "подмена"?

Поясняю бредовым примером.

Скажем стоит сервер на Линухе. На нем Апача с разными наворотами. В т.ч. модуль ПХП.

Очередной какер в этой версии ПХП нашел дыру, которая при соответствующим образом составленной посылке при исполнении определенного скрипта позволит прогуляться до \etc\passwd и высосать его к себе. Сообщил, скотина, на весь мир. Через день появился патч, админ дыру прикрыл... но за это время какой-то гад успел получить этот файл. Запускает он на него брутфорс и протчая, пробуя и MD5, и SHA и, если повезет ему, получает пароль рута и тип шифрования... на самом деле неважно как и неважно к чему, важно что получен пароль, гад подключается телнетом и... не получается ничего. А потому что там вместо стандартного метода использован модифицированный. Причем модифицированный по такому алгоритму, что модификация может выполняться автоматически и быть столь же разнообразной, как, например, генератор SIDов...

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

А обсуждение очередного велосипеда с квадратными колесами - мне не кажется интересной. Тем более что уже есть схема, когда при квадратных колесах велосипед едет с вертикальным отклонением оси в пределах плюс-минус 3% диаметра колеса (пардон, диагонали квадрата).

Автор: podval 5.11.2005, 00:06

 ! 
 
Соблюдаем приличия и не оффтопим!

Автор: Alexanderus 21.11.2005, 12:39
а давайте напряжем извилины и подумаем как зашифровать и расшифровать на делфи
с двумя ключами на основе двойной транспозиции, у меня есть некоторые наработки, но
при использовании ентера более 100 раз (к примеру) частьб текста теряется, уже не знаю что делать, помогите!?! smile

Автор: podval 21.11.2005, 20:21
Цитата(Alexanderus @ 21.11.2005, 12:39)
при использовании ентера более 100 раз (к примеру) частьб текста теряется, уже не знаю что делать, помогите!?!


Это случайно не из оперы "написал прогу, а она не рабоатет"?


Автор: DeadSoul 21.11.2005, 23:50
Цитата(Akina @ 4.11.2005, 23:39)
Очередной какер в этой версии ПХП нашел дыру, которая при соответствующим образом составленной посылке при исполнении определенного скрипта позволит прогуляться до \etc\passwd и высосать его к себе

Тогда поздно пить боржоми, почки уже отвалились. Хотя, прописать список IP, с которых разрешено админить сервак....
Цитата(podval @ 5.11.2005, 00:06)
Соблюдаем приличия и не оффтопим!

Тут вся тема сплошной оффтоп

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