Суббота, 21.12.2024, 19:19 Приветствую вас Гость | Группа "Гости" 
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: Волк-1024, Anton93, xXxSh@dowxXx  
Оцените стойкость шифрования
ixДата: Четверг, 23.01.2014, 16:50 | Сообщение # 1
Был не раз
Зарегистрирован: 21.01.2014
Группа: Пользователи
Сообщений: 7
Статус: Offline
В процессе работы моего трояна необходимо шифровать файл настроек, логи, а также сервер удаленного доступа, идущий с ним в комлекте. Написал вот такой алгоритм:
Код
procedure CryptFileRC6(fn: string);
var RC6: TDCP_RC6;
     SHA1: TDCP_SHA1;  
     _datetime: String;  
     cdatetime: array [0..18] of Byte;
     rsz: DWord;  
     fsz: DWord;
     MSRandom: TSimpleRandom;  
     musor: TBuf;  
     filename: String;
     Buffer: array of Byte;
     digest: array [0..19] of Byte;  
     digest2: array [0..19] of Byte;  
     key: array [0..31] of Byte;  
     lastbyte: Byte;
     F: File;  
     i,i2: Integer;
begin
if not FileExists(fn) then Exit;
_datetime := DateTimeToStr(Now);
filename := ExtractFileName(fn);

SHA1 := TDCP_SHA1.Create(nil);
SHA1.Init;
SHA1.UpdateStr(_datetime);      
SHA1.Final(digest);
SHA1.Burn;
FreeAndNil(SHA1);

SHA1 := TDCP_SHA1.Create(nil);
SHA1.Init;
SHA1.UpdateStr(filename);
SHA1.Final(digest2);
SHA1.Burn;
FreeAndNil(SHA1);

for i := 0 to 19 do
    key[i] := digest[i];

for i2 := 20 to 31 do
  key[i2] := digest2[i2-20] xor key[i2-20];

for i := 0 to 19 do
  if i mod 2=0 then
   key[i] := key[i] xor digest2[11+(i mod 2)];

AssignFile(F,fn);
Reset(f,1);
if FileSize(f)=0 then Exit;
SetLength(Buffer,FileSize(f));
BlockRead(F,buffer[0],FileSize(f));  
Seek(f,FileSize(f)-1);
BlockRead(F,lastbyte,1);  
RC6 := TDCP_RC6.Create(nil);
RC6.Init(key,SizeOf(key)*8,nil);
RC6.EncryptCFB(buffer[0],buffer[0],High(buffer));
RC6.Burn;
FreeAndNil(RC6);

fsz := FileSize(f);  

rsz := Random(fsz div 4)+(fsz div 10);  
fsz := fsz xor digest2[5];

  //Получаем мусор с помошью стандартного генератора случайных чисел от M$
MSRandom := TSimpleRandom.Create;
MSRandom.Open(PROV_RSA_FULL);
MSRandom.SRandom(rsz,musor);
MSRandom.Close;

for i := 0 to 18 do
  cdatetime[i] := Ord(_datetime[i+1]) xor (rsz xor digest2[6+(i mod 2)]);

rsz := rsz xor digest2[9];

Seek(f,0);
BlockWrite(f,buffer[0],High(Buffer));
BlockWrite(f,cdatetime,SizeOf(cdatetime));
BlockWrite(f,rsz,SizeOf(rsz));
BlockWrite(f,musor[0],rsz);
BlockWrite(f,fsz,SizeOf(fsz));
BlockWrite(f,lastbyte,1);
CloseFile(f);                      //çàïèñûâàåì âñ¸ â ôàéë

FillChar(buffer[0],High(buffer),$00);
FillChar(musor[0],High(musor),$00);
FillChar(key,SizeOf(Key),$00);
FillChar(digest,SizeOf(digest),$00);
FillChar(digest2,SizeOf(digest2),$00);
FillChar(cdatetime,SizeOf(cdatetime),$00);
fsz := 0;
rsz := 0;
lastbyte := 0;
i := 0;
i2 := 0;
_datetime := '';             
end;

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

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

И что можно сделать, чтобы улучшить алгоритм? (ключ должен быть динамическим, хранится в самом файле и не быть привязанным к железу)
 
xXxSh@dowxXxДата: Четверг, 23.01.2014, 18:09 | Сообщение # 2
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
Цитата ix ()
ключ должен быть динамическим, хранится в самом файле и не быть привязанным к железу


тем самым сразу же ты отвечаешь на часть своих вопросов выше, крякер немного поанализировав сможет вывести схему твоего алгоритма, тем самым у него появится возможность расшифровать текст.
 
ms301Дата: Пятница, 31.01.2014, 18:29 | Сообщение # 3
Постоянный
Зарегистрирован: 28.11.2012
Группа: Пользователи
Сообщений: 101
Статус: Offline
ну если для крякера будет недоступен инструмент шифрования - то очеееень маленькая вероятность что расшифруют твой файлик
 
Anton93Дата: Суббота, 01.02.2014, 21:43 | Сообщение # 4
Продвинутый
Зарегистрирован: 06.01.2010
Группа: Модераторы
Сообщений: 320
Статус: Offline
учитывайте, что если EXE разбирать будут, они далеко не такой понятный код будут видеть, а ассемблерный, от своих то прог ужасаюсь когда дизасемблирую, от количества инструкций, а тут еще в чужом коде

ICQ: 41896
 
xXxSh@dowxXxДата: Суббота, 01.02.2014, 22:51 | Сообщение # 5
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
Цитата ms301 ()
ну если для крякера будет недоступен инструмент шифрования

верно подмечено, если так то будет очень затруднительно расшифровывать.
 
  • Страница 1 из 1
  • 1
Поиск:

delphicode.ru © 2008 - 2024 Хостинг от uCoz