Suche Hilfe bei Delphi und ASCII-Code

Killfetzer

Super-Moderator
Teammitglied
Verschlüsselungsprogramm mit Delphi

Ich habe ein Verschlüsselungsprogramm mit Delphi geschrieben.

Mit ihm wird ein Textdokument mit Hilfe eines Verschiebungscodes (ich ersetzte ein Zeichen fest mit einem anderen) verschlüsselt. Leider kommt es zu Problemen, wenn meine Codes (also die Verschiebung) größer wird, funktioniert das entschlüsseln nicht mehr.

Ich hoffe, dass mir jemand helfen kann.

PS: Natürlich wird der Verschiebungscode, sobald das Programm funktioniert durch etwas komplizierteres ersetzt (Rollcode oder so).

/EDIT: Titel angepasst, da Problem gelöst, aber weiterhin Interesse am Thread besteht.
 
Zuletzt bearbeitet:
Hältst du auch die Bereiche der darstellbaren Zeichen ein?
Wenn der Code zu groß wird, kommt er ja in die Bereiche, wo er kein Zeichen mehr hat und einfach nur ein schwarzes Quadrat darstellt. Dieses dürfte beim decodieren Probleme machen.
Das wäre was mir dazu einfällt. :D
 
  • Like
Reaktionen: Killfetzer
Ich kenne Delphi nicht, aber ich ziehe da einfach mal ne Analogie zu C(++)...

Zeichen einer Textdatei sind ja auch nur Zahlen, die eben - einem Code (ASCII zB) entsprechend - eindeutig ein Zeichen darstellen. Ein Zeichen entspricht normalerweise 1 Byte, was bedeutet, dass einem Zeichen eine Zahl zwischen 0 und 255 zugeordnet werden kann (unsigned char in C(++) ). der einfache Typ char in C(++) ist vorzeichenbehaftet, kann also Werte zwischen -128 und 127 annehmen. Wenn du nun zu 'z' (=122) einen Wert größer 5 hinzuaddierst und mit normalen chars rechnest (ich kenne Delphi nicht, vielleicht gibt es da keine chars?), also vorzeichenbehafteten Zahlen, kriegst du einen Überlauf.

Mein Vorschlag wäre jetzt, deine chars nach int zu casten (oder wie auch immer man das in Delphi macht) und damit zu rechnen, in einem Ring Z_255 zu rechnen (also alle Operationen modulo 255) und hinterher das Ergebniss wieder auf unsigned char zu casten. Wenn du das verschlüsselte einliest musst du es natürlich als unsigned char behandeln, aber wenn du das Original als char eingelesen hast musst du das entschlüsselte auch wieder als char ausgeben.

Wahrscheinlich klingt das ziemlich konfus, wenn dus nicht verstanden hast frag einfach ;)
 
  • Like
Reaktionen: Killfetzer
Vielen Dank, Jubidu.

Ich mache es genauso wie du beschriben hast. Allerdings habe die Chars von 0 bis 255 laufen lassen. Wenn sie aber mit -128 anfangen definiert zu sein, erklärt das sicher mein Problem.

@Hanfmann: auch dir vielen Dank, aber welche ASCII-Werte darstellbar sind, sollte für mein Programm egal sein, da es direkt die Quelldaten der Datei ausließt (die ja wie Jubidu geschrieben hat nur aus Zahlen besteht).

PS: Der Vergleich mit C funktioniert eigentlich immer, immerhin ist Delphi der Vorgänger von C. Bis auf ein etwas veränderte Syntax sind die beiden Sprachen ziemlich gleich. Nur hab ich halt Delphi gelernt und progge deshalb noch damit rum.
 
Wenn Delphi und C so ähnlich sind, dann kannst dus ja in ein unsigned char Array einlesen, dann solltest du keine Probleme kriegen, solange du aufpasst, die 255 nicht zu überschreiten ;)
 
Mein Problem waren die Steuerzeichen, die sind natürlich beim verschlüsseln verloren gegangen. Ich lasse jetzt nur noch von char 32 bis 255 verschlüsseln. Deshalb funktioniert es jetzt.

Also gibt es doch einen wichtigen Unterschied von Delphi und C, die chars laufen von 0 bis 255 und nicht von -128 bis 127 ;)

Jetzt muss ich mir nur noch einen besseren Verschlüsselungsalgorythmus ausdenken. :)
 
So jetzt müsste ich nur noch herausbekommen, warum beim Entschlüsseln des Codes Fehler auftreten, wenn ich zwischendurch speichere und neu öffne.

Es wäre wirklich blöd, wenn ich auf die ganzen schönen Sonderzeichen verzichten müsste.
 
wenns schon ein symmetrische Algorithmus sein muss dann doch eher "Rijndael" ... ich würd aber RSA nehmen, der is relativ einfach und ist asymmetrisch (also dat mit öffentlichen/privaten Schlüsseln)
:shock:
ähh...: Rijndael ==
[SIZE=-1]Advanced Encryption Standard :p


k, aber bei Datein ... wie haut das dann mit den schlüsseln?
Wird der Private Key dann ins programm gespeichert??? :huh:
[/SIZE]
 
naja nich ganz, die Reihenfolge is ja so: DES -> 3DES -> AES -> Rijndael (gegenüber AES hat Rijndael keine festen Blockgrößen, auch funktioniert der Algorithmus etwas anders)

Was deine Frage angeht schau mal hier (RSA ist eben relativ einfach umzusetzen,zumal es sich hier sowieso bloß um Text handelt, so dass Killfetzer nicht gleich überfordert ist)
 
Zuletzt bearbeitet:
dann lies mal zuende ;)

z.B. dieser Abschnitt:
Bei Rijndael können Blocklänge und Schlüssellänge unabhängig voneinander die Werte 128, 160, 192, 224 oder 256 Bits erhalten, während bei AES die Einschränkung der festgelegten Blockgröße von 128 Bit und der Schlüsselgröße von 128, 192 oder 256 Bit gilt.

AES gabs (z.T. in verschiedenen Varianten) schon vorher, aber erst im dort genannten Wettbewerb wurde Rijndael als Standard ausgewählt. Kann zwar sein, dass man Rijndael inzwischen auch unter dem Namen AES kennt is aber doch ein bissel was anderes.
 
  • Like
Reaktionen: Black Mordred
Also im Moment verwendet mein Programm eine Kombination von Substitution und Transposition.
Allerdings soll in die Verschlüsselung ein öffentlicher Schlüssel geschrieben werden, der eine asymmetrische Verschlüsselung ermöglicht. Allerdings werde ich einen Stream-Algorithmus verwenden (also byte- und nicht blockweise). Ich denke bei Zeichenketten, wäre ein Blockalgorithmus etwas übertrieben (nebenbei ist ein Stream schwerer zu knacken).

Black Mordred schrieb:
veröffentlichst du den Algorithmus dann? (richtige Antwort: JA!)

Dann wäre ja meine Verschlüsselung in Gefahr!! :lol:
Ich kann ihn ja mal zusammen mit einem verschlüsselten Dokument veröffentlichen und ihr könnt versuchen ihn zu knacken :)
 
Dann wäre ja meine Verschlüsselung in Gefahr!! :lol:
Ich kann ihn ja mal zusammen mit einem verschlüsselten Dokument veröffentlichen und ihr könnt versuchen ihn zu knacken :)

:shock: Ich will dir da nicht dreinreden, tus aber einfach mal:


---> Um ihn einer ein eingehenden Prüfung zu unterziehen sollte man dan algorithmus veröffentlichen <---


Handy-Verschlüsselung angeblich geknackt

Die beiden israelischen Kryptologen Alex Biryukov und Adi Shamir haben Medienberichten zufolge den Verschlüsselungsalgorithmus geknackt, der GSM-Handy-Telefonate auf der Funkstrecke zur Mobiltelefon-Basisstation schützt. Das Verfahren soll mit einem handelsüblichen PC auskommen, der mit 128 MByte RAM und zwei 73 GByte Festplatten ausgestattet ist. Auf diesem soll das Programm der Forscher durch eine Analyse der ersten zwei Gesprächsminuten in weniger als einer Sekunde den verwendeten Schlüssel errechnen können.
Umstritten ist, ob und mit welchem Aufwand es möglich ist, die Gespräche überhaupt abzufangen, um sie anschließend zu dechiffrieren. Eines zeigen die Vorfälle um die GSM-Verschlüsselungsalgorithmen A5/1 und A5/2 aber schon jetzt deutlich: Der Versuch, Krypto-Verfahren geheim zu halten, dient nicht der Sicherheit. Das hat anscheinend auch die GSM-Association gelernt: Ihr Sicherheitsdirektor James Moran äußerte dem Online-Magazin Wired gegenüber, dass man künftige Algorithmen von vorneherein offenlegen will, um der Fachwelt eine Prüfung zu ermöglichen. (nl/c't)
[Quelle: http://www.heise.de/newsticker/meldung/7183]
 
Naja, soviel hält mein Code bestimmt nicht stand. Allerdings verwende ich einen selbst erdachten Algorithmus (eine Kombination von bekannten). Vielleicht kommt ja einfach niemand auf die nötige Idee ihn zu knacken.

Im Moment muss ich noch das Problem hinbekommen, dass in die txt-Dateien nicht noch zusätzlich RichText-Informationen geschrieben werden, was im Moment beim verschlüsseln passiert. Danach veröffentliche ich mal den ersten Algorithmus.

EDIT:
Hier gibt es eine lange verschlüsselte Textdatei. Der Text ist auf englisch und beinhaltet eine Reihe von witzigen Sachen (hauptsächlich Sprüche).
Mein Verschlüsselungsalgorithmus sieht wie folgt aus:

Code:
procedure TForm1.EditCryptExecute(Sender: TObject);
var
i,j,k,l,N,x:integer;
orginal, classified:string;
begin
  x:=0;
  keygenerator;
  for i:= 0 to 10000 do begin
    orginal:=Memo1.Lines[i];
    N:=Length(orginal);
      while N > 0 do begin
          for k:=0 to zeichenzahl do begin
            if orginal[N] = zeichen[k + 32] then begin
              l := N mod stellen;
              j := k;
              j:= k + key[l+1];
              j := j mod zeichenzahl;
              classified := classified + zeichen[j + 32];
              x:=1;
            end
            else begin
              if (k = zeichenzahl) and (x=0) then  begin
                classified := classified + orginal[N];
              end;
            end;
          end;
          N := N -1;
          x:=0;
      end;
    Memo1.Lines[i]:=classified;
    classified:='';
  end;
  Label1.Caption:='0';
end;

key ist ein Array von Ziffern (eben der geheime Schlüssel), während zeichen ein Array von den problemlos darstellbaren ASCII-Zeichen ist.
Ich bin ja mal gespannt, ob ihr das entschlüsseln könnt.

PS: Der Algorithmus ist eine Kombination aus rückwärtsschreiben und der Vigenère-Verschlüsselung. Nur für die, die den Quellcode nicht lesen können... ;)
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Black Mordred
PS: Der Algorithmus ist eine Kombination aus rückwärtsschreiben und der Vigenère-Verschlüsselung. Nur für die, die den Quellcode nicht lesen können... ;)
Gut, denn der Rest sagt mir nicht recht viel :D


edit:

ist das eigentlich nur text, oder ist da was die Textdatei betreffend (also zb. name, format etc.) auch drinnen????



edit2: gibts irgendetwas womit ich nen text umkehren kann? (also 1. zeichen ganz hinten, letztes ganz vorne?)
 
Zuletzt bearbeitet:
zu deinem 1. Edit:
Es ist nur der reine Text gespeichert. Formatdaten werden in *.txt Dateien vom Editor nicht abgelegt. Das hält mein Programm genauso.

zu deinem 2. Edit:
Ja, mein Programm. Ich hab es hier hochgeladen. Wenn du als Verschlüsselungscode 0 wählst, wird einfach der Text umgekehrt.
 
  • Like
Reaktionen: Black Mordred