Serial Key Check
-
Hi! Ich will so nen ganz billigen Serial Code Check in mein Programm einauen. Ich weiß zwar, dass das easy zu knacken ist, aber ich will das trotzdem mal ausprobieren.
Der Key soll ungefähr so aussehen:(6) (8) (2) (3)
xxxx-xxxx-xxxx-xxxxAlso nach jedem strich kommt nen eigenes eingabefeld.
Nun möchte ich das so machen, das in jedem einzelnen feld alles zusammengezählt wird und dann die einerstelle die übrigbleibt herrausgenommen wird. Ich will das dann so machen, das z.B beim ersten Feld immer etwas mit 6 als einer stelle rauskommen muss. z.B bei 3481 dann 3+4+8+1 = 16, also muss die Zahl immer 6 als einerstelle ergeben. Also so, dass auch 26 richtig wäre.Wie mache ich sowas? Danke im Vorraus
-
Eigentlich sind String ja meine Spezialität, aber ich muss zu meiner Schande gestehen:
Ich verstehe dich nicht!
Kannst du das mal genauer erklären?
MfG
Happosai
-
xxxx in 4 Zeichen zerlegen.
jedes zeichen mit atoi wandeln , zusammenaddieren, wieder in einen String einlesen und davon das letzte Zeichen verwenden.
-
Original erstellt von Happosai:
**Eigentlich sind String ja meine Spezialität, aber ich muss zu meiner Schande gestehen:Ich verstehe dich nicht!
Kannst du das mal genauer erklären?
MfG
Happosai**Ok, dann erkläre ich es jetzt mal ganz genau:
Wie ich bereits erwähnt habe will ich einen Serial Code Check in mein Programm einbauen. (nennt man auch CD-Key)
Der ist so aufgebaut: xxxx-xxxx-xxxx-xxxx
Die x stehen für je eine zahl.Für den Code will ich 4 Edit felder machen, in die man je 4 Zahlen eintippen muss.
Jetzt zu meiner Logik zum Prüfen ob die Serial richtig ist:
Bei jedem editfeld soll ein ergebnis rauskommen. Und das will ich ausrechnen, indem ich einfach alle Zahlen zusammenrechne, die dort drinnstehen.
Steht da z.B 4123 kommt dann kommt 10 raus. Ich möchte aber nur die einerstelle prüfen lassen. D.h wir hätten als Prüfsumme 0. Wenn wir z.b 8246 eingeben, würde 20 rauskommen, und das wäre auch richtig, da ja die einerzahl 0 ist.Sagen wir mal, damit mein Key richtig ist, müssen die Prüfsummen beim jeweiligen editfeld rauskommen, die in den Klammern darüber stehen...
(0) (3) (6) (9)
xxxx-xxxx-xxxx-xxxx... Dann wäre dies hier eine Gültige Serial:
(20) (23) (36) (9)
5591-8492-9999-1233In den Klammern steht, was insgesammt jeweils rauskommt.
Die Serial ist Gültig weil:5+5+9+1 = 20 (Die einerstelle ist 0, also ist die Prüfsumme für Feld1 Korrekt.)
8+4+9+2 = 23 (Die einerstelle ist 3, also ist die Prüfsumme für Feld2 Korrekt.)
9+9+9+9 = 36 (Die einerstelle ist 6, also ist die Prüfsumme für Feld3 Korrekt.)
1+2+3+3 = 9 (Bei Feld 4 kommt 9 raus, also ist die Prüfsumme für Feld 4 ebenfalls Korrekt.)Ich hoffe mal, das du es jetzt verstanden hast.
Ich weiß nicht, wie ich die zahlen zerlagen kann, also das er aus 5591 5 5 9 1 macht, und das ich die dann einzeln zusammenrechnen kann.Danke im Vorraus
-
Für die Quersumme:
CString strSignatur;//Deine eingegebene Signatur
LONG lQuersumme = 0;
for(i = 0;i<strSignatur.GetLenght();i++)
{
if(strSignatur.GetAt(i) != '-')
lQuerSumme+=atoi(strSignatur.GetAt(i));}
Um auf die Einerstelle zu kommen einfach % 10 (Modulus 10)
-
Hallo,
aja, jetzt hab ich's verstanden.
Das Überprüfen dürfte also kein Problem sein:
CYourDlg::OnCheck() { UpdateData(true); CString sBlock1 = m_sBlock1; //m_sBlock1 = Membervariable für's 1. Editfeld int nQuersumme = 0; for(int i = 0; i < sBlock1.GetLength(); i++) nQuersumme += atoi(sBlock1.GetAt(i)); const int ChecksummeBlock1 = 4; //für jeden Block einzeln festegen! if(ChecksummeBlock1 == nQuersumme % 10) MessageBox("Code OK"); else MessageBox("Code fehlerhaft"); }
Keine Ahnung, ob der Code funktioniert, hab ihn nicht getestet.
Ist zwar im Groben das selbe wie von Frank II, aber na ja, macht ja nix.
MfG
Happosai
-
Danke!
Aber ein Problem gibts noch, und zwar:error C2664: atoi' : cannot convert parameter 1 from 'char' to 'const char *'
und zwar sagt er das hier:nQuersumme += atoi(sBlock1.GetAt(i));
was ist zu tun? Ich nehme mal an irgendwas umwandeln???
Danke im Voraus
-
Hallo.
Auch wenn ich mich damit dem Spott der anderen aussetzen mag: Ich hab's über eine 2. Variable gelöst und diesmal sogar eingenhändig getestet!:
void CSerialDlg::OnButton1() { UpdateData(true); CString sBlock1 = m_s; //m_s = Membervariable für's 1. Editfeld int nQuersumme = 0; CString* s = new CString; for(int i = 0; i < sBlock1.GetLength(); i++) { *s = sBlock1[i]; nQuersumme += atoi(*s); } delete s; const int ChecksummeBlock1 = 4; //für jeden Block einzeln festegen! if(ChecksummeBlock1 == nQuersumme % 10) MessageBox("Code OK"); else MessageBox("Code fehlerhaft"); }
MfG
Happosai
-
Hallo,
nur so als Tipp, wenn ich richtig liege ist im ASCII-Code die folgende Reihenfolge: 0 1 2 3 4 5 6 7 8 9
Also könnte man sich das atoi(..) sparen, indem man
nQuerSumme += str[i] - '0';
rechnet.