Gewinnercode generieren

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

René Meyer

Betreff: Gewinnercode generieren

BeitragDo, Dez 23, 2004 21:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich möchte gern am Ende eines Spiels einen Code generieren, den man auf einer Website eingeben kann, um sich für ein Gewinnspiel zu qualifizieren.

Der Code sollte:

- nicht zu lang sein (sagen wir: 10 Zeichen)

- nur aus Buchstaben und/oder Zahlen bestehen

- zwei Werte (1 Byte + 2 Byte) übermitteln

- möglichst so individuell sein, daß man guten Gewissens das Einsenden eines identischen Codes von zwei verschiedenen Leuten ausschließen kann (könnte man vielleicht mit der vorherigen Eingabe der Initialen verbinden)

- verschlüsselt sein, daß man nur schwer einen Code per Hand generieren kann und "erfundene" Codes zurückgewiesen werden

Ich habe mir freilich schon Gedanken gemacht, aber vielleicht hat jemand pfiffige Ideen, wie man so einen Code erstellen kann. Danke. :)
www.blitzbasic.de | Das Buch zu Blitz Basic: www.schreibfabrik.de/txt/bbb

stfighter01

BeitragDo, Dez 23, 2004 22:17
Antworten mit Zitat
Benutzer-Profile anzeigen
naja.

die 3 bytes würd ich ganz am anfang hinhängen und nur einfach verschlüsselt (10 zeichen weiterschieben o. so ) und die 3 bytes gleich mal als randseed() verwenden, 7 zufällige zeichen erstellen und anhängen .
am sever kannst diese checksum nachbilden (aber vorsicht, bb verwendet sicher eine andere random funktion wie ein server-skript).

weis nicht ob das für profi-hacker genügt, aber ich habs mir mal eben so ausgedacht und ich glaub nicht das ICH das jemals knacken könnte.


mfg stfighter
Denken hilft!

TheShadow

Moderator

BeitragDo, Dez 23, 2004 22:27
Antworten mit Zitat
Benutzer-Profile anzeigen
es gibt ein-weg-routinen

CRC32 (4 zeichen ascii, 8 zeichen als HEX)
MD5 (16 zeichen ascii, 32 zeichen als HEX)
SHA1 (20 zeichen ascii, 40 zeichen als HEX)

da kannst du z.b. paar zeichen kodieren - die ausgegebene werte kannst du da aber nicht mehr herausfinden, sondern man kann nur erneut prüfen - also quasi nur was für passwörter und so direkt zunächst ungeignet für dich, weil du die werte ja zurückholen willst...

tja, es bleibt dann nur verschlüsselung. 2 zeichen sind ja nicht viel (=16 bit)
nimm einen 8 zeichen string. und kodiere die bits da irgendwie nach deinem muster ein (XOR!)... dann konvertiere nach hex und du hast einen relativ gut lesbaren 16 byte langen hex-string...
Nachteil! Du brauchst quasi einen schlüssel als vorlage. z.B.

71 FE .........
0111 0001 1111 1110 ......
UND du kannst z.B. immer die ersten bits SHIFTEN

1111 1001 0111 0110 ....
hier wäre jetzt 1111 eingeshiftet


Aber nun kommt SHA1 und Co ins spiel
lasse den user einen namen eingeben (z.B. min 5 zeichen). aus den namen generierst du dir SHA1-string und nimmst es als vorlage für die bitweise eincodierung.
So dann musst du auf dem webformular (oder wo auch immer sonst) erneut diesen namen und den codierten string eingeben. aus dem namen generierst du erneut SHA1-wert und dann filterst du die bits aus deinem CODE heraus...

ist eigentlich ganz easy Smile
nur nimm niemals einen festen Schlüssel - das ist einfach zu cracken

SHA1 ist ein algorithmus der jedes mal anderen schlüssel generiert - jedoch - sind die schlüssel quasi im algorithmus versteckt. Naja wenn einer den algorithmus kennt, dann hat man auch pech... Ansonsten muss man das variieren - z.B. SHA1 ist recht flexibel - da kann man eigene muster vorgeben - das wäre natürlich kein standard mehr - ist aber ja auch gewollt. man kann aber auch hier start-werte aus der exe heraushacken, wenn man will...



Aber andererseits... Wenn ein User immer den selben namen eingibt und z.B. 0 punkte hat, dann kriegt er einen "grundschlüssel" heraus. dann muss er z.b. 255 punkte erreichen und schon sieht er wie sich der schlüssel geändert hat - dann kann man ganz von alleine solche schlüssel generieren - halt immer mit dem einen namen Smile da wäre SHA und co auch dann egal...

oder mache so:
NAME+PUNKTE -> SHA1 berechnen
SHA1 + PUNKTE einkodieren -> kommt CODE raus

Im Webformular:
NAME+PUNKTE+CODE eingeben und dann
NAME+PUNKTE -> SHA1 berechnen
SHA1 mit CODE vergleichen und dann hast du alle bits raus die eincodiert sind... phu...
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

Travis

BeitragDo, Dez 23, 2004 23:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Am besten sendet das Programm mit dem Code auch den Punktestand (oder Namen) zurück. Dieser Punktestand (bzw. Name) wird dann als zweiter Wert irgendwie manipuliert, evtl in den Hexwert umgewandelt, verschlüsselt oder sonstwas.

Dann kan man prüfen, ob sich der zweite Wert wieder in den Punktestand zurückrechnen lässt. Somit kann man dann schon einmal sicherstellen, dass der Code nicht willkürlich generiert wurde.

EDIT: Ich sehe gerade, das hat TheShadow ja auch schon vorgeschlagen.
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.
 

BIG BUG

BeitragFr, Dez 24, 2004 1:49
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm, Du könntest doch auch einfach per Mausklick den Internetexplorer mit automatisch generierter Adresse inkl. entsprechenden PHP-Variablen aufrufen:
Code: [AUSKLAPPEN]

ExecFile("http://www.blitzforum.de/posting.php?mode=reply&t=8076")

Damit kann dein Schlüssel auch länger sein.

Als Schutz muss es nicht unbedingt eine Verschlüsselung sein. Über eine kompliziert generierte Checksumme könnte man den Code auch gegen Änderungen schützen.
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

Travis

BeitragFr, Dez 24, 2004 2:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau, sende doch vom Programm aus einfach die Spieldaten an einen Webserver. Evtl kannst du ja die ganzen Eingaben für die Teilnahme am Gewinnspiel vom Programm aus steuern und gar nicht per User "von Hand" im Webbrowser eintragen lassen. Das dürfte Manipulationen doch sicher ziemlich schwierig machen.
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.

TheShadow

Moderator

BeitragFr, Dez 24, 2004 16:29
Antworten mit Zitat
Benutzer-Profile anzeigen
jup... aber am besten daten so senden wie ich es beschrieben habe und nicht einfach so im klartext, weil das ja dann manipulierbar wäre...
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

stfighter01

BeitragFr, Dez 24, 2004 23:43
Antworten mit Zitat
Benutzer-Profile anzeigen
hier hab ich mal schnell ein beispielprogramm geschrieben.

Code: [AUSKLAPPEN]

;generate code
Const max_bytes= 3 ;anzahl der einzukodieren bytes
Const stringsize= 8 ;länge des codierten strings (min. 2 * max_bytes + 2 für checksumwerte)
               ;je grösser der string wird umso unmöglicher wird es einen checksum wert zu erraten,
               ;dafür wird es einfacher für hacker aus der checksum schlau zu werden und eine möglickkeit
               ;zu ersinnen die checksum zu reproduzieren     

Type bytearray     ;in dieses typefield können die werte reingeschrieben werden und übergeben werden
   Field byte[max_bytes]
End Type

;---------------hauptschleife mit zeichen einlesen und ausgeben---------------
;einlesen der werte
bytes_to_code.bytearray= New bytearray

bytes_to_code\byte[1]= Asc( Mid(Input("byte1: "),1,1) )

byte23$= Input("byte2u3: ")

bytes_to_code\byte[2]= Asc( Mid(byte23$,1,1) )
bytes_to_code\byte[3]= Asc( Mid(byte23$,2,1) )


Print "Eingegebene bytes: "

Print Chr(bytes_to_code\byte[1])
Print Chr(bytes_to_code\byte[2])
Print Chr(bytes_to_code\byte[3])

Print "" : Print ""

;generierung des codes
code$= generatecodestring$(bytes_to_code)
Print "generierter code lautet: "+code$

Print "" : Print ""

Repeat
codeeingabe$= Input(" korrekten code eingeben("+stringsize+" Zeichen) :")

If Input= "" End

;decodierung des codes
bytesdecode.bytearray= decodestring(codeeingabe$)

If bytesdecode <> Null
   Print "Code korrekt,die werte lauten: "
   Print Chr(bytesdecode\byte[1])
   Print Chr(bytesdecode\byte[2])
   Print Chr(bytesdecode\byte[3])      
   WaitKey()
   End
Else
   Print "code falsch"
EndIf

Forever

;-------------Hauptschleife ende ; Codegenerierung anfang -----------------;


Function byte_is_writeable(byte)
   ;teste ob das byte eine Zahl oder ein buchstabe ist

   ;entweder grosse od. kleine buchstaben (od. beide) müssen dabeisein
   If byte >= Asc("0") And byte <= Asc("9")  ;ausklammern um zahlen im generierten code zu verbieten
      Return True
   EndIf
   If byte >= Asc("A") And byte <= Asc("Z")  ;ausklammern um grossschreibung im generierten code zu verbieten
      Return True
   EndIf
   If byte >= Asc("a") And byte <= Asc("z")  ;ausklammern um kleinschreibung im generierten code zu verbieten
      Return True
   EndIf
   
   Return False
End Function

Function checkvar$()
   block= Rand(0,2)
   Select block
   Case 0:
      Return Chr(Rand(48,57))
   Case 1:
      Return Chr(Rand(65,90))
   Case 2:
      Return Chr(Rand(97,122))   
   End Select
End Function


Function generatecodestring$(bytes.bytearray)
   Local code$= ""
   Local byte,b,bytecounter



   For b= 0 To max_bytes-1
      byte= bytes\byte[b+1]
      bytecounter= 0
      Repeat
         byte= byte+27
         If byte >=256 byte= byte-256      
         bytecounter= bytecounter+1
      Until byte_is_writeable(byte)
      
      
      bytecounter= bytecounter+64
      code$= code$+ Chr(byte) + Chr(bytecounter)
   Next
   
;----mache eine checksum mit der random funktion-----
   
;erzeuge reproduzierbaren randseed um code wiederherzustellen
   randseed= 0
   For b= 0 To max_bytes-1
      randseed= randseed*1000
      randseed= randseed+ Asc(Mid(code$,1+b*2,1)) + Asc(Mid(code$,2+b*2,1))
   Next
   
   SeedRnd randseed
   
;erzeuge füllwerte
   For b= max_bytes*2 To stringsize-1
      code$= code$+ checkvar$()            
   Next

   Return code$   
End Function


;----------- Codegenerierung ende ; Decodierung anfang ---------------

Function decodestring.bytearray(code$)
   Local bytes.bytearray
;erzeugt ein bytearray type und speichert die im code enthaltenen werte hinein
;bei falschem code wird NULL zurückgegeben




;erzeuge randseed aus dem erhaltenen code um auf korrektheit zu prüfen
   randseed= 0
   For b= 0 To max_bytes-1
      randseed= randseed*1000
      randseed= randseed+ Asc(Mid(code$,1+b*2,1)) + Asc(Mid(code$,2+b*2,1))
   Next
   
   SeedRnd randseed
   
;kontrolliere checkwerte
   For b= max_bytes*2+1 To stringsize
      var$= Mid (code$, b,1)
      var2$= checkvar$()
      If var$ <> var2$
         Return Null
      EndIf            
   Next
   
   
;restauriere bytes
   bytes.bytearray= New bytearray

   For b= 0 To max_bytes-1
      counter= Asc(Mid(code$,b*2+2))-64
      byte= Asc(Mid(code$,b*2+1))
   
      For b2= 1 To counter
         byte= byte-27
         If byte < 0 byte = byte+256      
      Next      
      bytes\byte[b+1]= byte       
   Next
      
   Return bytes
End Function



vielleicht könnt ihr es verwenden


Ein frohes Fest wünscht euch stfighter
Denken hilft!

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group