Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шифрование 
:(
    Опции темы
Гость_himn
  Дата 20.6.2004, 11:35 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Никак не могу сделать поточное шифрование файла,проблема в том. что все исходники основаны на построчном кодировании файлов, а мне надо запихать файл в поток, затем создать другой поток записать в него зашифрованый текст и вывести в другой файл, как сделать это?
  Вверх
Cheba
Дата 20.6.2004, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pointless one
***


Профиль
Группа: Vingrad developer
Сообщений: 1777
Регистрация: 27.11.2003
Где: /dev/null

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



Каким алгоритмом шифруешь?
PM MAIL ICQ   Вверх
Гость_himn
Дата 20.6.2004, 11:58 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


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>
Дата 20.6.2004, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

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



Чего то мне это напоминает пример из Марко Кентуsmile.gif)

П.С. Сори за оффтоп


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Гость_himn
Дата 20.6.2004, 12:11 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











каким ещё алгоритмом воспользоваться можно, т.е. какой самый простой в шифровании файлов
  Вверх
<Spawn>
Дата 20.6.2004, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

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



Посмотри компоненты шифрования\дешифрования на Indy Misc панеле


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Гость_himn
Дата 20.6.2004, 12:39 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А как в потоке реализовать кодирование ?
  Вверх
Гость_himn
Дата 20.6.2004, 13:49 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











что лучше FileStream или MemoryStream, а может можно как нибудь запихать в память весь файл(поток) и работать с ним при помощи StringStream
  Вверх
Guest
Дата 20.6.2004, 14:18 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
Дата 20.6.2004, 15:35 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











значит нет людей спосбных мне реально помочь в этой вселенной
  Вверх
Петрович
Дата 20.6.2004, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

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



Цитата
подскажите чего нужно добавить чтобы заработало

Цитата
значит нет людей спосбных мне реально помочь в этой вселенной

Ну, читать программу которая не отформатированна вряд-ли кто будет. Ты сам-то попробовал разобраться в таким образом оформленном тексте?



--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Albinos_x
Дата 21.6.2004, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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

прошу прошения, что на Си, переводить неохота было.
я думаю, что ты разберёшся


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Medved
Дата 21.6.2004, 07:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

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



М
 
Не забывайте про тэг code (кнопка #). В дальнейшем код, не оформленные таким тегом, будет удаляться!



--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Pathfider
Дата 2.10.2004, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 13.7.2004
Где: все там же

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



Цитата
каким ещё алгоритмом воспользоваться можно, т.е. какой самый простой в шифровании файлов

Ну а если хочешь совсем просто, то: ord(a) xor b, b=const
--------------------
Trust is a weakness
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


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

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


 




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


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

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