Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.12.07;
Скачать: CL | DM;

Вниз

Зашифровать содержимое TStringList   Найти похожие ветки 

 
Nil   (2008-10-27 16:12) [0]

Есть StringList с данными. Хочу зашифровать содержимое и получить данные одной строкой. Нашёл код для шифрования, а вот как зашифровать не знаю.. Попробовал так:

procedure TForm1.Button1Click(Sender: TObject);
var
 SL: TStringList;
 InCStr, OutCStr: AnsiString;
 i: integer;
 CKey: TEAKey;
begin
 CKey[0]:=2332454098;
 CKey[1]:=5346734557;
 CKey[2]:=8937442334;

 SL:=TStringList.Create;
 try
   SL.LoadFromFile("c:\problems.txt");
   for I := 0 to SL.Count - 1 do
     InCStr:=InCStr+SL.Strings[i];

   while (Length(InCStr) mod 8)<>0 do
     InCStr:=InCStr+"#";
 finally
   SL.Free;
 end;

 FillChar(OutCStr,Length(InCStr),"#");

 TEA_Encode(Pointer(InCStr),Pointer(OutCStr),Length(InCStr),CKey);
end;

Access violation на строчке шифрования

вот сам код который по идее должен шифровать:

unit ucrypt;

interface
type
 TEAKey = array[0..3] of cardinal;

//Use 64-bit aligned data size (8,16...) or else some data will be left unencrypted!
procedure TEA_Encode(Input, Output: pointer; size: integer; key: TEAKey);
procedure TEA_Decode(Input, Output: pointer; size: integer; key: TEAKey);

implementation
type
 TEAData = array[0..1] of cardinal;
 PTEAKey = ^TEAKey;
 PTEAData = ^TEAData;

procedure TEA_Cipher(v: PTEAData; var w: PTEAData; k: PTEAKey);
var
 y, z, sum, delta, n: Cardinal;
begin
 y := (v)[0];
 z := (v)[1];
 sum := 0;
 delta := $9E3779B9;
 n := 32;

 while (n > 0) do
 begin
   inc(y, (z shl 4 xor z shr 5) + z xor sum + (k)[sum and 3]);
   inc(sum, delta);
   inc(z, (y shl 4 xor y shr 5) + y xor sum + (k)[sum shr 11 and 3]);
   dec(n);
 end;

 (w)[0] := y;
 (w)[1] := z;
end;

procedure TEA_DeCipher(v: PTEAData; var w: PTEAData; k: PTEAKey);
var
 y, z, sum, delta, n: Cardinal;
begin

 y := v[0];
 z := v[1];
 sum := $0C6EF3720;
 delta := $9E3779B9;
 n := 32;

 while (n > 0) do
 begin
   dec(z, (y shl 4 xor y shr 5) + y xor sum + k[sum shr 11 and 3]);
   dec(sum, delta);
   dec(y, (z shl 4 xor z shr 5) + z xor sum + k[sum and 3]);
   dec(n);
 end;

 w[0] := y;
 w[1] := z;

end;

procedure TEA_EnDec(encode: boolean; Input, Output: pointer; size: integer; key:
 TEAKey);
var
 DataIn, DataOut: TEAData;
 DOut: PTEAData;
 i, sz: integer;
begin
 DOut := @DataOut;
 sz := (size shr 3) shl 3;
 i := 0;
 repeat
   DataIn[0] := Cardinal((pointer(Cardinal(Input) + Cardinal(i)))^);
   DataIn[1] := Cardinal((pointer(Cardinal(Input) + Cardinal(i + 4)))^);
   if encode then
     TEA_Cipher(@DataIn, DOut, @key)
   else
     TEA_DECipher(@DataIn, DOut, @key);
   Cardinal(pointer(Cardinal(Output) + Cardinal(i))^) := DataOut[0];
   Cardinal(pointer(Cardinal(Output) + Cardinal(i + 4))^) := DataOut[1];
   inc(i, 8);
 until i >= sz;

end;

procedure TEA_Encode(Input, Output: pointer; size: integer; key: TEAKey);
begin
 TEA_EnDec(true, Input, Output, size, key);
end;

procedure TEA_Decode(Input, Output: pointer; size: integer; key: TEAKey);
begin
 TEA_EnDec(false, Input, Output, size, key);
end;

end.


Сори за ламерский вопрос..


 
Nil   (2008-10-27 16:13) [1]

Поможите пож правильно передать и получить данные этим функциям шифрования/дешифрования!


 
Медвежонок Пятачок ©   (2008-10-27 16:14) [2]

память под аутпут кто будет выделять?


 
clickmaker ©   (2008-10-27 16:15) [3]

> Access violation на строчке шифрования

на какой?


 
Рамиль ©   (2008-10-27 16:19) [4]

1. Инициализировать InCStr Пушкин будет?
2. Выделять память для OutCStr, видимо, то же он будет.

В процессе шифрования будут появляться символы #0, если не предпримешь дополнительных действий, скорее всего потеряешь все после первого #0.


 
Nil   (2008-10-27 16:30) [5]


> память под аутпут кто будет выделять?

FillChar(OutCStr,Length(InCStr),"#"); разве не выделит память?.. если не выделит, то куда тогда запишутся мои # в количестве Length(InCStr)?

> на какой?

TEA_Encode(Pointer(InCStr),Pointer(OutCStr),Length(InCStr),CKey); внутрь функции не заглядывал, я думаю проблема не в функции..

> 1. Инициализировать InCStr Пушкин будет?

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

> В процессе шифрования будут появляться символы #0, если
> не предпримешь дополнительных действий, скорее всего потеряешь
> все после первого #0.

А почему это явление будет происходить? Модуль шифрования кривой?

Если не трудно, напишите пож как по уму это должно делаться


 
clickmaker ©   (2008-10-27 16:36) [6]

> если не выделит, то куда тогда запишутся мои # в количестве
> Length(InCStr)?

как звезды сложатся. Скорей всего, затрут предыдущие данные в стеке
SetLength() вызови перед FillChar


 
Рамиль ©   (2008-10-27 16:43) [7]


>
> А почему это явление будет происходить? Модуль шифрования
> кривой?

Насчет кривости модуля ничего не знаю. Но в процессе шифрования символы #0 будут появятся, а это управляющий символ для Windows строки.


 
Медвежонок Пятачок ©   (2008-10-27 17:18) [8]

FillChar(OutCStr,Length(InCStr),"#"); разве не выделит память?..

а должна выделить?


 
Nil   (2008-10-27 17:26) [9]

а должна выделить?
возможно:) InCStr:="Hello world"; выделяет же, вот по аналогии подумал и здесь так же..


 
Медвежонок Пятачок ©   (2008-10-27 18:51) [10]

FillChar ничего не знает про анси строки и ничего под них не выделяет.



Страницы: 1 вся ветка

Текущий архив: 2008.12.07;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
2-1225186061
Iriss
2008-10-28 12:27
2008.12.07
Общий флаг


2-1225273482
tomkat
2008-10-29 12:44
2008.12.07
XML в таблицу, запрос


15-1223008024
KSergey
2008-10-03 08:27
2008.12.07
Истерия "мирового кризиса"


15-1222873439
Городской Шаман
2008-10-01 19:03
2008.12.07
Обработчики исключений SEH vs classic C++


2-1225103320
Zhekson
2008-10-27 13:28
2008.12.07
Горячие клавиши для активного приложения