Verschlüsselungs Problem[Gelöst]

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Sephka

Betreff: Verschlüsselungs Problem[Gelöst]

BeitragFr, Jul 30, 2010 20:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe ein einfaches Verschlüsselungspogramm geschrieben(dass ver- und entschlüsselt) ,aber sobald man mehr als ein zeichen eingibt scheint es in einer undendlichen Schleife aufzuhängen.
Code: [AUSKLAPPEN]
Graphics 600,600,16,2
Global code$,code2$,txt$,i%,decryp$


eingabe$ = Input("Dein Text")
Cls
Print "Vorher: " + eingabe$
cryp(eingabe$)
Print "Nachher: " + code$
decryp(code$)
Print decryp$
Function cryp(txt$)
For i=1 To Len(txt$)
code$ = code$ + Hex(Asc(Mid(txt$,i%,1)))
code$ = Replace$ (code$, "0","")
code$ = Trim(code$)
Next
End Function

Function Decryp(code$)
For i=1 To Len(code$)
decryp$ = decryp$ + Chr(HexToInt(Mid(code$,i%,2)))
Next
End Function

Function HexToInt(Hexzahl$)
   If Left$(Hexzahl$,1)="$" Then Hexzahl$=Mid$(Hexzahl$,2)
   For i=1 To Len(Hexzahl$)
     tmp1$=Upper$(Mid$(Hexzahl$,i,1)):tmp2=tmp1$
     If tmp2=0 And tmp1$<>"0" Then tmp2=Asc(tmp1$)-55
     Integer_Result=Integer_Result*16:Integer_Result=Integer_Result+tmp2
   Next
   Return Integer_Result
End Function

Was tun?
  • Zuletzt bearbeitet von Sephka am Mi, Aug 04, 2010 18:34, insgesamt einmal bearbeitet

Thunder

BeitragFr, Jul 30, 2010 20:44
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Debuggen. Setze Debuglogs die dir temporäre Daten ausgeben und du bekommst es heraus.
2. ist das kein umkehrbares Verschlüsselungsverfahren.
3. Das Problem ist: i ist global und wird von zwei Funktionen, von der die eine die andere aufruft in Schleifen verwendet -> das kann nicht gut gehen Wink

mfg Thunder
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Xeres

Moderator

BeitragFr, Jul 30, 2010 20:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Debuggen. DebugLog, Stop.
Lass dir alles wichtige ausgeben, welche Funktion, welcher Schleifendurchlauf usw.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Sephka

BeitragSa, Jul 31, 2010 12:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Es hängt nicht mehr aber warum ist es nicht unmkehrbar?

Thunder

BeitragSa, Jul 31, 2010 12:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Weil die Hexadezimale Schreibweise auch die 0 verwendet und ein Stellenwertsystem ist. Ich nehme an, du wolltest nur die Nullen am Beginn entfernen, was ja richtig ist. Dazu darf man aber keines Falls Replace verwenden.

Code: [AUSKLAPPEN]
P = 50 (Hex) -> Entfernung von 0 -> 5
Chr(5) != P


mfg Thunder
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Sephka

BeitragSa, Jul 31, 2010 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry das versteh ich nicht ganz könntest du es bitte erklärn Embarassed

Thunder

BeitragSa, Jul 31, 2010 18:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, du wandelst ja jedes Zeichen des Textes zu Hexadezimal um und hängst es an einen String.
Angenommen der Text ist "APFEL": dann kommt der String "41546454C" heraus. Aus dem "P" würde 50, allerdings ersetzt du jede 0 durch "" und ab diesem Moment ist es nicht mehr eindeutig umkehrbar:
eine Umkehrung würde den String "ATdT"+Chr(12) erzeugen.
Ich hoffe das war verständlicher.

mfg Thunder
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Sephka

BeitragSa, Jul 31, 2010 18:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke ich habs verstanden.Jetzt krieg ich nicht raus wie ich nur die ersten Nullen entfernern kann :\
Ich habs jetzt so
Code: [AUSKLAPPEN]
Graphics 600,600,16,2
Global code$,code2$,txt$,i%,e%,decryp$,teil$


eingabe$ = Input("Dein Text")
Cls
Print "Vorher: " + eingabe$
cryp(eingabe$)
Print "Nachher: " + code$
decryp(code$)
Print decryp$
Function cryp(txt$)
For i=1 To Len(txt$)
teil = Hex(Asc(Mid(txt$,i%,1)))
teil = Mid(teil,7,-1)

code$ = code$ + teil
Next
End Function

Function Decryp(code$)
For i=1 To Len(code$)
decryp$ = decryp$ + Chr(HexToInt(Mid(code$,i%,2)))
Next
End Function

Function HexToInt(Hexzahl$)
   If Left$(Hexzahl$,1)="$" Then Hexzahl$=Mid$(Hexzahl$,2)
   For e=1 To Len(Hexzahl$)
     tmp1$=Upper$(Mid$(Hexzahl$,e,1)):tmp2=tmp1$
     If tmp2=0 And tmp1$<>"0" Then tmp2=Asc(tmp1$)-55
     Integer_Result=Integer_Result*16:Integer_Result=Integer_Result+tmp2
   Next
   Return Integer_Result
End Function

Aber es klappt immer noch nicht

Xeres

Moderator

BeitragSa, Jul 31, 2010 18:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Könnte man so lösen:
BlitzBasic: [AUSKLAPPEN]
Local test$="000100203000"
Print(CutZeros(test))
WaitKey()

Function CutZeros$(txt$)
If Left(txt,1)="0" Then ; Erkennen, ob die erste Stelle ein Null ist.
Local l%=Len(txt$) ; Wenn ja, die länge des Strings nehmen...
txt$= Right(txt$,l-1) ; ...und alles außer der ersten stelle verwenden
txt$=CutZeros(txt$) ; Das selbe für die Nächste(n) Stelle(n) machen!
EndIf
Return txt
End Function
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Sephka

BeitragSa, Jul 31, 2010 18:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Ne klappt iwie nicht

Xeres

Moderator

BeitragSa, Jul 31, 2010 18:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Fehler liegt da:
BlitzBasic: [AUSKLAPPEN]
Function Decryp(code$)
For i=1 To Len(code$) Step 2
Decrypv$ = Decrypv$ + Chr(HexToInt(Mid(code$,i%,2)))
Next
End Function

Ohne Step 2 verarbeitest du je ein Zeichen von den Zwei Doppelt.

Edit: D.H. du musst auch darauf achten, das der Code immer eine Gerade Anzahl Zeichen hat - sonst kann es zu Fehlern kommen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Sephka

BeitragSa, Jul 31, 2010 19:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
Graphics 600,600,16,2
Global code$,code2$,txxt$,i%,e%,decryp$,teil$


eingabe$ = Input("Dein Text")
Cls
Print "Vorher: " + eingabe$
cryp(eingabe$)
Print "Nachher: " + code$
decryp(code$)
Print decryp$
Function cryp(txt$)
For i=1 To Len(txt$)
teil = Hex(Asc(Mid(txt$,i%,1)))
teil = Mid(teil,7,-1)
code$ = code$ + teil
Next
End Function

Function Decryp(code$)
For i=1 To Len(code$) Step 2
decryp$ = decryp$ + Chr(HexToInt(Mid(code$,i%,2)))
Next
End Function

Function HexToInt(Hexzahl$)
   If Left$(Hexzahl$,1)="$" Then Hexzahl$=Mid$(Hexzahl$,2)
   For e=1 To Len(Hexzahl$)
     tmp1$=Upper$(Mid$(Hexzahl$,e,1)):tmp2=tmp1$
     If tmp2=0 And tmp1$<>"0" Then tmp2=Asc(tmp1$)-55
     Integer_Result=Integer_Result*16:Integer_Result=Integer_Result+tmp2
   Next
   Return Integer_Result
End Function


Habs jetzt so gelöst ,Danke

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group