|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Input
Anmeldungsdatum: 28.07.2014 Beiträge: 59
|
Verfasst am: 03.10.2014, 23:08 Titel: Verschlüsselungsprogramm |
|
|
Hallo liebes Forum. Ich hab mal wieder ein Problem: Ich bastel gerade an einem Verschlüsselungsprogramm, doch ist mir der Zeichensatz zu klein; leider krieg ich das nicht besser hin. Wenn ich was ändere, bekomm ich falsche Zeichen. Auch würd ich gerne nicht nur einen Wert addieren, sondern auch abziehen. Wenn ich das aber mach, ist natürlich jedes 2. Zeichen falsch. Ich müsste die Zeichen also "markieren", dachte da an letztes Bit 0 oder 1. Weiss aber nicht wie's geht, und ob das überhaupt Sinn macht. Wäre froh, wenn ihr mir da helfen könntet, vielen Dank.
Hier mal noch der Quellcode.
Encoder:
Code: |
randomize timer
dim as integer i,j
DIM as string zeichen,zeile
open "Finden.txt" for binary access read as #1
open "Code1.txt" for output as #2
open "Code2.txt" for output as #3
do
line input #1,zeile
for i=1 to len(zeile)
j=int(rnd*9)+1
zeichen=mid(zeile,i,1)
print #2,chr(asc(zeichen)+j);
print #3,chr(j);
next
loop until eof(1)
close
|
Decoder:
Code: |
dim as integer i
DIM as string zeichen1,zeichen2,zeile1,zeile2
open "Code1.txt" for binary access read as #1
open "Code2.txt" for binary access read as #2
open "Text.txt" for output as #3
do
line input #1,zeile1
line input #2,zeile2
for i=1 to len(zeile1)
zeichen1=mid(zeile1,i,1)
zeichen2=mid(zeile2,i,1)
print #3,chr(asc(zeichen1)-asc(zeichen2));
next
loop until eof(1)
close
shell "START Notepad.exe Text.txt"
| [/code] |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1208 Wohnort: Ruhrpott
|
Verfasst am: 04.10.2014, 10:11 Titel: |
|
|
Hallo Input!
Das Problem bei deiner Methode ist, daß der Wertebereich der Ascii-Zeichen nur von 0 bis 255 reicht. Du mußt also für einen "Wrap around" - Effekt sorgen, indem du, wenn das Ergebnis der Addition größer als 255 ist, 256 davon abziehst. Das kannst du umständlich mit If...Then machen, oder einfacher und eleganter mit Code: | Print #2,Chr((Asc(zeichen) + j) And 255);
| Beim Entschlüsseln mußt du das dann natürlich entsprechend zurückrechnen.
Deine Vorgehensweise hat außerdem noch den Nachteil, daß dabei die Zeilenumbrüche verlorengehen.
Es gibt bei so einem 1:1 - Schlüssel eine wesentlich elegantere Methode der Ver- und Entschlüsselung, nämlich mit Exclusiv-Oder:
Encoder: Code: | Randomize Timer
Dim As Integer i,j
Dim As String zeichen,zeile
Open "Finden.txt" For Binary Access Read As #1
Open "Code1.txt" For Output As #2
Open "Code2.txt" For Output As #3
zeile = Input(Lof(1),#1)
For i = 0 To Len(zeile) - 1
j = Int(Rnd * 255) + 1
zeile[i] = zeile[i] Xor j
'zeile[i] = (zeile[i] + j) And 255
Print #3,Chr(j);
Next
Print #2, zeile;
Close |
Decoder: Code: | Dim As Integer i
Dim As String zeichen1,zeichen2,zeile1,zeile2
Open "Code1.txt" For Binary Access Read As #1
Open "Code2.txt" For Binary Access Read As #2
Open "Text.txt" For Output As #3
zeile1 = Input(Lof(1),#1)
zeile2 = Input(Lof(2),#2)
For i = 0 To Len(zeile1) - 1
zeile1[i] = zeile1[i] Xor zeile2[i]
'zeile1[i] = (zeile1[i] - zeile2[i]) And 255
Next
Print #3, zeile1;
Close
Shell "START Notepad.exe dectext.txt" |
Damit entspricht der decodierte Text wieder exakt dem Original. Für den Fall, daß du es doch lieber mit der Additions-/Subtraktionsmethode versuchen möchtest, habe ich die entsprechenden Zeilen auskommentiert in den Quelltext geschrieben.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Input
Anmeldungsdatum: 28.07.2014 Beiträge: 59
|
Verfasst am: 04.10.2014, 11:40 Titel: |
|
|
Vielen Dank, läuft perfekt!!
Hab das jetzt so zusammengebastelt:
Code: |
randomize timer,3
dim as integer i,j
dim as string modus,pw,zeichen1,zeichen2,zeile1,zeile2
input "Passwort:",pw
if pw<>"grindstone" then end
input "1=Alles 2=Schreiben 3=Lesen:",modus
cls
if modus="1" or modus="2" then
open "Eingang.txt" for binary access read as #1
open "Code1.txt" for output as #2
open "Code2.txt" for output as #3
zeile1=input(Lof(1),#1)
for i=0 to len(zeile1)-1
j=int(rnd*255)+1
zeile1[i]=zeile1[i] xor j
print #3,chr(j);
next
print #2,zeile1;
close
end if
if modus="1" or modus="3" then
open "Code1.txt" for binary access read as #1
open "Code2.txt" for binary access read as #2
open "Ausgang.txt" for output as #3
zeile1=input(lof(1),#1)
zeile2=input(lof(2),#2)
for i=0 to len(zeile1)-1
zeile1[i]=zeile1[i] xor zeile2[i]
next
print #3,zeile1;
close
shell "START Notepad.exe Ausgang.txt"
end if
|
|
|
Nach oben |
|
|
Lothar Schirm
Anmeldungsdatum: 24.04.2006 Beiträge: 63 Wohnort: Bayern
|
Verfasst am: 04.10.2014, 15:14 Titel: |
|
|
Noch eine Bemerkung zu "randomize timer, 3": Dies erzeugt gemäß der Beschreibung in der FB Referenz eine Generierung der Zufallszahlen nach dem Mersenne-Twister-Algorithmus. Dieser ist gemäß der Wikipedia nicht für kryptografische Anwendungen geeignet. Ich bin da kein Experte, aber ich würde "randomize timer, 5" verwenden, wenn ich den Text in der FB Referenz richtig verstehe. Ich glaube, was besseres hat FB nicht. |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4594 Wohnort: ~/
|
Verfasst am: 04.10.2014, 19:29 Titel: |
|
|
Ich würde zunächst einmal RANDOMIZE statt RANDOMIZE TIMER verwenden - letzteres ist nur sekundengenau und damit zumindest theoretisch leichter crackbar. Algorithmus 5 ist auf jedenfall empfehlenswert (ist Standard, die Angabe kann also weggelassen werden); im schlimmsten Fall ("echter" Zufallsspeicher ist leer) gibt es ein Fallback auf Algorithmus 3. Wenn es wirklich sicher sein soll, sollte man die Daten selbst aus den Benutzerdaten herausziehen (Mausbewegung o. ä.) bzw. die betriebssystem-eigenen Optionen nutzen.
Zitat: | Code: | (Asc(zeichen) + j) And 255 |
|
ist zwar nicht falsch, aber imho irreführend - ich würde da doch lieber MOD 256 verwenden.
edit: ach ja, Passwörter, die in Klartext im Quellcode festgelegt werden, sind über einen Hexeditor auslesbar. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1208 Wohnort: Ruhrpott
|
Verfasst am: 04.10.2014, 23:47 Titel: |
|
|
nemored hat Folgendes geschrieben: | Code:
(Asc(zeichen) + j) And 255
ist zwar nicht falsch, aber imho irreführend - ich würde da doch lieber MOD 256 verwenden. | Wieso irreführend? Es soll der Überlauf gelöscht werden, so daß immer nur die niederwertigsten 8 Bits übrigbleiben (Wrap around). Ich finde, da ist "And 255" einsichtiger als "Mod 256", auch wenn beides natürlich dasselbe Ergebnis liefert. Außerdem braucht "Mod" etwa 7mal so viel Zeit wie "And".
Zur Sicherheit:
Ich glaube, keinerlei Zufallszahlen, die mit "Rnd" generiert werden, sind wirklich für kryptographische Anwendungen geeignet, denn derselbe Startwert liefert immer dieselbe Zahlenreihe, auch bei Algorithmus 5. Wenn nur die kleine Schwester davon abgehalten werden soll, das Tagebuch zu lesen, reicht das natürlich, aber einem versierten Hackerangriff (zumal wenn der Quellcode des Verschlüsselungsprogramms offenliegt) dürfte diese Verschlüsselung wohl keine 2 Stunden standhalten.
Echte Zufallszahlen bekommt man beim PC am einfachsten von der Soundkarte: Aufnahmeprogramm (z.B. Audacity) starten, Mikrofoneingang (ohne angeschlossenes Mikrofon) auf volle Lautstärke, ausreichend lange Aufnahme machen, anschließend das Ganze ohne Gleichspannungsanteil auf volle Lautstärke normalisieren (ohne Übersteuerung) und als 8bit unsigned PCM im "RAW"-Format speichern. Diese Daten kann niemand reproduzieren.
@Input:
So wie ich dein Programm verstehe, hast du vor, Schlüssel und verschlüsselte Datei gemeinsam in einem Verzeichnis abzulegen und das Ganze mit einem Passwort zu "sichern", das im Klartext im Entschlüsselungsprogramm gespeichert ist. Das ist etwa so, als ob du in deine Wohnungstür das beste und teuerste Sicherheitsschloss einbaust und dann den Schlüssel unter die Fußmatte legst.
Sicherer wäre es, wenn du aus dem Passwort einen Startwert für die "Randomize"-Funktion generierst, etwa so: Code: | Dim As Double ri
Input "Passwort: ",pw
ri = 0
For x As Integer = 0 To Len(pw) - 1
ri += pw[x]
Next
Randomize ri |
Dann bräuchtest du die Zahlenfolge auch nicht in einer Datei zu speichern, sondern könntest sie bei jedem Programmdurchlauf (egal, ob beim Ver- oder Entschlüsseln) neu generieren, und im Programm wäre keinerlei Hinweis auf das Passwort zu finden.
Und wenn du es ganz sicher haben willst, kannst du auch beide Verfahren kombinieren: eine nach obiger Anleitung erzeugte Schlüsseldatei aus echten Zufallszahlen, die du dann ihrerseits noch einmal mit einer passwortgenerierten Zahlenreihe verschlüsselst. Daran dürften dann auch Profis eine Weile zu knacken haben.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4594 Wohnort: ~/
|
Verfasst am: 05.10.2014, 00:59 Titel: |
|
|
Zitat: | Ich finde, da ist "And 255" einsichtiger als "Mod 256", auch wenn beides natürlich dasselbe Ergebnis liefert. |
Das Problem ist: es funktioniert nur für Zweierpotenzen. Sobald man einen Zahlenbereich z. B. auf Werte von 0 bis 99 einschränken will und sich erinnert "da war doch was mit AND", hat man ein Problem. Daher bevorzuge ich bei Hilfestellungen die Version, die unabhängig vom Zahlenbereich funktioniert, selbst wenn sie langsamer ist.
edit: Soweit ich mich da eingelesen habe, liefert der Mersenne-Twister-Algorithmus, soweit der Seed nicht mehr rekonstruierbar ist (!), mindestens für 255 Werte ein sicheres Verfahren; danach müsste ein neuer Seed gesetzt werden. Genau das sollte Algorithmus 5 aber meines Wissens machen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Input
Anmeldungsdatum: 28.07.2014 Beiträge: 59
|
Verfasst am: 05.10.2014, 03:56 Titel: |
|
|
Vielen Dank für eure Informationen; da hab ich mir ja was eingebrockt!! |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1208 Wohnort: Ruhrpott
|
Verfasst am: 05.10.2014, 05:54 Titel: |
|
|
Input hat Folgendes geschrieben: | da hab ich mir ja was eingebrockt!! | Und dabei haben wir gerade mal an der Oberfläche gekratzt.
nemored hat Folgendes geschrieben: | es funktioniert nur für Zweierpotenzen | Der ASCII-Wertebereich ist ja eine Zweierpotenz. Aber im Prinzip hast du natürlich Recht.
nemored hat Folgendes geschrieben: | ...Genau das sollte Algorithmus 5 aber meines Wissens machen. | Tut er aber nicht. Ich habe es ausprobiert: Code: | Dim As Integer k
Randomize 10,5
For x As Integer = 1 To 254 : k = Rnd : Next
For x As Integer = 1 To 5 : Print Rnd : Next
Print
Randomize 10,5
For x As Integer = 1 To 254 : k = Rnd : Next
For x As Integer = 1 To 5 : Print Rnd : Next
Sleep | Der zweite Durchgang liefert dieselben Werte wie der erste.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4594 Wohnort: ~/
|
Verfasst am: 05.10.2014, 13:51 Titel: |
|
|
Das wundert mich, ich erhalte mit deinem Code verschiedene Ergebnisse, z. B.:
Code: | 0.2033441714011133
0.4436484766192734
0.02294423687271774
0.5118130182381719
0.857510129455477
0.1770857772789896
0.3928523366339505
0.5827678116038442
0.4817796968854964
0.313932279124856 |
(im übrigen auch nicht erst nach 256 Einträgen, sondern von Anfang an)
fbc 0.90.1, Windows (Linux teste ich heute abend)
Außerdem Fehler meinerseits - Algorithmus 5 ist doch nicht Standard, was wohl auch gut ist, da es sonst den manuellen Seed kaputt machen würde. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Lothar Schirm
Anmeldungsdatum: 24.04.2006 Beiträge: 63 Wohnort: Bayern
|
Verfasst am: 05.10.2014, 17:48 Titel: |
|
|
Grindstones Vorschlag, aus dem Passwort einen Startwert für den Zufallsgenerator zu erzeugen, ist zwar wohl das gängige Verfahren, ist aber natürlich bei der Verwendung von Algorithmus 5 ein Problem, da man dann doch die zum Verschlüsseln erzeugte Zahlenfolge irgendwo abspeichern muss. Denn da der Algorithmus 5 alle 256(?) Aufrufe von RND einen neuen Startwert erzeugt, kann man mit dem gleichen Aufruf des Passwortes zum Zwecke der Entschlüsselung nicht wieder die gleiche Zufallszahlenfolge erzeugen. Siehe obiges Beispiel.
Und wenn man ein sicheres Passwort erzeugen will, kann man die Zeichen eines Passwortes natürlich auch per Zufallsgenerator erzeugen, je länger desto besser (wie merken? Auf separatem USB Stick abspeichern? Oder zwei Passwörter für zwei verschiedene Zufallsfolgen, die man wie oben vorgeschlagen verwendet ... ). Kurz, der Phantasie sind keine Grenzen gesetzt. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1208 Wohnort: Ruhrpott
|
Verfasst am: 06.10.2014, 00:45 Titel: |
|
|
nemored hat Folgendes geschrieben: | Das wundert mich, ich erhalte mit deinem Code verschiedene Ergebnisse | Sehr seltsam! Ich habe noch einmal alles überprüft: die Compiler-Version (0.90.1 (07-17-2013)) und auch, ob der Compilerpfad von fbEdit nicht versehentlich auf eine ältere Version zeigt. Alles korrekt. Trotzdem bekomme ich bei jedem Durchlauf die Werte Code: | 0.2444431262556464
0.2063331040553749
0.5678302538581193
0.9395216330885887
0.3705087632406503
0.2444431262556464
0.2063331040553749
0.5678302538581193
0.9395216330885887
0.3705087632406503
| Immer unterschiedliche Werte bekomme ich nur mit Algorithmus 4.
@Lothar Schirm:
Natürlich muß man einen Algorithmus wählen, der mit demselben Startwert auch jedesmal dieselbe Zahlenreihe liefert. Und wenn ich mein Passwort sowieso auf einem USB-Stick speichern muß, kann ich auch gleich ein One-Time-Pad verwenden.
Welchen Aufwand ich beim Verschlüsseln treibe, hängt natürlich auch davon ab, ob ich meine Daten vor der kleinen Schwester (s.o.) oder dem "großen Bruder" schützen möchte.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Input
Anmeldungsdatum: 28.07.2014 Beiträge: 59
|
Verfasst am: 11.10.2014, 10:59 Titel: |
|
|
Ich mach das mit dem Generator nun folgendermassen:
Code: |
open "Text.txt" for binary access read as #1
zeile=input(lof(1),1)
for i=0 to len(zeile)
n+=asc(mid(zeile,i,1))
next
close
randomize sqr(n),5 |
|
|
Nach oben |
|
|
Lothar Schirm
Anmeldungsdatum: 24.04.2006 Beiträge: 63 Wohnort: Bayern
|
Verfasst am: 11.10.2014, 11:14 Titel: |
|
|
Sieht gut aus. Im FreBasic-Portal gibt es unter "Codebeispiele" noch weitere Verschlüsselungsmethoden, falls es dich interessiert, aber da hast du wahrscheinlich schon mal reingeschaut. Aber wenn du nur was einfaches brauchst, reicht deine Methode sicher aus. Ich habe mir mal was mit zwei Passwörtern gebastelt, d.h. es werden zwei Zufallsfolgen (mit Algorithmus 3) erzeugt, mit denen der Text byteweise zweimal XOR verknüft wird.
Kennst du Window9, eine super GUI-Bibliothekt für Windows? Sehr einfach zu handhaben, gut dokumentiert, auf freebasic.net/forum/projects. Dort ist auch die AES-Verschlüsselung in nicht zu überbietender Einfachheit implementiert. |
|
Nach oben |
|
|
Input
Anmeldungsdatum: 28.07.2014 Beiträge: 59
|
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1208 Wohnort: Ruhrpott
|
Verfasst am: 12.10.2014, 07:31 Titel: |
|
|
@Input:
Einen kleinen Schönheitsfehler hat dein Generator, obwohl es in diesem Fall keine Auswirkungen hat: Wenn du "Mid" verwendest, muß der Index von 1 bis Len(zeile) laufen ("Mid" mit 0 als zweitem Parameter liefert immer einen Leerstring zurück, der entsprechende Asc-Wert ist 0), bei indiziertem Zugriff von 0 bis Len(zeile) - 1.
Die For-Schleife muß also entweder Code: | For i = 1 To Len(zeile)
n += Asc(Mid(zeile,i,1))
Next | oder (deutlich schneller) Code: | For i = 0 To Len(zeile) - 1
n += zeile[i]
Next | lauten.
Statt
Code: | Asc(Mid(zeile,i,1)) | kannst du übrigens auchschreiben.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Input
Anmeldungsdatum: 28.07.2014 Beiträge: 59
|
Verfasst am: 12.10.2014, 10:52 Titel: |
|
|
Danke für den "Input". |
|
Nach oben |
|
|
Flo aka kleiner_hacker
Anmeldungsdatum: 23.06.2006 Beiträge: 1210
|
Verfasst am: 16.10.2014, 08:38 Titel: |
|
|
nemored hat Folgendes geschrieben: | Daher bevorzuge ich bei Hilfestellungen die Version, die unabhängig vom Zahlenbereich funktioniert, selbst wenn sie langsamer ist. |
Premature optimisation is the root of all evil! Wirklich, schreibt lesbaren code und nicht schnellen code. Schnell machen kann euer Compiler eh viel besser als ihr _________________ MFG
Flo
Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.
zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich. |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 16.10.2014, 12:29 Titel: |
|
|
Zumal ein guter Compiler Modulo sowieso (soweit möglich) durch And ersetzt. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|