![]() |
Verschlüsselungsalgorithmus unicodefähig machen (kyrillische Buchstaben)
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:
Testfälle
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;
Delphi-Quellcode:
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?
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); |
AW: Verschlüsselungsalgorithmus unicodefähig machen
Keine Ahnung was das genau zur, nur was ist überhaupt dein Zweck?
Verschlüsselungsbibliotheken für Delphi die nach bekannten Standards arbeiten gibt es genügend. Warum nicht so eine nehmen? |
AW: Verschlüsselungsalgorithmus unicodefähig machen
Der Zweck sollte doch klar sein. Damit verschlüssle und entschlüssle ich Zeichenketten.
Ich benutze keine vorgefertigte, weil ich die Funktionen aktuell in Delphi und PHP nutze. Wenn der Code da oben mit kyrillischen Buchstaben zurecht kommen würde, wäre das viel mehr wert als irgendeine große Bibliothek zu nehmen, die dann nicht in PHP funktioniert. Ich habe noch die Wolfgang-Erhardt-Units. Kann man damit mit wenigen Zeilen (in eine Wrapper-Unit verpackt) eine verschlüsselung aufbauen und in PHP einfach nachbilden? |
AW: Verschlüsselungsalgorithmus unicodefähig machen (kyrillische Buchstaben)
Verschlüsselungen arbeiten auf Byte-Ebene.
Dein Algorithmus geht vermutlich davon aus das 1 Character = 1 Byte ist. Damit klapptes es bis Delphi 2007, aber nicht mehr danach. Du musst deinen String in einen Memorystream packen und dann die einzelnen Bytes codieren. |
AW: Verschlüsselungsalgorithmus unicodefähig machen (kyrillische Buchstaben)
Das wird dann vermutlich dieser Abschnitt hier sein
Delphi-Quellcode:
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; |
AW: Verschlüsselungsalgorithmus unicodefähig machen (kyrillische Buchstaben)
Nimm wie weiter oben erwähnt eine Bibliothek, welche wirklich verschlüsselt.
Der von dir verwendete Algorithmus wäre bereits in den 40er Jahren des letzten Jahrtausends innert Kürze geknackt worden - der Algo entspricht in etwa Verschlüsselungstechniken wie man sie im 15. Jahrhundert angewendet hat. |
AW: Verschlüsselungsalgorithmus unicodefähig machen (kyrillische Buchstaben)
Kann man mit den Wolfang Erhardt-Codes was anfangen und wenn ja wie, sodass auch in PHP eine Abbildung funktioniert?
Ob das geknackt werden kann oder nicht ist mir egal. Es soll nur nicht auf den ersten Blick lesbar sein. |
AW: Verschlüsselungsalgorithmus unicodefähig machen (kyrillische Buchstaben)
Zitat:
|
AW: Verschlüsselungsalgorithmus unicodefähig machen (kyrillische Buchstaben)
Kleine, neugierige Kinder sollten nicht direkt dahinterkommen :P
Gibt es denn sonst noch recht einfache Verschlüsselungen, hinter die ein normaler Mensch :!: bzw etwas besserer PC-Nutzer nicht direkt kommt? Ich rede nicht von Super-Nerds. |
AW: Verschlüsselungsalgorithmus unicodefähig machen (kyrillische Buchstaben)
Was hast Du gegen Base64? Zumindest ich kann das nicht ohne Decoding lesen.
|
AW: Verschlüsselungsalgorithmus unicodefähig machen (kyrillische Buchstaben)
Zitat:
Zitat:
Das passende PHP-Gegenstück habe ich hier auch schon gefunden. ![]() Ich hoffe nur, dass dein Code oben Strings verschlüsseln kann statt Dateien :( Der hier kann Strings aber deiner ist bestimmt besser weil in dem da unten steht AnsiString statt String. Und das Ergebnis ist ein anderes als das von PHP oben. ![]() |
AW: Verschlüsselungsalgorithmus unicodefähig machen (kyrillische Buchstaben)
Wenn du mit Delphi und PHP gleichermaßen verschlüsseln willst, dann nimm die OpenSSL-lib.
Die gibt es in beiden Systemen. libsodium kannst du auch verwenden, die gibt es ebenfalls für Delphi und PHP. Was du nicht machen solltest, deine eigene Verschlüsselung! Meist endet das in Verschusselung. |
AW: Verschlüsselungsalgorithmus unicodefähig machen (kyrillische Buchstaben)
@Frühlingsrolle
könnte man diese String-Funktion vielleicht so einbauen?
Delphi-Quellcode:
procedure StringToStream(aStream: TStream; const aString: AnsiString);
begin aStream.Write(PAnsiChar(AString)^, Length(AString)); end; procedure TfrXTEA.EncryptString(const Str: string); begin FIsFromFile := false; if Assigned(FStream) then FStream.Free; StringToStream(FStream, Str); end; Über OpenSSL finde ich zu dem Thema nicht viel oder ich suche falsch. Hier habe ich zwar was gefunden, aber da muss man Streams übergeben statt Strings. Außerdem braucht man hier ein Zertifikat oder so wenn ich das richtig sehe. Geht das nicht einfacher? Einfach nur String rein, String raus? OpenSSL enc -base64 -aes256 -in text.plain -out text.aes256 -k secure
Delphi-Quellcode:
var
EncUtil :TEncUtil; begin EncUtil := TEncUtil.Create; try EncUtil.UseBase64 := True; EncUtil.Passphrase := 'secure'; EncUtil.Cipher := 'AES-256'; EncUtil.Encrypt('text.plain', 'text.aes256'); finally EncUtil.Free; end; end; Würde es hier reichen einen TStringStream zu übergeben? ![]() Ich habe auch die Units von Gammatester. Kennt sich damit jemand aus? Ich glaube am liebsten wäre es mir, wenn die von mir eingangs erwähnten Zeilen mehrere Zeichensätze abdecken könnten. OpenSSL ist viel zu kompliziert, gammatesters Funktionen auch. |
AW: Verschlüsselungsalgorithmus unicodefähig machen (kyrillische Buchstaben)
Ich wäre dir sehr dankbar dafür. Und Bbommel sicherlich auch, da sie oder er gerade ein ähnliches Problem hat.
|
AW: Verschlüsselungsalgorithmus unicodefähig machen (kyrillische Buchstaben)
Ein Tipp habe ich noch. Du musst unbedingt auf die Encodings der Texte/Passwörter/Schlüssel achten.
Delphi benutzt WideString als UCS bzw. UTF-16 (ist nicht das gleiche! - aber jetzt erstmal einfach erklären) PHP nutzt gar nichts. d.h. das ist etwas von der Weboberfläche abhängig, was der Browser/Webseite für ein Encoding vorgibt. Üblicherweise wird im Web UTF-8 genommen. |
AW: Verschlüsselungsalgorithmus unicodefähig machen (kyrillische Buchstaben)
Kein Problem, einen Versuch war es wert.
Ich habe meine Funktionen jetzt so umgeschrieben, dass die Eingabe (Data) erst in Base64 umgewandelt wird und anschließend wird erst verschlüsselt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz