![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Гость_himn |
|
|||
|
Unregistered |
Никак не могу сделать поточное шифрование файла,проблема в том. что все исходники основаны на построчном кодировании файлов, а мне надо запихать файл в поток, затем создать другой поток записать в него зашифрованый текст и вывести в другой файл, как сделать это?
|
|||
|
||||
| Cheba |
|
|||
![]() pointless one ![]() ![]() ![]() Профиль Группа: Vingrad developer Сообщений: 1777 Регистрация: 27.11.2003 Где: /dev/null Репутация: 1 Всего: 62 |
Каким алгоритмом шифруешь?
|
|||
|
||||
| Гость_himn |
|
|||
|
Unregistered |
unit EncodStr;
interface uses Classes; type TEncodedStream = class (TFileStream) private FKey: Char; public constructor Create(const FileName: string; Mode: Word); function Read(var Buffer; Count: Longint): Longint; override; function Write(const Buffer; Count: Longint): Longint; override; property Key: Char read FKey write FKey default 'A'; end; implementation constructor TEncodedStream.Create( const FileName: string; Mode: Word); begin inherited Create (FileName, Mode); FKey := 'A'; end; function TEncodedStream.Write(const Buffer; Count: Longint): Longint; var pBuf, pEnc: PChar; I, EncVal: Integer; begin // allocate memory for the encoded buffer GetMem (pEnc, Count); try // use the buffer as an array of characters pBuf := PChar (@Buffer); // for every character of the buffer for I := 0 to Count - 1 do begin // encode the value and store it EncVal := ( Ord (pBuf[I]) + Ord(Key) ) mod 256; pEnc [I] := Chr (EncVal); end; // write the encoded buffer to the file Result := inherited Write (pEnc^, Count); finally FreeMem (pEnc, Count); end; end; function TEncodedStream.Read(var Buffer; Count: Longint): Longint; var pBuf, pEnc: PChar; I, CountRead, EncVal: Integer; begin // allocate memory for the encoded buffer GetMem (pEnc, Count); try // read the encoded buffer from the file CountRead := inherited Read (pEnc^, Count); // use the output buffer as a string pBuf := PChar (@Buffer); // for every character actually read for I := 0 to CountRead - 1 do begin // decode the value and store it EncVal := ( Ord (pEnc[I]) - Ord(Key) ) mod 256; pBuf [I] := Chr (EncVal); end; finally FreeMem (pEnc, Count); end; // return the number of characters read Result := CountRead; end; end. |
|||
|
||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
Чего то мне это напоминает пример из Марко Кенту
П.С. Сори за оффтоп -------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| Гость_himn |
|
|||
|
Unregistered |
каким ещё алгоритмом воспользоваться можно, т.е. какой самый простой в шифровании файлов
|
|||
|
||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
Посмотри компоненты шифрования\дешифрования на Indy Misc панеле
-------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| Гость_himn |
|
|||
|
Unregistered |
А как в потоке реализовать кодирование ?
|
|||
|
||||
| Гость_himn |
|
|||
|
Unregistered |
что лучше FileStream или MemoryStream, а может можно как нибудь запихать в память весь файл(поток) и работать с ним при помощи StringStream
|
|||
|
||||
| Guest |
|
|||
|
Unregistered |
подскажите чего нужно добавить чтобы заработало
program winapi; uses Windows, messages,classes,sysutils, shellapi,encodstr,commdlg, StdCtrls; {$R *.res} var hwnd_,hwnd9_, hwnd2_, hwnd3_, hwnd4_, hwnd5_, hwnd6_, hwnd7_, hwnd8_: THandle; gg : WNDCLASSEX; Msg : tagMSG; fi: _OFSTRUCT; lof,save: OPENFILENAME; fh1,fh2:tfilestream; percent,done,todo, dod,did,cnt2,max:integer;start:tdatetime; encstr:tencodedstream; f,f1:text; s,s1,s3:string; rrr, fh, cnt, rr : DWORD; file1,file2, file3,tt, buf : array[0..255] of Char; str_ : string; buf__ : array[0..4200] of Char; const mes_fail : array[0..255] of Char = 'enter valid filename' +#13+#10; procedure EnCipher(var Source: AnsiString); asm Push ESI //Save the good stuff Push EDI Or EAX,EAX Jz @Done Push EAX Call UniqueString Pop EAX Mov ESI,[EAX] //String address into ESI Or ESI,ESI Jz @Done Mov ECX,[ESI-4] //String Length into ECX Jecxz @Done //Abort on null string Mov EDX,ECX //initialize EDX with length Lea EDI,@ECTbl //Table address into EDI Cld //make sure we go forward @L1: Xor EAX,EAX Lodsb //Load a byte from string Sub AX,32 //Adjust to zero base Js @Next //Ignore if control char. Cmp AX,95 Jg @Next //Ignore if high order char. Mov AL,[EDI+EAX] //get the table value Test CX,3 //screw it up some Jz @L2 Rol EDX,3 @L2: And DL,31 Xor AL,DL Add EDX,ECX Add EDX,EAX Add AL,32 //adjust to output range Mov [ESI-1],AL //write it back into string @Next: Dec ECX Jnz @L1 // Loop @L1 //do it again if necessary @Done: Pop EDI Pop ESI Jmp @Exit // Ret //this does not work with Delphi 3 - EFD 971022 @ECTbl: //The encipher table DB 75,85,86,92,93,95,74,76,84,87,91,94 DB 63,73,77,83,88,90,62,64,72,78,82,89 DB 51,61,65,71,79,81,50,52,60,66,70,80 DB 39,49,53,59,67,69,38,40,48,54,58,68 DB 27,37,41,47,55,57,26,28,36,42,46,56 DB 15,25,29,35,43,45,14,16,24,30,34,44 DB 06,13,17,23,31,33,05,07,12,18,22,32 DB 01,04,08,11,19,21,00,02,03,09,10,20 @Exit: end; procedure DeCipher(var Source: AnsiString); {Decrypts a string previously encrypted with EnCipher.} asm Push ESI //Save the good stuff Push EDI Push EBX Or EAX,EAX Jz @Done Push EAX Call UniqueString Pop EAX Mov ESI,[EAX] //String address into ESI Or ESI,ESI Jz @Done Mov ECX,[ESI-4] //String Length into ECX Jecxz @Done //Abort on null string Mov EDX,ECX //Initialize EDX with length Lea EDI,@DCTbl //Table address into EDI Cld //make sure we go forward @L1: Xor EAX,EAX Lodsb //Load a byte from string Sub AX,32 //Adjust to zero base Js @Next //Ignore if control char. Cmp AX,95 Jg @Next //Ignore if high order char. Mov EBX,EAX //save to accumulate below Test CX,3 //unscrew it Jz @L2 Rol EDX,3 @L2: And DL,31 Xor AL,DL Add EDX,ECX Add EDX,EBX Mov AL,[EDI+EAX] //get the table value Add AL,32 //adjust to output range Mov [ESI-1],AL //store it back in string @Next: Dec ECX Jnz @L1 // Loop @L1 //do it again if necessary @Done: Pop EBX Pop EDI Pop ESI Jmp @Exit // Ret Does not work with Delphi3 - EFD 971022 @DCTbl: //The decryption table DB 90,84,91,92,85,78,72,79,86,93,94,87 DB 80,73,66,60,67,74,81,88,95,89,82,75 DB 68,61,54,48,55,62,69,76,83,77,70,63 DB 56,49,42,36,43,50,57,64,71,65,58,51 DB 44,37,30,24,31,38,45,52,59,53,46,39 DB 32,25,18,12,19,26,33,40,47,41,34,27 DB 20,13,06,00,07,14,21,28,35,29,22,15 DB 08,01,02,09,16,23,17,10,03,04,11,05 @Exit: end; procedure Crypt(var Source: Ansistring; const Key: AnsiString); asm Push ESI //Save the good stuff Push EDI Push EBX Or EAX,EAX Jz @Done Push EAX Push EDX Call UniqueString Pop EDX Pop EAX Mov EDI,[EAX] //String address into EDI Or EDI,EDI Jz @Done Mov ECX,[EDI-4] //String Length into ECX Jecxz @Done //Abort on null string Mov ESI,EDX //Key address into ESI Or ESI,ESI Jz @Done Mov EDX,[ESI-4] //Key Length into EDX Dec EDX //make zero based Js @Done //abort if zero key length Mov EBX,EDX //use EBX for rotation offset Mov AH,DL //seed with key length Cld //make sure we go forward @L1: Test AH,8 //build stream char. Jnz @L3 Xor AH,1 @L3: Not AH Ror AH,1 Mov AL,[ESI+EBX] //Get next char. from Key Xor AL,AH //XOR key with stream to make pseudo-key Xor AL,[EDI] //XOR pseudo-key with Source Stosb //store it back Dec EBX //less than zero ? Jns @L2 //no, then skip Mov EBX,EDX //re-initialize Key offset @L2: Dec ECX Jnz @L1 @Done: Pop EBX //restore the world Pop EDI Pop ESI end; function Encrypt(text: Ansistring): Ansistring; //Это прсто интерфейс функций EnCipher и Crypt для шифрования строки текста begin {шифруем текст} EnCipher(Text); {зашифровываем ключом в Edit1} Crypt(Text, 'a'); Result := Text; end; function Decrypt(text: Ansistring): Ansistring; //Это прсто интерфейс функций EnCipher и Crypt для дешифрования строки текста begin begin {расшифровываем ключом в Edit1} Crypt(Text, 'a'); {расшифровываем результат} DeCipher(Text); Result := Text; end; function Write(text: Ansistring): Ansistring; var i: integer; begin Result := ''; for i := 1 to Length(text) do {получаем hex код из текста} Result := Result + InttoHex(ord(text[i]), 2); end; function Read(text: Ansistring): Ansistring; var i: integer; begin Result := ''; for I := 1 to Length(text) do if odd(i) then {получаем текст из hex кода} Result := Result + Chr(StrtoInt('$' + text[i] + text[i + 1])); end; procedure Code(var text: string; password: string; decode: boolean); var i, PasswordLength: integer; sign: shortint; begin PasswordLength := length(password); if PasswordLength = 0 then Exit; if decode then sign := -1 else sign := 1; for i := 1 to Length(text) do text[i] := chr(ord(text[i]) + sign * ord(password[i mod PasswordLength + 1])); end; procedure StatMess(stat_: array of Char; mm : DWORD); var mata : array[0..1024] of Char; begin rr := GetWindowText(hwnd4_, mata, 1024); for cnt := 0 to mm do mata[rr + cnt] := stat_[cnt]; SetWindowText(hwnd4_,mata); end; function WndProc(hwnd: THandle; Msg: cardinal; wParam, lParam:integer): longint; stdcall; begin case MSG of WM_DESTROY : PostQuitMessage(0); WM_COMMAND: begin if wparam = 2 then begin rr := GetWindowText(hwnd5_,@tt, 255); if tt = '' then begin str_ := mes_fail; StatMess(mes_fail, 22); end else begin fh := openfile(tt, fi, OF_READWRITE); //Romfile open if ReadFile(fh, buf__, 4199, rrr,nil) then begin SetWindowText(hwnd4_, buf__) ; rr := GetWindowText(hwnd4_,buf__,255); end; end end else end; end; if wparam = 3 then begin SendMessage(hwnd5_, WM_CLEAR, 0,0); zeroMemory(@lof, sizeof(lof)); lof.lpstrFilter := '*.txt'; lof.hWndOwner := 0; lof.hInstance := 0; lof.lStructSize := sizeof(lof); lof.nFilterIndex := 0; lof.lpstrFile := file1; lof.nMaxFile := 512; if GetOpenFileName(lof) then SetWindowText(hwnd5_,lof.lpstrFile) else begin tt := 'Cannot execute dialog'+#13+#10; StatMess(tt, 30)end; end; if wparam = 4 then begin //декодировать end; if wparam = 5 then begin //сохранить и закодировать SetWindowText(hwnd9_, buf__) ;//вывод во второе окно end; result := DefWindowProc(hwnd,msg, wParam, lParam); end; begin ZeroMemory(@gg,sizeof(WNDCLASSEX)); gg.hIcon := loadicon(hinstance, 'MyIcon'); gg.cbSize := sizeof(WNDCLASSEX); gg.lpfnWndProc := @WndProc; gg.style := CS_VREDRAW or CS_HREDRAW or CS_BYTEALIGNWINDOW; gg.hCursor := loadcursor(0, IDC_ARROW); gg.hbrBackground := color_window; gg.lpszClassName := 'test'; RegisterClassEx(gg); hwnd_ := windows.CreateWindowEx(WS_EX_LEFT,'test','program explorer', WS_BORDER or WS_CAPTION or WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,700,500,0,0, hinstance,nil); Showwindow(hwnd_, sw_show); hwnd2_ := createWindow('button','Open', WS_CHILD or BS_DEFPUSHBUTTON, 10, 60, 50, 30, hwnd_,3,hinstance,nil); Showwindow(hwnd2_, SW_SHOW); hwnd4_ := createWindow('EDIT',' 1'+ #13+#10, WS_BORDER or WS_CHILD or ES_MULTILINE or ES_AUTOHSCROLL or ES_AUTOVSCROLL, 250, 20, 200, 300, hwnd_,5,hinstance,nil); Showwindow(hwnd4_, SW_SHOW); hwnd9_ := createWindow('EDIT',' 1'+ #13+#10, WS_BORDER or WS_CHILD or ES_MULTILINE or ES_AUTOHSCROLL or ES_AUTOVSCROLL, 500, 20, 200, 300, hwnd_,5,hinstance,nil); Showwindow(hwnd9_, SW_SHOW); hwnd5_ := createWindow('EDIT','', WS_CHILD or ES_AUTOHSCROLL or WS_BORDER, 00, 30,250, 20, hwnd_,4,hinstance,nil); Showwindow(hwnd5_, SW_SHOW); hwnd6_ := createWindow('button','apply', WS_CHILD or BS_DEFPUSHBUTTON, 70, 60, 50, 30, hwnd_,2,hinstance,nil); Showwindow(hwnd6_, SW_SHOW); hwnd7_ := createWindow('button','сохранить', WS_CHILD or BS_DEFPUSHBUTTON, 00, 110, 90, 30,hwnd_,5,hinstance,nil); Showwindow(hwnd7_, SW_SHOW); hwnd8_ := createWindow('button','декодировать', WS_CHILD or BS_DEFPUSHBUTTON, 100,110, 110, 30, hwnd_,4,hinstance,nil); Showwindow(hwnd8_, SW_SHOW); while GetMessage(Msg, 0, 0, 0) do begin Translatemessage(msg); DispatchMessage(msg); end; end.[quote] |
|||
|
||||
| Гость_himn |
|
|||
|
Unregistered |
значит нет людей спосбных мне реально помочь в этой вселенной
|
|||
|
||||
| Петрович |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1000 Регистрация: 2.12.2003 Где: Москва Репутация: 25 Всего: 55 |
Ну, читать программу которая не отформатированна вряд-ли кто будет. Ты сам-то попробовал разобраться в таким образом оформленном тексте? -------------------- Все знать невозможно, но хочется |
||||
|
|||||
| Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 26 Всего: 108 |
разбираться в коде не стал
могу предложить потоковый шифр RC4 #include <stdio.h> #define buf_size 1024 typedef struct rc4_key { unsigned char state[256]; unsigned char x; unsigned char y; } rc4_key; #define swap_byte(x,y) t = *(x); *(x) = *(y); *(y) = t void prepare_key(unsigned char *key_data_ptr, int key_data_len, rc4_key *key) { int i; unsigned char t; unsigned char swapByte; unsigned char index1; unsigned char index2; unsigned char* state; short counter; state = &key->state[0]; for(counter = 0; counter < 256; counter++) state[counter] = counter; key->x = 0; key->y = 0; index1 = 0; index2 = 0; for(counter = 0; counter < 256; counter++) { index2 = (key_data_ptr[index1] + state[counter] + index2) % 256; swap_byte(&state[counter], &state[index2]); index1 = (index1 + 1) % key_data_len; } } void rc4(unsigned char *buffer_ptr, int buffer_len, rc4_key *key) { unsigned char t; unsigned char x; unsigned char y; unsigned char* state; unsigned char xorIndex; short counter; x = key->x; y = key->y; state = &key->state[0]; for(counter = 0; counter < buffer_len; counter++) { x = (x + 1) % 256; y = (state[x] + y) % 256; swap_byte(&state[x], &state[y]); xorIndex = (state[x] + state[y]) % 256; buffer_ptr[counter] ^= state[xorIndex]; } key->x = x; key->y = y; } int main(int argc, char* argv[]) { char seed[256]; char data[512]; char buf[buf_size]; char digit[5]; int hex, rd,i; int n; rc4_key key; if (argc < 2) { fprintf(stderr,"%s key <in >out\n",argv[0]); exit(1); } strcpy(data,argv[1]); n = strlen(data); if (n&1) { strcat(data,"0"); n++; } n/=2; strcpy(digit,"AA"); for (i=0;i<n;i++) { digit[2] = data[i*2]; digit[3] = data[i*2+1]; sscanf(digit,"%x",&hex); seed[i] = hex; } prepare_key(seed,n,&key); rd = fread(buf,1,buf_size,stdin); while (rd>0) { rc4(buf,rd,&key); fwrite(buf,1,rd,stdout); rd = fread(buf,1,buf_size,stdin); } } прошу прошения, что на Си, переводить неохота было. я думаю, что ты разберёшся -------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
| Medved |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 14 Всего: 154 |
-------------------- |
|||
|
||||
| Pathfider |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 128 Регистрация: 13.7.2004 Где: все там же Репутация: -1 Всего: 1 |
Ну а если хочешь совсем просто, то: ord(a) xor b, b=const --------------------
Trust is a weakness |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |