Forum | | | | Dirk Kuntzmann | Hallo Profaner,
ich habe heute begonnen ein Progrann weiter zu schreiben, dass ich 2005 begonnen hatte (vermutlich Profan9). Damals lief das Programm einwandfrei. Heute gibt es anscheinend ein Problem mit der Password-Funktion wobei ich nicht glaube das der Fehler im Programm liegt, da dies bereits einwandfrei gearbeitet hat. Getestet habe ich es heute unter Windows2000 und Windows XP. Es geht hier um die Verschlüsselung / Entschlüsselung von dBase-Tabellen. Folgender Programmausschnitt sollte das Problem zeigen: KompilierenMarkierenSeparierendeclare schrift%,feld$[5],datei$
DECLARE TEXT4&
proc testdateien_erstellen
assign #1,artikel.str
rewrite #1
print #1,ARTIKEL;C;50;0
print #1,GRUPPE;C;50;0
print #1,KCAL;C;5;0
print #1,PORTION;C;3;0
close #1
sleep 500
db(create,artikel.str,test.dbf)
if datei$=test.dbf
dbopen(#1,datei$)
db(go,|<)
whilenot &dbRecNo=6
db(appendblank)
dbput(ARTIKEL,Name)
dbput(GRUPPE,Gruppe)
dbput(KCAL,500)
dbput(PORTION,100)
dbputrec(0)
endwhile
dbgo(5)
else
dbopen(#1,datei$)
dbgo(5)
endif
settext text4&,trim$(dbget$(ARTIKEL))
dbclose(#1)
copy test.dbf > test1.dbf
datei$=test1.dbf
endproc
proc rueckschluesseln
DECLARE DLG&,DIALOGENDE%
DECLARE TEXT1&,TEXT7&
DECLARE TEXT2&,Text8&
DECLARE TEXT3&
DECLARE EDIT1&
DECLARE TEXT5&,text6&
DECLARE BUTTON1&,Button3&
DECLARE BUTTON2&
DLG&=CREATE(DIALOG,%HWND,Datenbank rückschlüsseln,351,293,292,213)
TEXT7& =@CREATE(TEXT,DLG&,Quelle/Ziel:,0010,0010,0100,0020)
TEXT1& =@CREATE(TEXT,DLG&,Daten vorher:,0010,0040,0100,0020)
TEXT2& =@CREATE(TEXT,DLG&,Schlüssel:,0010,0070,0100,0020)
TEXT3& =@CREATE(TEXT,DLG&,Daten nachher:,0010,0120,0100,0020)
TEXT4& =@CREATE(TEXT,DLG&,,0115,0040,0150,0020)
EDIT1& =@CREATE(EDIT,DLG&,,0115,0070,0150,0020)
TEXT5& =@CREATE(TEXT,DLG&,,0115,0120,0150,0020)
TEXT8& =@CREATE(TEXT,DLG&,,0010,0125,0150,0020)
text6& =@CREATE(TEXT,DLG&,1. mit Reg-Code;2. mit 12345,0115,0090,0150,0020)
BUTTON3& =@CREATE(BUTTON,DLG&,>,0110,0010,0020,0024)
BUTTON1& =@CREATE(BUTTON,DLG&,OK,0010,0150,0070,0024)
BUTTON2& =@CREATE(BUTTON,DLG&,Abbruch,0100,0150,0070,0024)
SETFOCUS(edit1&)
LET DIALOGENDE%=0
WHILENOT DIALOGENDE%
WAITINPUT
If @EQU(%KEY,2)
LET DIALOGENDE%= 1
ELSEIF clicked(BUTTON1&) BUTTON
if trim$(gettext$(edit1&))=
setfocus(edit1&)
else
dbopen(#1,datei$)
dbgo(|<)
whilenot %dbeof
clear feld$[]
PASSWORD trim$(gettext$(edit1&))
feld$[1]=pwd$(trim$(dbget$(ARTIKEL)))
feld$[2]=pwd$(trim$(dbget$(GRUPPE)))
feld$[3]=pwd$(trim$(dbget$(KCAL)))
feld$[4]=pwd$(trim$(dbget$(PORTION)))
password
dbput(ARTIKEL,pwd$(feld$[1]))
dbput(GRUPPE,pwd$(feld$[2]))
dbput(KCAL,pwd$(feld$[3]))
dbput(PORTION,pwd$(feld$[4]))
dbputrec(0)
dbgo(>)
wend
dbclose(#1)
sleep 500
dbopen(#1,datei$)
dbgo(5)
settext text5&,trim$(dbget$(ARTIKEL))
dbclose(#1)
settext edit1&,
endif
ELSEIF clicked(BUTTON3&) BUTTON
datei$=LoadFile$(Umschlüsseln von:,Test*.dbf)
if datei$=test.dbf
dbopen(#1,datei$)
db(go,|<)
whilenot &dbRecNo=6
db(appendblank)
dbput(ARTIKEL,Name)
dbput(GRUPPE,Gruppe)
dbput(KCAL,500)
dbput(PORTION,100)
dbputrec(0)
endwhile
dbgo(5)
else
dbopen(#1,datei$)
dbgo(5)
endif
settext text4&,trim$(dbget$(ARTIKEL))
dbclose(#1)
ELSEIF clicked(BUTTON2&) BUTTON
LET DIALOGENDE%= 1
ENDIF
WEND
@DESTROYWINDOW(DLG&)
endproc
cls RGB(23,23,23)
traceon
showmax
let schrift%=create(font,Comic sans MS,16,0,0,0,0)
SETDIALOGFONT schrift%
datei$=test.dbf
testdateien_erstellen
rueckschluesseln
end
Ich hoffe, ich habe die einzelenen Ausschnitte richtig zusammen gestrickt. Nach dem Start werden Testdateien erstellt. Dann erscheint ein Dialog. Bei klick auf den Pfeil erscheint eine Dateiauswahl. Bitte die Test.dbf wählen. Dann wird im Dialog ein Datenfeld angezeigt (unverschlüsselt Name). Jetzt kann ein Schlüssel eingegeben werden z. B. 1. Nach der Bestätigung mit OK werden die Datensätze verschlüsselt und das gleiche Feld wieder angezeigt. Gibt man jetzt wieder als Schlüssel eine 1 ein, müsste die Verschlüsselung rückgängig gemacht werden. Leider fehlt der erste Buchstabe. Gleiches passiert bei der Eingabe eines einzelnen a. Gibt man z. B. 12345 ein arbeitet alles korrekt. Bei abc aber nicht. Hier ist eine entschlüsselung gar nicht möglich. Da in der Hilfe auch keine Einschränkungen gemacht werden wie ein Password aussehen soll und ich glaube, dass das schon einmal funktioniert hat, denke ich fast, das es sich um ein Problem für Roland handelt. Aber vielleicht übersehe ich auch nur etwas. Für einen Tipp wäre ich dankbar.
Gruß Dirk |
| | | | |
| | Michael Wodrich | Testdateien_erstellen greift auf ein Dialogfeld zu, daß erst in der folgenden Prozedur erstellt wird. Ich nehme an, dass Du diesen Codeschnipsel nicht getestet hast.
2 Tipps: a) sende einen funktionierenden Code (Button 1 entschlüsselt den Detenbankinhalt, der aber nirgendwo verschlüsselt wird) b) speichere die Umsetzungen/Funktionsergebnisse in einer Variablen und benutze ausschließlich diese Variable hinter PASSWORD. So kannst Du das, was an Password übergeben wird vorher zur Prüfung anzeigen lassen. Es ist auch möglich, das PASSWORD hier etwas sensibel reagiert, was die Länge des Passwortes angeht. Man sollte grundsätzlich keine Passworte benutzen die kürzer als 8 Zeichen sind. Die 4stelligen Pins der Banken sind ein Sicherheits-Traumschloss. Diesen 4-Zahlen-Code kann man mit einer hohen Trefferquote sogar erraten.
Lass einfach den Computer mal eine 4stellige Zahl ermitteln und versuche 100x sie zu erraten. Die Anzahl der Treffer sagt Dir die prozentuale Trefferquote. Du wirst staunen.
Schöne Grüße Michael Wodrich
Nachtrag: Mir ist erst jetzt aufgefallen, das Du mit gesetztem PASSWORD die Datenbankinhalte entschlüsselst um sie dann mit gelöschtem wieder durch die Schlüsselfunktion zu schicken. Besser ist es wenn Du die Datei unverschlüsselt dann ohne PWD$() speicherst und für das Verschlüsseln eine eigene Routine schreibst. In der von Dir angegebenen Form funktionieren beide Richtungen nicht. |
| | | Programmieren, das spannendste Detektivspiel der Welt. | 27.07.2007 ▲ |
| |
| | Michael Wodrich | AUTSCH
Der Fehler liegt ganz einfach in der TRIM$()-Funktion. Sie entfernt auch Steuerzeichen, die im PWD-String aber vorkommen.
Das ist in der Hilfe bei Trim$ eindeutig anders beschrieben !!!
Hier der Testcode: KompilierenMarkierenSeparierendeclare schrift%,feld$[5],datei$
DECLARE TEXT4&
proc testdateien_erstellen
assign #1,artikel.str
rewrite #1
print #1,ARTIKEL;C;50;0
print #1,GRUPPE;C;50;0
print #1,KCAL;C;5;0
print #1,PORTION;C;3;0
close #1
sleep 500
db(create,artikel.str,test.dbf)
if datei$=test.dbf
dbopen(#1,datei$)
db(go,|<)
whilenot &dbRecNo=6
db(appendblank)
dbput(ARTIKEL,Name)
dbput(GRUPPE,Gruppe)
dbput(KCAL,500)
dbput(PORTION,100)
dbputrec(0)
endwhile
dbgo(5)
else
dbopen(#1,datei$)
dbgo(5)
endif
settext text4&,trim$(dbget$(ARTIKEL))
dbclose(#1)
copy test.dbf > test1.dbf
datei$=test1.dbf
endproc
proc rueckschluesseln
DECLARE DLG&,DIALOGENDE%
DECLARE TEXT1&,TEXT7&
DECLARE TEXT2&,Text8&
DECLARE TEXT3&
DECLARE EDIT1&
DECLARE TEXT5&,text6&
DECLARE BUTTON1&,Button3&
DECLARE BUTTON2&
DLG&=CREATE(DIALOG,%HWND,Datenbank rückschlüsseln,351,293,292,213)
TEXT7& =@CREATE(TEXT,DLG&,Quelle/Ziel:,0010,0010,0100,0020)
TEXT1& =@CREATE(TEXT,DLG&,Daten vorher:,0010,0040,0100,0020)
TEXT2& =@CREATE(TEXT,DLG&,Schlüssel:,0010,0070,0100,0020)
TEXT3& =@CREATE(TEXT,DLG&,Daten nachher:,0010,0120,0100,0020)
TEXT4& =@CREATE(TEXT,DLG&,,0115,0040,0150,0020)
EDIT1& =@CREATE(EDIT,DLG&,,0115,0070,0150,0020)
TEXT5& =@CREATE(TEXT,DLG&,,0115,0120,0150,0020)
TEXT8& =@CREATE(TEXT,DLG&,,0010,0125,0150,0020)
text6& =@CREATE(TEXT,DLG&,1. mit Reg-Code;2. mit 12345,0115,0090,0150,0020)
BUTTON3& =@CREATE(BUTTON,DLG&,>,0110,0010,0020,0024)
BUTTON1& =@CREATE(BUTTON,DLG&,OK,0010,0150,0070,0024)
BUTTON2& =@CREATE(BUTTON,DLG&,Abbruch,0100,0150,0070,0024)
SETFOCUS(edit1&)
LET DIALOGENDE%=0
WHILENOT DIALOGENDE%
WAITINPUT
If @EQU(%KEY,2)
LET DIALOGENDE%= 1
ELSEIF clicked(BUTTON1&)BUTTON
if trim$(gettext$(edit1&))=
setfocus(edit1&)
else
dbopen(#1,datei$)
dbgo(|<)
whilenot %dbeof
clear feld$[]
PASSWORD trim$(gettext$(edit1&))
feld$[1]=pwd$(trim$(dbget$(ARTIKEL)))
--- debug-code -------
whileloop len(feld$[1])
print format$(#0,ord(mid$(feld$[1],&loop,1)));,;
endwhile
print len=,format$(#0,len(feld$[1]))
feld$[1] = trim$(feld$[1])
whileloop len(feld$[1])
print format$(#0,ord(mid$(feld$[1],&loop,1)));,;
endwhile
print len=,format$(#0,len(feld$[1]))
--- debug-code ENDE-------
feld$[2]=pwd$(trim$(dbget$(GRUPPE)))
feld$[3]=pwd$(trim$(dbget$(KCAL)))
feld$[4]=pwd$(trim$(dbget$(PORTION)))
dbput(ARTIKEL,feld$[1])
dbput(GRUPPE,feld$[2])
dbput(KCAL,feld$[3])
dbput(PORTION,feld$[4])
dbputrec(0)
dbgo(>)
wend
dbclose(#1)
sleep 500
dbopen(#1,datei$)
dbgo(5)
settext text5&,trim$(dbget$(ARTIKEL))
dbclose(#1)
settext edit1&,
endif
ELSEIF clicked(BUTTON3&)BUTTON
datei$=LoadFile$(Umschlüsseln von:,Test*.dbf)
if datei$=test.dbf
dbopen(#1,datei$)
db(go,|<)
whilenot &dbRecNo=6
db(appendblank)
dbput(ARTIKEL,Name)
dbput(GRUPPE,Gruppe)
dbput(KCAL,500)
dbput(PORTION,100)
dbputrec(0)
endwhile
dbgo(5)
else
dbopen(#1,datei$)
dbgo(5)
endif
settext text4&,trim$(dbget$(ARTIKEL))
dbclose(#1)
ELSEIF clicked(BUTTON2&)BUTTON
LET DIALOGENDE%= 1
ENDIF
WEND
@DESTROYWINDOW(DLG&)
endproc
cls RGB(23,23,23)
traceon
showmax
let schrift%=create(font,Comic sans MS,16,0,0,0,0)
SETDIALOGFONT schrift%
datei$=test.dbf
testdateien_erstellen
rueckschluesseln
end
Schöne Grüße Michael Wodrich |
| | | Programmieren, das spannendste Detektivspiel der Welt. | 27.07.2007 ▲ |
| |
| | Dirk Kuntzmann | Hallo Michael,
vielen Dank für deine schnelle Antwort. An die Trim-Funktion hatte ich nicht gedacht. Bleibt die Frage ob das so richtig und gewollt ist oder ob es sich hierbei um einen kleinen Fehler handelt. Ich bin nämlich fest der Meinung, dass dieser Teil früher funktioniert hat.
Mit der Sicherheit der Passwörter hast du natürlich recht, die sind normalerweise auch länger, ich habe jetzt nur kurze gewählt, um das Problem zu verdeutlichen. Z. B. abc schneidet den ersten Buchstaben beim Entschlüsseln ab, während cba funktioniert. A0E96519 wiederum lässt sich überhaupt nicht mehr entschlüsseln. Da die Passwörter aber von jedem Computer anders zusammen gesetzt werden habe ich keinen Einfluss darauf welcher Buchstabe oder welche Zahl wo in dem Passwort auftaucht.
Es gibt somit vermutlich nur zwei Möglichkeiten: 1. Ich warte auf eine trim-Funktion die nichts wegschneidet oder ich versuche das Programm so zu verändern, dass bei allen Passwort-Funktionen die Trim-Funktion nicht genutzt und anders realisiert wird. Die erste Lösung finde ich aber deutlich angenehmer.
Gruß Dirk |
| | | | |
| | Dieter Zornow | | | | Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2 | 27.07.2007 ▲ |
| |
| | Dirk Kuntzmann | Hallo Dieter,
Vielen Dank, von Apis habe ich leider keine Ahnung, aber das was du da gezaubert hat schein super zu funktionieren. Bleibt die Frage, ob die Profan eigene trim-Funktion nun einen Fehler hat oder ob sich dahinter ein Sinn verbirgt.
Gruß Dirk |
| | | | |
| | Dirk Kuntzmann | P.S. Während man die normale Trim-Funktion von der Geschwindigkeit her kaum wahrnimmt, ist die Api-Variant sehr langsam (bei nur knapp 600 Datensätzen hat man das Gefühl, dass der Rechner stehen geblieben ist).
Gruß Dirk |
| | | | |
| | Jörg Sellmeyer | | | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 27.07.2007 ▲ |
| |
| | | 10.000 derartige Operationen benötigen bei mir 750ms
Zu testen über KompilierenMarkierenSeparieren Dieser Code hier hingegen benötigt lediglich 500ms: KompilierenMarkierenSeparieren und sollte imho auch klappen, denn Ihr braucht garnicht nochmals Speicher reservieren wenn Ihr doch schon genügend Speicher habt. (denn Trim wird den String kaum vergrößern) |
| | | | |
|
AntwortenThemenoptionen | 1.852 Betrachtungen |
ThemeninformationenDieses Thema hat 5 Teilnehmer: |