Gewinnercode generieren
Übersicht

René MeyerBetreff: Gewinnercode generieren |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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! |
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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! |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group