Serial Number 生成器
class CSerialNumber { public: CString XOR(LPCTSTR sSource, LPCTSTR sXOR); bool IsValid(LPCTSTR sSource, LPCTSTR sSN, int nMethod = 0); CString Generate(LPCTSTR sSource, int nMethod = 0); //生成注册码 CSerialNumber(); virtual ~CSerialNumber(); }; CSerialNumber::CSerialNumber() { } CSerialNumber::~CSerialNumber() { } CString CSerialNumber::Generate(LPCTSTR sSource, int nMethod) { //将用户名换算成15位注册码 double Num1, Num2, Num3; char sn[16] = {0}; Num1 = 0; Num2 = 0; Num3 = 0; int len = strlen(sSource); if(len) { for(int i = 1; i <= len; i++) { //第一步算法 Num1 = (long)(Num1 + (int(sSource[i-1]) * i * i) * (i * sqrt(sSource[i-1]) + 1)) % 100000; //第二步算法 Num2 = (long)(Num2 * i + (double(pow((double)(int)sSource[i-1], (double)2) * i))) % 100000; //第三步算法 Num3 = (long)(Num2 + (double)sqrt(Num1)) % 100000; } TRACE("Num1:%ld Num2:%ld Num3:%ld\r\n", Num1, Num2, Num3); //以下把三个算法结果分别生成5个字符,共有15个 for(i = 0; i < 5; i++) sn[i] = (int)(Num1 + 31 + i * i * i) % 128; for(i = 5; i < 10; i++) sn[i] = (int)(Num2 + 31 + i * i * i) % 128; for(i = 10; i < 15; i++) sn[i] = (int)(Num3 + 31 + i * i * i) % 128; sn[15] = 0; //以下循环把所有生成的字符转换为0---9,A---Z for(i = 0; i < 15; i++) { while((sn[i] < '0' || sn[i] > '9') && (sn[i] < 'A' || sn[i] > 'Z')) { sn[i] = (sn[i] + 31 + 7 * i) % 128; } } } TRACE("SN:%s\r\n", sn); return sn; } bool CSerialNumber::IsValid(LPCTSTR sSource, LPCTSTR sSN, int nMethod) { return sSN == Generate(sSource); } CString CSerialNumber::XOR(LPCTSTR sSource, LPCTSTR sXOR) { CString sEncode; LPCTSTR sp = sXOR; while(*sSource) { char ch = ((*sSource) ^ (*sp)); if(!ch) ch = (char)16; sEncode += ch; sSource++; sp++; if(!(*sp)) { sp = sXOR; } } return sEncode; }
注:转载文章需注明来源:VCer.net 文章地址:http://vcer.net/1281.html
如果你觉得VCer.net不错,而且你愿意为VCer.net捐赠一元钱,那么点击后面的捐赠按钮吧:)
我得意,我用他的代码;
我自豪,他用我的代码!
void main() { printf("hello, vcer!"); }
A B C D E