Einzelnen Beitrag anzeigen

DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#1

Verschlüsselungsalgorithmus unicodefähig machen (kyrillische Buchstaben)

  Alt 18. Nov 2019, 21:07
Aus den Weiten des Internets habe ich irgendwann mal diesen Code aufgegriffen.
Der funktioniert mit lateinischen Buchstaben, Umlauten und typische französische Zeichen wie à, Í und viele mehr.

Mit kyrillischen Buchstaben hat er aber seine Probleme und ich weiß nicht genau warum. Kann mir jemand helfen?
Delphi-Quellcode:
function RandomString(Chars: string; StringLength: Integer): string;
var
 i, x: Integer;
begin
 Result := '';
 for i := 0 to StringLength- 1 do
  begin
   x := Length(Chars) - Random(Length(Chars));
   Result := Result + Chars[x];
   Chars := Copy(Chars, 1, x - 1) + Copy(Chars, x + 1, Length(Chars));
  end;
end;

// Verschlüsseln
function EncodeStr(const Data, SecurityString: string; MinV: Integer = 0; MaxV: Integer = 5): string;
const
 aAlphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/';
var
 i, x: Integer;
 s1, s2, ss: string;
begin
 if (Trim(Data) = '') or (Length(SecurityString) < 16) then
  begin
   Result := '';
   Exit;
  end;

 if MinV > MaxV then
  begin
   i := MinV;
   MinV := MaxV;
   MaxV := i;
  end;

 if MinV < 0 then
  MinV := 0;
 if MaxV > 100 then
  MaxV := 100;

 Result := '';

 for i := 1 to Length(SecurityString) do
  begin
   s1 := Copy(SecurityString, i + 1, Length(SecurityString));
   if Pos(SecurityString[i], s1) > 0 then
    Exit;
   if Pos(SecurityString[i], aAlphabet) <= 0 then
    Exit;
  end;

 s1 := aAlphabet;
 s2 := '';
 for i := 1 to Length(SecurityString) do
  begin
   x := Pos(SecurityString[i], s1);
   if x > 0 then
    s1 := Copy(s1, 1, x - 1) + Copy(s1, x + 1, Length(s1));
  end;

 ss := SecurityString;
 for i := 1 to Length(Data) do
  begin
   s2 := s2 + ss[Ord(Data[i]) mod 16 + 1];
   ss := Copy(ss, Length(ss), 1) + Copy(ss, 1, Length(ss) - 1);
   s2 := s2 + ss[Ord(Data[i]) div 16 + 1];
   ss := Copy(ss, Length(ss), 1) + Copy(ss, 1, Length(ss) - 1);
  end;

 Result := RandomString(s1, Random(MaxV - MinV) + MinV + 1);

 for i := 1 to Length(s2) do
  Result := Result + s2[i] + RandomString(s1, Random(MaxV - MinV) + MinV);
end;

// Entschlüsseln
function DecodeStr(Data: string; const SecurityString: string): string;
const
 aAlphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/';
var
 i, x, x2: Integer;
 s1, s2, ss: string;
begin
 Result := #1;
 if (Trim(Data) = '') or (Length(SecurityString) < 16) then
  begin
   Result := '';
   Exit;
  end;

 for i := 1 to Length(SecurityString) do
  begin
   s1 := Copy(SecurityString, i + 1, Length(SecurityString));
   if Pos(SecurityString[i], s1) > 0 then
    Exit;
   if Pos(SecurityString[i], aAlphabet) <= 0 then
    Exit;
  end;

 s1 := aAlphabet;
 s2 := '';
 ss := SecurityString;
 for i := 1 to Length(Data) do
  begin
   if Pos(Data[i], ss) > 0 then
    s2 := s2 + Data[i];
  end;

 Data := s2;
 s2 := '';
 if Length(Data) mod 2 <> 0 then
  Exit;

 for i := 0 to Length(Data) div 2 - 1 do
  begin
   x := Pos(Data[(i * 2) + 1], ss) - 1;

   if x < 0 then
    Exit;

   ss := Copy(ss, Length(ss), 1) + Copy(ss, 1, Length(ss) - 1);
   x2 := Pos(Data[(i * 2) + 2], ss) - 1;

   if x2 < 0 then
    Exit;

   x := x + (x2 * 16);
   s2 := s2 + Chr(x);

   ss := Copy(ss, Length(ss), 1) + Copy(ss, 1, Length(ss) - 1);
  end;
 Result := s2;
end;
Testfälle
Delphi-Quellcode:
const
 S: string = 'Србија'; // sobald kyrillische Buchstaben vorkommen, ergeben "a" und "b" keine verwertbaren Daten mehr
var
 a, b: string;
begin
 a := EncodeStr(S, 'GvfLCc3qWYwx4FuU'); // "S" verschlüseln und in "a" speichern
 ShowMessage(a);

 b := DecodeStr(a, 'GvfLCc3qWYwx4FuU'); // Den verschlüsselten Inhalt von "a" entschlüsseln und in "b" speichern
 ShowMessage(b);
Wenn das alles gar nix ist - gibt es andere, schnell implementierte und ohne Extrabibliotheken verfügbare Verschlüsselungsmethoden, die man in Delphi und PHP zugleich umsetzen kann?

Geändert von DieDolly (18. Nov 2019 um 21:16 Uhr)
  Mit Zitat antworten Zitat