Verschlüsselung --> Ini!Hilfe!
-
Hi Leute, also ich hab schon suche benutzt, und nichts gefunden was bei mir funktioniert! Irgendwie!
Musss gleich vorwegnehmen das ich noch nen Anfänger bin!
Nun mein Problem...bei meinem Programmstart soll eine "Seriennummer" eingegeben werden, und diese LEICHT verschlüsselt in einen RegKey geschrieben werden!
Beim auslesen und vergleichen logischerweise entschlüsselt werden.nur funktioniert es irgendwie nich..So hier wird Code eingelesen und in Reg geschrieben, und dabei soll er mit 4 multipliziert werden....
int l; l = StrToInt(Edit1->Text); R->RootKey = HKEY_CURRENT_USER; R->OpenKey(szRegKey, true); R->WriteInteger("Activation","Serial",(l)*4); R->Free();
Und beim erneuten öffnen der Form soll der wert aus der reg mit einem aus einer Ini (welche auch erzeugt wird korrekt) verglichen werden...dazu eben wieder durch 4 dividieren!
void __fastcall TForm11::FormShow(TObject *Sender) { Form3->Query4->Close(); Form3->Query4->SQL->Clear(); Form3->Query4->SQL->Add("select * from Seriennummer"); Form3->Query4->Open(); int n = Ini3->ReadInteger("Registration","Reg-Number",n); int l = R->ReadInteger("Activation","Serial",(l)/4); int m = Form3->Query4->FieldByName("Seriennummer")->AsInteger; Label2->Caption = Ini3->ReadInteger("Registration","Reg-Number",n); Label3->Caption = R->ReadInteger("Activation","Serial",(l)); { Ini3->WriteInteger("Registration","Reg-Number",n); } if (n==m && l==n) { ShowMessage ("Bereits Registriert"); Form1->ShowModal(); } else ShowMessage ("Bitte geben Sie eine korrekte Seriennummer ein!"); }
so also wenn jemand gleich den fehler sieht bitte mir sagen wo er is...
Vielleicht muss ich das hier:
R->WriteInteger("Activation","Serial",(l)*4);
und das:
int l = R->ReadInteger("Activation","Serial",(l)/4);
so schreiben...
R->WriteInteger("Activation","Serial",(l*4));
und natürlich dann auch ....,(1/4));
Also danek schonmal...
Sensi
-
das:
Sensitive schrieb:
int l; l = StrToInt(Edit1->Text); R->RootKey = HKEY_CURRENT_USER; R->OpenKey(szRegKey, true); R->WriteInteger("Activation","Serial",(l)*4); R->Free();
sollte so klappen, auch wenn es hier keine sinn mach l in eine klammer zu schreiben
Sensitive schrieb:
int l = R->ReadInteger("Activation","Serial",(l)/4);
beim lesen aus der ini, ist der 3te Parameter der "Default"-Wert d.H. wenn nichts in der ini drinsteht wird der genommen.(siehe auch BCB-Hilfe)
ich würds eher so schreiben:
int l = R->ReadInteger("Activation","Serial",-1)/4;
ps.:
wenn dann l denn wert -1 hat weiste das kein wert vorhanden war, und kannst entsprechend reagieren.
-
Hmm...habs so geändert, geht trotzdem nicht!
Hab aber gemerkt, das der den Wert aus der Ini anscheinend nicht ließt...
Weil:Label2->Caption = Ini3->ReadInteger("Registration","Reg-Number",n); Label3->Caption = R->ReadInteger("Activation","Serial",l);
die Labels zeigen mir zu überprüfung die werte an...Label2 zeigt den wert an den ich eingegeben habe an....aber Label3 zeigt 0!
In der Registry selbst steht aber auch der Wert drin den ich eingegebn hab...
Wo könnte jetzt Fehler liegen?
-
Berichtigung
Hab aber gemerkt, das der den Wert aus der Ini anscheinend nicht ließt...
Nicht aus der Ini sonder aus der Reg!!
Sorry
-
wenn man fragen darf, wie gross ist den zB die zahl die du ausgelesen hast nach dem *4?
-
hmm...
machste das:
... R->RootKey = HKEY_CURRENT_USER; R->OpenKey(szRegKey, true); ...
auch vor dem einlesen?
-
@Big: da ich als test nur 1234 genommen habe....steht in der Registry 4936...rechnen tut er richtig!
@Beliah: ich mach das nur das eine mal wo es oben im code steht,also nur wo die Reg geschrieben wird...warum?
-
was passiert, wenn du das /4 weglässt?
oder kannst auch das -1 in -4 umwandeln..
so wie ich das denke, findet es keinen eintrag und bekommt -1 das wird /4 gerechnet was -0.25 gibt (int -> keine komastellen -> -0 = 0)
-
Auch wenn ich das +4 und /4 weglasse, kommt nur 0!
Aber nur bei static int!
Wenn ich normal int nehme, dann bekomme ich utopische werte!
-
Sensitive schrieb:
@Beliah: ich mach das nur das eine mal wo es oben im code steht,also nur wo die Reg geschrieben wird...warum?
weil die variable ja wissen muss wo sie suchen soll.
-
Und wo soll ich das jetzt im Quellcode nochmal hinsetzten deines erachtens?
Danke schonmal wieder für antwort....
-
vor dem einlesen, bzw. falls die Variable in der ganzen Form verfügbar ist(also die deklaration in der klassendefinition der form steht), im Konstruktor der Form, dann könnteste auch das vor dem schreiben löschen, bzw. besser erstma auskommentieren und testen obs dann noch funktioniert.
ist aber keine garantie das es so funktioniert...
-
Also hab das grad mal vorm lesen reingeschrieben:
R->RootKey = HKEY_CURRENT_USER; R->OpenKey(szRegKey, true); static int n = Ini3->ReadInteger("Registration","Reg-Number",n); static int l = R->ReadInteger("Activation","Serial",l/4); static int m = Form3->Query4->FieldByName("Seriennummer")->AsInteger; Label2->Caption = Ini3->ReadInteger("Registration","Reg-Number",n); Label3->Caption = R->ReadInteger("Activation","Serial",l);
eingefügt...dann funktiniert es wenn schon was drin steht in der registry!
Wenn ich allerdings die einträge in der registry lösche schreibt er sie an die falsche stelle!
Rictig wäre hier:
HKEY_CURRENT_USER -> Software -> Sen -> Login -> Activierung
Er schreibt es aber hier:
HKEY_CURRENT_USER -> Software -> Sen -> Login -> Software -> Sen -> Login -> Activierung!
Also er schreibt in den sSchlüsseö den Schlüssel nochmal rein!
Also irgendwie komisch!
-
klappt es wenn du die zeile:
R->OpenKey(szRegKey, true);
vor dem schreiben auskommentierst?
[EDIT]
wenn nicht dann versuch mal:R->CloseKey();
nach dem einlesen.
schau dazu auch mal in der BCB-Hilfe zu TRegistry.
ich geh mal davon aus das du TRegistrybenutzt da dies die einzige für Ini/Registry 'zuständige' klasse ist die OpenKey als methode hat(bzw. die einzige die ich gefunden hab
)
[/EDIT]
-
Wenn ich das auskommentiere, schreibt er weider an die richtige stelle, ließt es aber wieder nicht!
und wenn ich
R->RootKey = HKEY_CURRENT_USER;
auskommentiere, ließt er, aber schreibt wieder an falsche stelle...
-
und wenn du, wie ich oben beschrieben hab, CloseKey() benutzt?
-
Jahhaaaaaaa
bis jetzt gehtz!
Ich könnt dich knutschen!
da hab ich aber direkt noch eine frage!:
Wenn ich in einer Datenbank eine zahl stehen habe....und ich die über ein Edit vergleiche!
Also ich geb eine Zahl in ein Editfeld, und diese soll mit einer Zahl in Datenbank abgeglichen werden, kann ich das da auch so machen, das ich das 3fache der Zahl eingebe, und er es als richtig erkennt! Quasi auch eine kleine verschlüsselung!
Beispiel:
In Datenbank steht 1234
das ich eben 2468 eingeben muss damit er es akzeptiert...
geht das irgendwie so:
Form3->Query4->SQL->Add("select * from Seriennummer where Seriennummer like '" +Edit1->Text+ "';")*2;
Und ja ich weis, eine Frage pro Thread, ein Thread pro Frage, aber wir sind grad so schön im Gespräch....
-
Sensitive schrieb:
geht das irgendwie so:
Form3->Query4->SQL->Add("select * from Seriennummer where Seriennummer like '" +Edit1->Text+ "';")*2;
so wäre das oben richtig:
Form3->Query4->SQL->Add("select * from Seriennummer where Seriennummer like '" + AnsiString(Edit1->Text.ToIntDef(-1) * 2) + "';");
wenn ich das richtig verstehe, soll aber die eingabe durch 2(3,4,5 oder was weis ich) geteilt werden,also wäre das besser:
Form3->Query4->SQL->Add("select * from Seriennummer where Seriennummer like '" + AnsiString(Edit1->Text.ToIntDef(-1) / 2) + "';");
ps.: das ToIntDef(-1) gibt -1 zurück falls im Editfeld was steht was nicht in eine Zahl umgewandelt werden kann(z.B. normaler Text)
-
Klasse,klappt bis jetzt alles!
Auch wenns nich ganz einfach war...aber bis jetzt gehtz...=)!
Vielleicht fällt mir noch was ein,dann frag ich hier drin wieder!
-
Lol, noch ein kleines Problem...dann bin ich vorerst schlau genug!
Das mit dem durch 2 teilen bei der Editeingabe und vergleich mit datanbank funkt schonmal
Form3->Query4->SQL->Add("select * from Seriennummer where Seriennummer like '" + AnsiString(Edit1->Text.ToIntDef(-1) / 2) + "';");
allerdings nur für den ersten wert der drin steht in DB!
Wie kann ich es machen das auch die anderen akzeptiert werden!
Mit table hab ich das so gemacht:Form3->Database1->Open(); Form3->Table1->Open(); Form3->Table1->SetKey(); Form3->Table1->Fields->Fields[0]->AsString = Edit1->Text; if (!Form3->Table1->GotoKey()) { } else { }
weil ich anders nicht weiß wies geht!
Er findet zwar jeden wert der tabelle bei der Editeingabe:
try { //Ini1->WriteInteger("Login","Uses",a); Form3->Query4->Close(); Form3->Query4->SQL->Clear(); Form3->Query4->SQL->Add("select * from Seriennummer where Seriennummer like '" + AnsiString(Edit1->Text.ToIntDef(-1) / 2) + "';"); Form3->Query4->Open(); if (!Form3->Query4->Eof) { ShowMessage ("Akzeptiert!Starten Sie das Programm neu um Aktivierung abzuschließen!");
da bringt er dann eben "Akzeptiert!Starten Sie das...."
Aber beim vergleich dann:
oid __fastcall TForm11::FormShow(TObject *Sender) { Form3->Query4->Close(); Form3->Query4->SQL->Clear(); Form3->Query4->SQL->Add("select * from Seriennummer"); Form3->Query4->Open(); R->RootKey = HKEY_CURRENT_USER; R->OpenKey(szRegKey, true); static int n = Ini3->ReadInteger("Registration","Reg-Number",n)/2; static int l = R->ReadInteger("Activation","Serial",-l)/3; static int m = Form3->Query4->FieldByName("Seriennummer")->AsInteger; Label2->Caption = Ini3->ReadInteger("Registration","Reg-Number",n)/2; Label3->Caption = R->ReadInteger("Activation","Serial",-l)/3; R->CloseKey(); { Ini3->WriteInteger("Registration","Reg-Number",n); } if (n==m && l==n) { ShowMessage ("Bereits Registriert"); Form1->ShowModal(); } else ShowMessage ("Bitte geben Sie eine korrekte Seriennummer ein!"); }
da sagt er das ich korrekte nummer eingeben soll.....