[Delphi] Jak zaszyfrowac plik INI

0

Jak zaszyfrowac/odszyfrowac dane znajdujace sie w pliku INI

0

użyj algorytmów...na 4p jest kilka albo zrób swój ;)

0

Po i przed zapisem wartości do INI, otwórz go jako zwykly plik tekstowy poprzez AssignFile... - i jakoś zakoduj dowolnym spsobem. To samo rob przed i po odczycie.

0

Zależy jak ważne dane mają być szyfrowane.
Jeżeli mało ważne - to wystarczy XOR , przestawienia czy coś w tym stylu.
Jeżeli b. ważne - coś mocniejszego (DES, IDEA etc.)

Rady:

  1. Poszukaj komponentów na Torry'm.
  2. Poczytaj o metodach kryptograficznych (np. za darmo w Empiku :p )
0

Na Torry.net tego pełno.
Algorytmy są różne np.

unit uEncrypt;

interface

function Decrypt(const S: AnsiString; Key: Word): AnsiString;
function Encrypt(const S: AnsiString; Key: Word): AnsiString;

implementation

const
C1 = 52845;
C2 = 22719;

function Decode(const S: AnsiString): AnsiString;
const
Map: array[Char] of Byte = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 63, 52, 53,
54, 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,
3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 0, 0, 0, 0, 0, 0, 26, 27, 28, 29, 30,
31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
46, 47, 48, 49, 50, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0);
var
I: LongInt;
begin
case Length(S) of
2:
begin
I := Map[S[1]] + (Map[S[2]] shl 6);
SetLength(Result, 1);
Move(I, Result[1], Length(Result))
end;
3:
begin
I := Map[S[1]] + (Map[S[2]] shl 6) + (Map[S[3]] shl 12);
SetLength(Result, 2);
Move(I, Result[1], Length(Result))
end;
4:
begin
I := Map[S[1]] + (Map[S[2]] shl 6) + (Map[S[3]] shl 12) +
(Map[S[4]] shl 18);
SetLength(Result, 3);
Move(I, Result[1], Length(Result))
end
end
end;

function PreProcess(const S: AnsiString): AnsiString;
var
SS: AnsiString;
begin
SS := S;
Result := '';
while SS '' do
begin
Result := Result + Decode(Copy(SS, 1, 4));
Delete(SS, 1, 4)
end
end;

function InternalDecrypt(const S: AnsiString; Key: Word): AnsiString;
var
I: Word;
Seed: Word;
begin
Result := S;
Seed := Key;
for I := 1 to Length(Result) do
begin
Result[I] := Char(Byte(Result[I]) xor (Seed shr 8));
Seed := (Byte(S[I]) + Seed) * Word(C1) + Word(C2)
end
end;

function Decrypt(const S: AnsiString; Key: Word): AnsiString;
begin
Result := InternalDecrypt(PreProcess(S), Key)
end;

function Encode(const S: AnsiString): AnsiString;
const
Map: array[0..63] of Char = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' +
'abcdefghijklmnopqrstuvwxyz0123456789+/';
var
I: LongInt;
begin
I := 0;
Move(S[1], I, Length(S));
case Length(S) of
1:
Result := Map[I mod 64] + Map[(I shr 6) mod 64];
2:
Result := Map[I mod 64] + Map[(I shr 6) mod 64] +
Map[(I shr 12) mod 64];
3:
Result := Map[I mod 64] + Map[(I shr 6) mod 64] +
Map[(I shr 12) mod 64] + Map[(I shr 18) mod 64]
end
end;

function PostProcess(const S: AnsiString): AnsiString;
var
SS: AnsiString;
begin
SS := S;
Result := '';
while SS '' do
begin
Result := Result + Encode(Copy(SS, 1, 3));
Delete(SS, 1, 3)
end
end;

function InternalEncrypt(const S: AnsiString; Key: Word): AnsiString;
var
I: Word;
Seed: Word;
begin
Result := S;
Seed := Key;
for I := 1 to Length(Result) do
begin
Result[I] := Char(Byte(Result[I]) xor (Seed shr 8));
Seed := (Byte(Result[I]) + Seed) * Word(C1) + Word(C2)
end
end;

function Encrypt(const S: AnsiString; Key: Word): AnsiString;
begin
Result := PostProcess(InternalEncrypt(S, Key))
end;

end.

{}
// Example:
{
}

procedure TForm1.Button1Click(Sender: TObject);
const
my_key = 33189;
var
sEncrypted, sDecrypted :AnsiString;
begin
// Encrypt a string
sEncrypted := Encrypt('this is a sample text to encrypt...abcd 123 {}[]?=)=(',my_key);
// Show encrypted string
ShowMessage(sEncrypted);
// Decrypt the string
sDecrypted := Decrypt(sEncrypted,my_key);
// Show decrypted string
ShowMessage(sDecrypted);
end;

Algorytm z Torry.net dla stringu.

Pozdrowienia Noob Saibot

0

Przepraszam za lamerskei pytanie co trzeba zrobic z :
unit uEncrypt;
...

0

Skomplikowane troszkę to ostatnie ale mozliwe ze chodzi nieźle.
Ja proponuję cos takiego aby wartosci kluczy potraktować szyfrowaniem w ten spoób aby każdy znak ze stringu sprowadzić do kodu szesnastkowego i przesunać (np. dodać) go i pewną wartość.
W rozkodowaniu trzeba użyc tej samej wartości lecz zamiast np. dodawać trzeba ją odjąć.
W ten sposób możesz łatwo i dosyć skutecznie zaszyfrować niektóre dane.
Możliwe jest aby każdy znak był przesunięty o inną wartość i wtedy już w ogóle rozszyfrowanie tego to kupa roboty.
Pozdrawiam

Możliwe jest np. coś takiego:

function haslo(rozkodowane:string):String;
////KODOWANIE HASŁA
var
zakodowane : string;
d : Array[1..16] of ShortInt;
i : byte;
begin
d[1]:=1; d[2]:=1; d[3]:=1; d[4]:=1; d[5]:=1; d[6]:=1; d[7]:=1; d[8]:=1;
d[9]:=1; d[10]:=1; d[11]:=1; d[12]:=1; d[13]:=1; d[14]:=1; d[15]:=1; d[16]:=1;
SetLength(Zakodowane,length(Rozkodowane));
for i:=1 to Length(Rozkodowane) do
Zakodowane[i]:=chr(ord(Rozkodowane[i])-d[i]);
Result := Zakodowane;
lub po prostu Haslo := zakodowane;
end;
////koniec rozkodowywania hasła

Tutaj znalazłem mój stary kod do tego.
Wartosci tej pierwszej tablicy to jedynki ale można dowolnie je zmieniać (ale dla rozkodowywania trzeba uzywać takich samych wartości) przyjmując tylko że żadna suma kodu ASCI dowolnego znaku łańcucha kodowanego z dowolną stałą d[i] nie może wykroczyć poza zakres 0..255, co przy założeniu, że w skład hasła wchodzić mogą litery i cyfry (czyli znaki z przedziału 48..122) oznacza, że stałe d1..d4 muszą należeć do przedziału ?48..133
ja to do hasła robiłem ale ponieważ możliwe że będziesz zapisywał jeszcze inne znaki zamiast liter i cyfr to w takim wypadku musisz sam sprawdzić jaką wartość maxsymalną możesz wpisywaćaby suma nie wyskoczyła poza te nieszczęsne 255 lub używać możliwie małych przesunięć.

0

Witam
Udało mi sie uruchomić to szyfrowanie opisane w "unit uEncrypt;" i działa bardzo fajnie, jednak nie moge sobie poradzic z tym jak w procedurze

procedure TForm1.Button1Click(Sender: TObject);
const
my_key = 33189;
var
sEncrypted, sDecrypted :AnsiString;
begin
// Encrypt a string
sEncrypted := Encrypt('this is a sample text to encrypt...abcd 123 {}[]?=)=(',my_key);
// Show encrypted string
ShowMessage(sEncrypted);
// Decrypt the string
sDecrypted := Decrypt(sEncrypted,my_key);
// Show decrypted string
ShowMessage(sDecrypted);
end;
w miejsce
sEncrypted := ....
wstawic instrukcje aby szyfrowal caly plik a nie tylko przykladowy text. Czy jest to w ogole mozliwe?
Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1