看看就知道算法是怎么样的了。第一个for循环可以优化,懒得做了。
int k, len;
unsigned char name[7];
unsigned long b[6] =
{ 0xAD, 0xC0, 0x90, 0x9B, 0x26, 0xC3};
unsigned long a[6] =
{ 0x8C, 0x5E, 0x1A, 0x35, 0x4D, 0x96};
unsigned long c[6] =
{ 0xD1, 0xDB, 0x24, 0xBB, 0xC5, 0x82};
unsigned long serial[7],
tmp;
char buf[64];
len = GetDlgItemTextA(hDlg,
IDC_USERNAME, (char *)name, 7);
if ( (len < 4) ||
(len > 6))
{
SetDlgItemTextA(hDlg,
IDC_REGCODE, "There must be 4~6 chars in your name.");
return
FALSE;
}
for (k = 0; k < len;
k++)
{
name[k]
^= (a[k] ^ b[k]);
}
//随机数
serial[len] = GetTickCount(
) & 0xFF;
for(k = len -1; k >=0;
k--)
{
c[k] ^=
serial[k+1];
tmp =
(unsigned long)name[k];
if (tmp
> c[k])
{
serial[k] = c[k] + 0x00FF - tmp;
}
else
{
serial[k] = c[k] - tmp;
}
}
for(k =0; k <= len;
k++)
{
wsprintf(&buf[k*2], "%02lX", serial[k]);
}
SetDlgItemTextA(hDlg,
IDC_REGCODE, buf);