Текущий архив: 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