Generowanie klucza, cd-key, serial do mojej aplikacji

0

Cześć

Potrzebuję napisać do swojej aplikacji zabezpieczenie, w taki sposob ze osoba ktora ode mnie dostanie aplikacje, musi wpisac klucz, cd-key czy serial.

Nie musi to byc jakies super wymyslne, po prostu ma dzialac.
Najwiekszy problem jaki do tej pory sie napotkalem to - stala dlugosc tego klucza i znaki 0-9 i A-Z.

Ma wygladac to tak:

  1. w programie ktory bedzie mi generowal te klucze, podaje imie i nazwisko osoby dla ktorej ma byc "licencja" oraz date waznosci aplikacji. Klikam Generuj i program wygeneruje mi klucz o stalej dlugosci, na podstawie imienia i nazwiska, oraz zaszyje w nim date waznosci "licencji"

  2. we wlasciwym programie, wpisuje znowu imie i nazwisko, oraz klucz ktory zostal wygenerowany w prog. z punktu 1.
    I tutaj program powinien sprawidzc czy ten klucz zgadza sie z podanym imieniem i nazwiskiem oraz wydobyc z klucza date waznosci licencji

Niby banal, a sie kompletnie na tym rozwalilem, a zaliczenie progamu na zajecia zbliza sie wielkimi krokami :(

Mozecie mi wskazac jakas wlasciwa droge, jakby to moglo wygladac?
Lub stronki z przykladowymi algorytmami?

Zwracam uwage, ze najwazniejsze to stala dlugosc wygenerowanego klucza.

0

zrobić hash (md5) z Upper(imie + nazwisko) - masz 32 znaki. Obliczasz CRC16 z tego ciągu - masz dodatkowe 4 znaki. Teraz np. do co czwartego dodajesz datę i na końcu bierzesz z md5 tylko znaki z dodatkową datą i CRC, czyli coś takiego
M - znak z MD5, C - znak z CRC, D - kolejny znak daty (np. YYYYMMDD), X - wynik dodania znaku z MD5 i daty

MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMCCCC
D   D   D   D   D   D   D   D
XMMMXMMMXMMMXMMMXMMMXMMMXMMMXMMMCCCC
wynik
XXXX-XXXX-CCCC

przykład:
imię i nazwisko: Misiekd
exp date: 01.01.2012

MD5(MISIEKD) - 822916151E524E4AF7D9A277EC49272F
CRC16(822916151E524E4AF7D9A277EC49272F) - A331
Data - 20120101

822916151E524E4AF7D9A277EC49272FA331
2   0   1   2   0   1   0   1

przyjmując, że mamy taką kolejność cyfr i liter

0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z
i odpowiadające im pozycje
1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

to dodajemy je w ten sposób (w nawiasie pozycja)
8(9) + 2(3) = B(12)
1(2) + 0(1) = 2(3)
1(2) + 1(2) = 3(4)
4(5) + 2(3) = 7(8)
F(16) + 0(1) = G(17)
A(11) + 1(2) = C(13)
E(15) + 0(1) = F(16)
2(3) + 1(2) = 4(5)
dostajesz w wyniku
B22926153E527E4AG7D9C277FC49472FA331
i klucz wynikowy
B237-GCF4-A331

jak teraz sprawdzić czy klucz jest ok i jaka jest data

  1. masz imię i nazwisko - Misiekd oraz CRC16(MD5(MISIEKD)) - A331
  2. liczysz MD5 z imie i nazwisko - MD5(MISIEKD) - 822916151E524E4AF7D9A277EC49272F
  3. liczysz CRC16 z obliczonego w pkt 2 MD5 - CRC16(822916151E524E4AF7D9A277EC49272F) - A331 - zgadza się z tym z klucza więc klucz jest poprawny
  4. bierzesz co 4 znak z obliczonego MD5 oraz z klucza
B 2 3 7 G C F 4 <-z klucza
8 1 1 4 F A E 2 <-obliczone

odejmujesz je tak jak poprzednio dodawałeś
B(12) - 8(9) = 2(3)
2(3) - 1(2) = 0(1)
3(4) - 1(2) = 1(2)
7(8) - 4(5) = 2(3)
G(17) - F(16) = 0(1)
C(13) - A(11) = 1(2)
F(16) - E(15) = 0(1)
4(5) - 2(3) = 1(2)
i dostajesz datę 20120101, czyli 01.01.2012

Jeśli imię i nazwisko będzie inne po stronie aplikacji to dostaniesz inny MD5 z nich a następnie inny CRC16 z tego MD5 i nie będzie się on zgadzał z CRC16 z kodu i będziesz wiedział, że to zły klucz, np
Imię i nazwisko - Jozin z Bazin
MD5(JOZIN Z BAZIN) - A16EDA2A78CCBC90EE5S3019037B0983
CRC16(A16EDA2A78CCBC90EE5S3019037B0983) - 185B
i tutaj CRC16 nie zgadza się z tym z klucza (A331)

PS. jest mały błąd tutaj

822916151E524E4AF7D9A277EC49272FA331
2   0   1   2   0   1   0   1

pierwsze 0 powinno być pod 9 a nie pod 1 i każda kolejna jest przesunięta o jeden w prawo, ale dla samej idei nie ma to znaczenia.

Proste? - proste :p

0

Wildze jeden duży problem w tym rozwiązaniu.
Klient A ma klucz ważny do daty D1. Potem zakupił klucz ważny do daty D2 itp.
Po pewnym czasie widać co się w kluczu zmienia a co nie i szybka analiza pozwala wygenerować sobie klucz na wiele lat (przy zakupie tylko pierwszego).

Jakieś rozwiązanie tego problemu ?

0

Skoro to tylko na zaliczenie, może zrób system sprawdzania przez neta? To znaczy masz bazę danych na serwie w której trzymasz sobie klucze. Gdy ktoś odpala program, to ten automatycznie łączy się z bazą i sprawdza czy znajduje się w niej klucz który podał użytkownik. Jeżeli nie, albo klucz jest już w użyciu przez inną osobę, to program się wyłącza ;]

Oczywiście przygotowanie czegoś takiego na dużą skalę jest dosyć kosztowne, ale to tylko na zaliczenie - zaimponujesz profesorowi że wymyśliłeś dobre zabezpieczenie antypirackie ;)

0

Najprostsza metoda obciąża procesor, ale na proste potrzeby się powinna sprawdzić. :P
Generujemy skrót (choćby MD5) z określonego ciągu znaków. np. IMIE_NAZWISKO_DZIEN_MIESIAC_ROK. Otrzymujemy jakiś tam skrót.
Nasz program ma być w założeniu używany przez 10 lat (potem i tak będzie zbyt mało popularny, by czerpać z niego zyski). Wpisujesz dane osoby i jej klucz. Tworzymy 3650 różnych skrótów. Jeśli choć jeden będzie pasował, jest okej. Jeśli żaden - znaczy, że błędne dane, albo minęło ponad 10 lat od wydania programu. :P
Tak, skrajnie prymitywne, wiem.

0

Możesz brać dwie ostatnie cyfry roku, tak że po 10 latach cykl się powtórzy.
Ale wadą będzie to, że albo liczysz wszystkie skróty przy starcie, albo trzymasz je w pliku, który zajmie 57 kB – trochę dużo, pliki licencyjne komercyjnych aplikacji nie zajmują tyle.

1 użytkowników online, w tym zalogowanych: 0, gości: 1