Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.07.2007, 07:11   #1
Biggelow
 
Регистрация: 06.07.2007
Сообщений: 4
Печаль RC4

Семь лет не программировал на Delphi, понадобилось программу для шифрования в RC4 сделать. Мне нужно один файл(file1.txt) с помощью ключа зашифровать в другой(file2.txt). А тут какие-то TStream, а я знать не знаю что это . Может кто подскажет как это сделать пример, или где почитать?

///////////////////////////////////////////////////
///////////////////Шифр RC4////////////////////////
///////////////////////////////////////////////////

var
s: array [0..255] of Byte;
i,j: Byte;

//Инициализация S-Box'а
procedure InitRC4Cipher(key: ShortString);
var
k: array [0..255] of Byte;
t: Byte;
l: Cardinal;
i0,j0: Byte;

begin
for i0 := 0 to 255 do s[i0] := i0;

j0 := 1; l := Length(key);
for i0 := 0 to 255 do
begin
k[i0] := Ord(key[j0]);
if j0 = l then j0 := 0;
Inc(j0);
end;

for i0 := 0 to 255 do
begin
j0 := (j0 + k[i0] + s[i0]) mod 256;

t := s[i0];
s[i0] := s[j0];
s[j0] := t;
end;

i := 0;
j := 0;
end;

//Зашифровать конкретный символ
function GetRC4ByteCiphered(bt: Byte): Byte;
var
t: Byte;

begin
i := (i + 1) mod 256;
j := (j + s[i]) mod 256;

t := s[i];
s[i] := s[j];
s[j] := t;

t := (s[i] + s[j]) mod 256;

Result := bt XOR s[t];
end;

//Применить RC4 шифр к потоку данных
function ApplyRC4ToData(Data: TStream; var Buffer: TStream; key: ShortString): Boolean; stdcall;
var
i: Cardinal;
d: Byte;
pos: Cardinal;

begin
if (key = '')OR(Buffer = Data)OR(Buffer = nil)OR(Data = nil)OR(Data.Size = 0)OR(Buffer.Size <> 0) then
begin
Result := false;
Exit;
end;

pos := Data.Position;
Data.Position := 0;
Buffer.CopyFrom(Data,Data.Size);
Buffer.Position := 0;
Data.Position := 0;

try
InitRC4Cipher(key);
for i := 0 to Buffer.Size-1 do
begin
Data.ReadBuffer(d,1);
d := GetRC4ByteCiphered(d);
Buffer.WriteBuffer(d,1);
end;
except
Result := false;
Exit;
end;

Data.Position := pos;
Buffer.Position := 0;

Result := true;
end;

///////////////////////////////////////////////////
///////////////////////////////////////////////////
///////////////////////////////////////////////////
Biggelow вне форума Ответить с цитированием
Старый 06.07.2007, 11:08   #2
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Пихаешь исходный файл в Data, в buffer оказывается шифрованный

Код:
...
var Data, Buffer : TStream;
begin
  Data := TMemoryStream.Create; 
  Buffer := TMemoryStream.Create; 
  Data.LoadFromFile('file1.txt');
  <...шифровать...>
  Buffer.SaveToFile('file2.txt');
  Buffer.free;
  Data.free;
...
пыщь

Последний раз редактировалось JTG; 06.07.2007 в 11:16.
JTG вне форума Ответить с цитированием
Старый 09.07.2007, 04:56   #3
Biggelow
 
Регистрация: 06.07.2007
Сообщений: 4
По умолчанию

не работает говорит:

[Error] rc4.pas(187): Undeclared identifier: 'LoadFromFile'
[Error] rc4.pas(189): Undeclared identifier: 'SaveToFile'
Biggelow вне форума Ответить с цитированием
Старый 09.07.2007, 10:21   #4
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

ХЗ, не помню я у какого из стримов те методы есть
может так var Data, Buffer : TMemoryStream;
пыщь
JTG вне форума Ответить с цитированием
Старый 10.07.2007, 08:00   #5
Biggelow
 
Регистрация: 06.07.2007
Сообщений: 4
По умолчанию

делаю так:

var Data14, Buffer14 : TMemoryStream;
key777: ShortString;
procedure TForm1.Button3Click(Sender: TObject);
begin
Data14 := TMemoryStream.Create;
Buffer14 := TMemoryStream.Create;
key777:='434';
Data14.LoadFromFile('file1.txt');
ApplyRC4ToData(Data14; Buffer14; key777);
Buffer14.SaveToFile('file2.txt');
Buffer14.free;
Data14.free;

end;

а он мне пишет:
[Error] rc4.pas(188): Statement expected, but expression of type 'ShortString' found
[Error] rc4.pas(188): Not enough actual parameters
Biggelow вне форума Ответить с цитированием
Старый 10.07.2007, 15:55   #6
Biggelow
 
Регистрация: 06.07.2007
Сообщений: 4
По умолчанию

Ну что мне никто не поможет?
Biggelow вне форума Ответить с цитированием
Старый 10.07.2007, 16:34   #7
krypton
Пользователь
 
Аватар для krypton
 
Регистрация: 26.06.2007
Сообщений: 22
По умолчанию хотя и поздно но в тему

var
f:text;
data:tstrings;
begin
data:=tstringlist.Create();
data.LoadFromFile(edit1.text);
...
{изменяеш текст, шифруешь}
...
data.SaveToFile(edit2.text);
data.free;
end;
Дорогу одолеет идущий.
http://www.krypton.ucoz.net
"Кто владеет информацией - тот владеет миром!"
Уинстон Черчиль (Натан Ротшильд, Френсис Бекон)
krypton вне форума Ответить с цитированием
Старый 11.07.2007, 10:37   #8
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Ну для текста как раз подойдёт

Not enough actual parameters то ж вроде когда вызов функции с меньшим кол-вом параметров, чем обьявлено в interface
пыщь
JTG вне форума Ответить с цитированием
Старый 12.07.2007, 10:47   #9
malor
Форумчанин
 
Регистрация: 23.05.2007
Сообщений: 151
По умолчанию

Нужно вызвать процедуру, которая сама по себе создавалась как обработчик нажатия кнопки - procedure TMainForm.btOplataClick(Sender: TObject); . Я ее вызываю также из некого участка в другом модуле:
Код:
...
MainForm.btOplataClick;
...
На это компидятор ругается:
Not enough actual parameters

Модуль, где сама процедура описана подключен используя uses.
malor вне форума Ответить с цитированием
Старый 12.07.2007, 13:48   #10
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Блин, описана как TMainForm.btOplataClick(Sender: TObject);
а ты её вызываешь без параметров? Естесно Not enough actual parameters

(можно и не вызывать эту функцию, используй метод click например)
пыщь

Последний раз редактировалось JTG; 12.07.2007 в 13:54.
JTG вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц