Seite 2 von 2

Verfasst: Freitag 13. Januar 2006, 23:27
von BlackJack
Python Master 47 hat geschrieben:

Code: Alles auswählen

Name=raw_input('Name:')
Serial1=[ord(x) * 666 for x in Name]
Serial2=Serial1[0]+(len(Name)*14568)
Serial3=(Serial1[0]/666.0)*14568
Serial4=Serial3*123
Serial5=len(Name)*(Serial1[0]/666.0)
Serial6=Serial5*6613
Serial7=Serial6+14568
print 'Serial:', Serial2, '-', int(Serial4), '-', int(Serial7)
Schau Dir mal an, oder überleg Dir mal wie `Serial1` aussieht und was Du davon wirklich brauchst.
Auch fragt ihr euch warum ich Serial3 und 5 in float umwandle und dann wieder in int. Naja ich musste wieder auf den ersten Buchstaben von Name zugreifen und da der erste Wert in Serial1[0] mit 666 multipliziert wurde hab ich einfach durch 666.0 dividiert um

a)ein genaues ergebniss zu erhalten
Das ist Blödsinn. "10.0 / 2.0" ist nicht genauer als "10 / 2". Das gilt für alle ganzen Zahlen. Fliesskommazahlen können unter Umständen sogar ungenauere Ergebnisse liefern als Rechnungen mit ganzen Zahlen.

Verfasst: Samstag 14. Januar 2006, 02:03
von Python 47
Das ist kein Blödsin, weil:

wenn a:b=x, x€N

dann brauch ich keine division mit float, aber

wenn a:b=x, x€ !=N

dann ist int, ungenauer, z.B. ist 500/33 ist ungenauer als 500/33.0 :wink:

Verfasst: Samstag 14. Januar 2006, 22:59
von BlackJack
Python Master 47 hat geschrieben:Das ist kein Blödsin, weil:

wenn a:b=x, x€N

dann brauch ich keine division mit float, aber

wenn a:b=x, x€ !=N

dann ist int, ungenauer, z.B. ist 500/33 ist ungenauer als 500/33.0 :wink:
Da Du mit einer ganzen Zahl multiplizierst und nur durch die selbe ganze Zahl teilst, gilt immer Fall 1. Du hast also keinen Genauigkeitsgewinn durch Fliesskommazahlen.

Verfasst: Sonntag 15. Januar 2006, 03:50
von Python 47
Ja stimmt, war ein Fehler von mir! :oops: :oops:

Nur so nebenbei...

Verfasst: Sonntag 15. Januar 2006, 20:31
von modelnine
Hast Du Dir das selbst ausgedacht für ein Programm von Dir?

Wenn ja, dann würde ich erst mal anfangen mit kryptographisch sicheren Algorithmen umzugehen (wie zum Beispiel ein MD5- oder SHA-Digest). Da Du im Prinzip nur einen kleinen Teil der Eingabe für das Serial verbrauchst ist die Anzahl bits tatsächliche Daten pro Ausgabezeichen verschwindend gering, und somit auch Kollisionen mehr als einfach herstellbar.

Wenn sich das jemand anders ausgedacht hat gehört der wegen inkompetenten Programmierens an den Pranger gestellt. ;-)

--- Heiko.

Verfasst: Sonntag 15. Januar 2006, 20:54
von Python 47
Also ich habe die Serialberechnung von einem Cracker und habe den Keygen selber programmiert!

Was ist denn alles falsch an dem Keygen?

Ich meinte damit nicht...

Verfasst: Sonntag 15. Januar 2006, 21:17
von modelnine
dass der Keygen falsch ist.

Es geht mir um den Algorithmus zum Erstellen des Keys an sich. Du benutzt im Endeffekt zum Erstellen des Schlüssels nur das erste Zeichen des Namens und die Länge des Namens. Der ganze Rest fällt unter den Tisch.

Das bedeutet, dass folgende zwei Personen den selben Schlüssel kriegen:

Heiko Wundram
Helmut Anders

usw.

Du kannst das beliebig weiterspinnen.

Man nennt das was Du tust eine sogenannte Einweg-Funktion, weil es einfach ist aus einem Namen einen Schlüssel zu erzeugen, aber umgekehrt nicht oder nur unter sehr schwierigen Umständen möglich ist. Nur hat diese Einwegfunktion den Nachteil, dass sie sehr schnell Duplikate liefert, weil eben wie oben angemerkt zwei Personen mit Namen gleicher Länge und gleichem Anfangsbuchstaben den selben Key kriegen. Das nennt man dann eine Kollision, und Diese Einweg-Funktion ist eben alles andere als Kollisions-Resistent (das Gegenteil davon).

Darum: wer sich diesen Algorithmus ausgedacht hat sollte mal überlegen was es mit Einweg-Funktionen auf sich hat, und vor allem warum sie eben eine größere Entropie in der Ausgabe haben (_müssen_ um sicher zu sein) als dieser Algorithmus, da der obige sehr, sehr einfach zu fälschen ist.

--- Heiko.

Verfasst: Sonntag 15. Januar 2006, 22:20
von Python 47
Naja aber dann hab ich ja bei dem Programmieren des Keygens nichts falsch gemacht, da ich mich ja an die Anleitung gehlaten habe, oder hab ich doch was falsch gemacht?

Naja ich verstehe was du meinst, aber er hat das Programm ja gecrackt und die Serialberechnung des Programms herausgefunden, d.h. das er auch keinen Fehler gemacht hat, da das Programm halt diese Serialberechnung benutzt.Verstehst du?

Er hat sich pratisch nicht irgendeine Serrialberechnung ausgedacht, sondern die Serialberechnung eines Programms herausgefunden.Dieses Programm benutzt genau diese Serialberechnung!

Verfasst: Montag 16. Januar 2006, 11:37
von modelnine
Ich hab doch in meiner letzten Antwort schon gesagt dass Du nix falsch gemacht hast. Dieser Algorithmus zum erstellen einer Seriennummer ist nur absolut "braindead", und der Programmierer der sich sowas ausgedacht hat gehört standrechtlich erschossen für blödsinnige Intellectual-Property-Verwaltung. Also dafür dass er überhaupt so etwas implementiert hat, und des dann alles andere als richtig gemacht hat.

--- Heiko.

Verfasst: Montag 16. Januar 2006, 11:37
von modelnine
Standrechtlich Erschossen natürlich nur im übertragenen Sinn...

--- Heiko.

Verfasst: Montag 16. Januar 2006, 13:38
von Leonidas
Noch ein Argument sich den Seriennummern-Blödsinn nicht anzutun und bei Freier Software zu bleiben.

Wobei wie Heiko schon bemerkt hat, der Algorithmus tatsächlich nur ein Spielzeug ist.

Verfasst: Montag 16. Januar 2006, 14:56
von Python 47
Aso jetzt verstehe ich! :oops: :oops: :oops:

Ich dachte ihr meint den Cracker, das der etwas falsch gemacht hat! :oops:

Verfasst: Dienstag 17. Januar 2006, 17:36
von Joghurt
Wobei der "Cracker" sich wohl auch nicht wirklich gedanken gemacht hat. Den Keygen kannst du auch in drei Zeilen schreiben:

Code: Alles auswählen

c = ord(name[0])
l = len(name)
print "Serial:", 666*c+14568*l, "-", 1791864*c, "-", 6613*c*l+14568

Verfasst: Dienstag 17. Januar 2006, 17:48
von Python 47
gut wenn man es so nimmt kann ich den code auch so nehmen.Das ist mein Code und nicht der von dem Cracker :wink: :wink:

Es sind abe wohl oder übel mehr als 3 zeilen, da raw_input noch reinmuss!

Verfasst: Dienstag 17. Januar 2006, 17:51
von modelnine

Code: Alles auswählen

print "Serial: %s-%s-%s" % (lambda n: (666*ord(n[0])+14568*len(n),1791864*ord(n[0]),6613*ord(n[0])*len(n)+14568))(raw_input("Name? "))
Einzeilig geht's auch.

--- Heiko.

Verfasst: Dienstag 17. Januar 2006, 18:17
von Python 47
Ok THX für die Codes!