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
- masz imię i nazwisko - Misiekd oraz CRC16(MD5(MISIEKD)) - A331
- liczysz MD5 z imie i nazwisko - MD5(MISIEKD) - 822916151E524E4AF7D9A277EC49272F
- liczysz CRC16 z obliczonego w pkt 2 MD5 - CRC16(822916151E524E4AF7D9A277EC49272F) - A331 - zgadza się z tym z klucza więc klucz jest poprawny
- 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