Kein richtiger Verschlüßler

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
R4z0r1989
Beiträge: 521
Registriert: 12.06.2005 18:06
Kontaktdaten:

Kein richtiger Verschlüßler

Beitrag von R4z0r1989 »

Kann mir wer helfen und zwar will ich das Programm das ich optisch schon gemacht hab in so was ahnliches wie nen Verschlüßler verbaun.

Funktionieren soll es wie folgt: Wenn man nen Text verschlüßeln will:

a>n
b>o
c>p
d>q
e>r
f>s
g>t
h>u
i>v
j>w
k>x
l>y
m>z
n>a
o>b
p>c
q>d
r>e
s>f
t>g
u>h
v>i
w>j
x>k
y>l
z>m

Und beim entschlüsseln genau andersrum.

Code: Alles auswählen

; PureBasic Visual Designer v3.80 build 1249


;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Gadget_0
  #Gadget_1
  #Gadget_2
  #Gadget_3
  #Gadget_4
  #Gadget_5
  #Gadget_6
  #Gadget_7
  #Gadget_8
  #Gadget_9
EndEnumeration

;- Fonts
;
Global FontID1
FontID1 = LoadFont(1, "Arial Black", 16)



Procedure Open_Window_0()
  If OpenWindow(#Window_0, 216, 0, 600, 370,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "New window ( 0 )")
    If CreateGadgetList(WindowID())
      StringGadget(#Gadget_0, 10, 60, 580, 50, "")
      TextGadget(#Gadget_1, 10, 40, 300, 20, "Eingegebener Text als ASCII")
      TextGadget(#Gadget_2, 10, 110, 200, 20, "Ausgegebener Text als FTCII")
      StringGadget(#Gadget_3, 10, 130, 580, 50, "", #PB_String_ReadOnly)
      TextGadget(#Gadget_4, 10, 10, 410, 30, "Verschlüßler:")
      SetGadgetFont(#Gadget_4, FontID1)
      TextGadget(#Gadget_5, 10, 190, 160, 30, "Entschlüßler:")
      SetGadgetFont(#Gadget_5, FontID1)
      TextGadget(#Gadget_6, 10, 220, 160, 20, "Eingegebener Text als FTCII")
      StringGadget(#Gadget_7, 10, 240, 580, 50, "")
      TextGadget(#Gadget_8, 10, 290, 160, 20, "Ausgegebener Text als ASCII")
      StringGadget(#Gadget_9, 10, 310, 580, 50, "", #PB_String_ReadOnly)
      
    EndIf
  EndIf
EndProcedure

Open_WIndow_0()

Repeat
  EventID = WaitWindowEvent()

     Select EventID 
       Case #PB_Event_Gadget 
         Select EventGadgetID() 

;           Case #Gadget_0 :

            
         EndSelect 

     EndSelect  

     
     If EventID = #PB_Event_CloseWindow 
       Quit = 1 
     EndIf

Until Quit = 1

End
Danke für jede Hilfe!!!
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Das ist keine Verschlüsselung sondern eine Codierung. Nur so als Hinweis.
Bild
Kristel
Beiträge: 72
Registriert: 30.08.2004 00:17

Beitrag von Kristel »

2 Wörter: Vergiss es !

Dieses Verfahren ist leicht implementieren,
aber genau so leicht zu knacken. Man müsste
nur eine Häufigkeitsanalyse machen. Nimm
einfach einen anderen Algorithmus.

Wenn du es trotzdem so machen willst.
Dann schau hier.

@MVXA Du hast Recht. Eigentlich ist es keine Verschlüsselung, eher eine
Codierung. Oder eine Verschlüsselung die den Namen nicht verdient
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@Kristel:

wo ist das problem?

er hat nicht gesagt, dass er irgendwelche bankdaten verschlüsseln will.

er hat um hilfe bei der implementierung dieses uralten codierverfahrens gebeten.

und es ist nicht der Ceasar-Key, wie in dem Beispiel,
das beruht auf einer verschiebung, nicht auf durcheinanderwürfeln.

edit:
ich seh grad, ist doch nur ne verschiebung, sorry...
is ja earm...


@Badboy

die grunddaten würde ich in ein array packen, und den code z.b. in Data-zeilen.
Zuletzt geändert von Kaeru Gaman am 15.12.2005 20:30, insgesamt 1-mal geändert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
sen-me
Beiträge: 478
Registriert: 17.07.2005 16:02
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag von sen-me »

also bei richtigen verschlüsseln mach ich es immer so:
ich lese die bytes einer datei aus (natürlich leide ner größe limit) und geh nun jedes byte einzeln durch

davor wurde ein string als passwort angegeben
ich nehm mir nun jedne buchstaben dieses passwortes und wandel es in ein ASCII zahl um, und speicher die in eine DIM (array), die vorher mit len() des passwortes festgelegt wurde

nun nimmt er jeden byte (bei vershclüsslung) und zählt den ascii zahl dazu, und speichert das wieder
das macht er mit jedme byte (beim entschlüsseln tu ich es abziehn)

natürlich wird nicht imemr der selbe ASCII dazugezählt, sondern er macht es so
(nur beispiel)
A=31
B=10
E=24
R=27
passwort ist also ABER
nun habe ich 4 byte datei (lol)
23|6|135|24

beim vershclüsseln siehts nache rso aus
23+31|6+10|135+24|24+27
(wenns über 255 geht fängt er bei 1 ja wieder an oda so, jedenfalls ises egal, denn beim entschlüsseln gehts ja wieder zurück)

die methode ist relativ sicher, da nun A nicht den selben byte nun haben, d.h.
eine häufichkeitsanalyse wird nicht funktionieren, ich denke die einzige chance ist es nun, rauszufinden (was eigentlich schon ziemlich unmöglich ist) 1. wie lang das pw war
2. welche bytes dazugezählt wurden
3. was der einfachste teil dan wäre, sie wiede rin buchstaben zu machen

soviel zu meiner methode :D
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag von Thorsten1867 »

Hier zwei Prozeduren:

Code: Alles auswählen

Procedure.s  Encode(name$)
  Nr$ = ""
  name$ = UCase(name$)
  For b = 1 To Len(name$)
    ZC = Asc(Mid(name$,b,1))
    If ZC >= 65 And ZC <= 74
      Nr$ + Chr(ZC - 17)
    ElseIf ZC >74 And ZC <= 90
      Nr$ + Chr(ZC - 10) 
    ElseIf ZC = 32
      Nr$ + "-"
    Else
      Nr$ + Chr(ZC) 
    EndIf 
  Next b
  ProcedureReturn Nr$
EndProcedure

Code: Alles auswählen

Procedure.s  Decode(Nr$)
  name$ = ""
  For b = 1 To Len(Nr$)
    ZC = Asc(Mid(Nr$,b,1))
    If ZC >= 48 And ZC <= 57
      name$ + Chr(ZC + 17)
    ElseIf ZC >65 And ZC <= 81
      name$ + Chr(ZC + 10) 
    ElseIf ZC = 45
      name$ + " "
    Else
      name$ + Chr(ZC) 
    EndIf 
  Next b
  ProcedureReturn name$
EndProcedure
Die richtige Verschiebung musst du selbst anpassen (hier um: 10 bzw. 17). Die IF-Abfrage dient dazu, dass die Zeichen zwischen Buchstaben und Zahlen in der ASCII-Tabelle übersprungen werden.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Nennt man Rot13 , im Codearchiv gibt es das hier :
http://www.purearea.net/pb/CodeArchiv/E ... ryption.pb
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Rot13 ist ein Spezialfall der obrigen Verschlüsselung/Codierung.

Man kann da nämlich die Verschlüsslungsroutine auch zum Entschlüsseln benutzen, sofern man nur 26 Zeichen verwendet (A-Z).
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Vielleicht geht es dem BadBoy ja nicht darum, das genialste Verschlüsselungsverfahren der Welt zu machen, sondern schlicht und einfach nur darum, Programmieren zu lernen, und da er diese eigentlich nicht allzu schwere Aufgabe nicht hinkriegt, wäre es doch sinnvoller, es ihm einfach zu erklären statt nur darüber zu diskutieren ob das Verfahren was taugt. Ihr wißt ja noch nicht mal, wofür er es überhaupt benötigt.

Also ich würde auf jeden Fall noch einen Button dazumachen, der praktisch dafür zuständig ist, die Ver- / Entschlüsselung auszuführen. Dieser ruft dann eine Funktion auf, die z.B. so aussehen kann:

EDIT: Okay, hatte die Prozeduren von Thorsten nicht gesehen, die sind besser als meine, aber zwecks Vollständigkeit laß ich meinen Code einfach drin

Code: Alles auswählen

Procedure.s Encode(text$)
  text$ = LCase(text$)
  For i = 1 to Len(text$)
    zeichen = Asc(Mid(text$,i,1))+13
    If zeichen > 122
      zeichen = zeichen - 26
    EndIf
    neu$ = neu$ + Chr(zeichen)
  Next i

  ProcedureReturn neu$
EndProcedure
Die Entschlüsselung sieht fast gleich aus:

Code: Alles auswählen

Procedure.s Decode(text$)
  text$ = LCase(text$)
  For i = 1 to Len(text$)
    zeichen = Asc(Mid(text$,i,1))-13
    If zeichen < 97
      zeichen = zeichen + 26
    EndIf
    neu$ = neu$ + Chr(zeichen)
  Next i

  ProcedureReturn neu$
EndProcedure
Das ist jetzt nur 'ne ganz simple Implementierung und wandelt alle Großbuchstaben in kleine um (durch LCase). Mit ein paar geschickten If-Abfragen kannst Du es aber auch so umbauen, daß es mit großen ebenfalls funktioniert ;)

Ach ja, ich habs nicht getestet, sollte aber funktionieren... wenn nicht, sag bescheid...
Benutzeravatar
R4z0r1989
Beiträge: 521
Registriert: 12.06.2005 18:06
Kontaktdaten:

Beitrag von R4z0r1989 »

Danke ZeHa du hast recht ich will das Programmieren richtig lernen!!!
und danke an alle andren die mit Diskusionen die Antwort Meiner Frage immer weiter nach unten rutschen liesen!!!


Und noch was was zwar nicht hier reingehört aber ich will keinen neuen Beitrag dafür machen:

WIe kann Ich in ein Set Gadget einen String benutzen statt die Zahl???

Code: Alles auswählen

SetGadgetState(#Gadget_2, sekunde$)
Antworten