Seite 1 von 2

Verfasst: Freitag 13. Januar 2006, 15:46
von Leonidas
Python Master 47 hat geschrieben:Wie wähle ich jetzt P von Programm aus und multipliziere den ASCII Wert von P(P=erstes Zeichen aus Name) mit 666?
Wie wärs damit?

Code: Alles auswählen

name = 'Programm'
multiplied = [ord(ch) * 666 for ch in name]
und den ersten Buchstaben von name bekommst du mit

Code: Alles auswählen

name[0]

Verfasst: Freitag 13. Januar 2006, 17:09
von Python 47
Also:

1.Danke für eure Hilfreichen Antworten
2.Meine Frage in meinem letzten Beitrag hätte ich, wenn ich ein bischen mehr überlegt hätte, mir auch selber beantworten können.Aber ich hab nicht richtig nachgedacht und da ist mir nix eingefallen
3.Den Rest habe ich allein ohne Probleme hinbekommen. Ich zeigs euch mal zur Info:

Serialeingabe besteht wieder aus Name+Serialnummer
Serialberechnung:

1. ErsterWert = (erstes Zeichen aus Name) * 29Ah
2. ErsterWert = ErsterWert + ((Länge des Namens) * 38E8h)
3. ZweiterWert = (erstes Zeichen aus Name) * 38E8h
4. ZweiterWert = ZweiterWert * 7Bh
5. DritterWert = (Länge des Namens) * (erstes Zeichen aus Name)
6. DritterWert = DritterWert * 19D5h
7. DritterWert = DritterWert + 38E8h
8. Alle drei Werte durch ein "-" getrennt aneinanderhängen.

und hier mein Keygen:

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)
ihr fragt euch sicher warum anstatt dem hier:

Code: Alles auswählen

Serial1=Serial1[0]+(len(Name)*14568)
das hier dasteht

Code: Alles auswählen

Serial2=Serial1[0]+(len(Name)*14568)
Nun ja ich musste ja wieder auf Den ersten wert von Serial1 zugreifen, aber da Serial1 schon wieder in der neuen Serial1 Variable gespeichert wurde, konnte ich es nicht mehr aufrufen. Einfach 5 mal durchlesen dann versteht ihr es :lol: :lol: :lol:

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
b)um den 1.Buchstaben von Name zu erhalten.

Auch hier wiede 5 mal durchlesen um es zu verstehen :lol: :lol: :lol:

Sicher hätte ich die beiden Sachen auch anders lösen können, aber das waren die beiden leichtesten und kürzesten Lösungen. Und ehrlich gesagt, wem interessiert bei einem Keygen der Quelltext!

Wenn Ihr aber Verbesserungsvorschläge oder Meinungen dazu zusagen habt, dann postet Sie einfach!

Noch einmal Big THX

Verfasst: Freitag 13. Januar 2006, 17:30
von Leonidas
Und wenn du noch die Variablen klein schreibst und ein paar Leerzeichen zwischen den Operatoren einfügst wird es sicherlich lesbarer.

Re: Keygen in Pyhton

Verfasst: Freitag 13. Januar 2006, 17:34
von ProgChild
Python Master 47 hat geschrieben:Ich möchte keine genaue Anleitung haben, weil das illegal wäre
Noch ist es _nicht_ illegal. Das kann sich aber dank EU bald ändern.

Verfasst: Freitag 13. Januar 2006, 18:07
von Python 47
aha naja ich crack programme nicht um den Firmen zu schaden, sondern weil es spaßt macht, und auch sehr viel mit Intelligenz zu tun hat, serials zu berechnen, und auserdem, steigere ich mit der Programmierung von Keygens auch noch meine Programmierkenntnisse, jedenfalls ein bischen!!

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.