www.pudn.com > 通用注册机.zip > main.h
//--------------------------------------------------------------------------- #ifndef mainH #define mainH //--------------------------------------------------------------------------- #include#include #include #include //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TEdit *Edit1; TEdit *Edit2; TMemo *Memo1; TButton *Button1; TButton *Button2; TButton *Button3; TLabel *Label1; TLabel *Label2; TLabel *Label3; void __fastcall Button1Click(TObject *Sender); void __fastcall Button2Click(TObject *Sender); void __fastcall Button3Click(TObject *Sender); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #define f_rnd(i,a,b,c,d) \ u = _lrotl(d*(d+d+1), 5); \ t = _lrotl(b*(b+b+1), 5); \ a = _lrotl(a^t, u)+l_key[i]; \ c = _lrotl(c^u, t)+l_key[i+1] unsigned long l_key[44]; //////////设置注册序列 void set_key(const unsigned char *key) { unsigned long i, j, k, a, b, l[8]; unsigned long in_key[256]; j = 0; k = 32; for(i=0; i<256; i++) in_key[i] = 0; for(i=strlen(key); i>0; i--) { if(k >= 32) { k = 0; in_key[j] = 0; j++; } in_key[j-1] |= (key[i-1]< 63 ? 63 : i; } //////////加密,生成序列号 void encrypt(const unsigned char *tin, unsigned char *tout) { unsigned long a, b, c, d, t, u; unsigned char _tin[16], _tout[16]; unsigned long in_blk[4], out_blk[4]; int i, k; i = k = 0; while(i<12) { _tin[i++] = GetIndex(tin[k])|GetIndex(tin[k+1])<<6; _tin[i++] = GetIndex(tin[k+1])>>2|GetIndex(tin[k+2])<<4; _tin[i++] = GetIndex(tin[k+2])>>4|GetIndex(tin[k+3])<<2; k += 4; } _tin[12] = _tin[13] = _tin[14] = _tin[15] = 0; in_blk[0] = _tin[0]|(_tin[1]<<8)|(_tin[2]<<16)|(_tin[3]<<24); in_blk[1] = _tin[4]|(_tin[5]<<8)|(_tin[6]<<16)|(_tin[7]<<24); in_blk[2] = _tin[8]|(_tin[9]<<8)|(_tin[10]<<16)|(_tin[11]<<24); in_blk[3] = _tin[12]|(_tin[13]<<8)|(_tin[14]<<16)|(_tin[15]<<24); a = in_blk[0]; b = in_blk[1]+l_key[0]; c = in_blk[2]; d = in_blk[3]+l_key[1]; f_rnd( 2,a,b,c,d); f_rnd( 4,b,c,d,a); f_rnd( 6,c,d,a,b); f_rnd( 8,d,a,b,c); f_rnd(10,a,b,c,d); f_rnd(12,b,c,d,a); f_rnd(14,c,d,a,b); f_rnd(16,d,a,b,c); f_rnd(18,a,b,c,d); f_rnd(20,b,c,d,a); f_rnd(22,c,d,a,b); f_rnd(24,d,a,b,c); f_rnd(26,a,b,c,d); f_rnd(28,b,c,d,a); f_rnd(30,c,d,a,b); f_rnd(32,d,a,b,c); f_rnd(34,a,b,c,d); f_rnd(36,b,c,d,a); f_rnd(38,c,d,a,b); f_rnd(40,d,a,b,c); out_blk[0] = a+l_key[42]; out_blk[1] = b; out_blk[2] = c+l_key[43]; out_blk[3] = d; _tout[0] = out_blk[0]&0x000000ff; _tout[1] = (out_blk[0]>>8)&0x000000ff; _tout[2] = (out_blk[0]>>16)&0x000000ff; _tout[3] = (out_blk[0]>>24)&0x000000ff; _tout[4] = out_blk[1]&0x000000ff; _tout[5] = (out_blk[1]>>8)&0x000000ff; _tout[6] = (out_blk[1]>>16)&0x000000ff; _tout[7] = (out_blk[1]>>24)&0x000000ff; _tout[8] = out_blk[2]&0x000000ff; _tout[9] = (out_blk[2]>>8)&0x000000ff; _tout[10] = (out_blk[2]>>16)&0x000000ff; _tout[11] = (out_blk[2]>>24)&0x000000ff; _tout[12] = out_blk[3]&0x000000ff; _tout[13] = (out_blk[3]>>8)&0x000000ff; _tout[14] = (out_blk[3]>>16)&0x000000ff; _tout[15] = (out_blk[3]>>24)&0x000000ff; for(i=0; i<16; i++) tout[i] = ConvertTable[_tout[i]&0x3f]; tout[16] = 0; } //////////解密,还原成硬件代码 /*void decrypt(unsigned char *tin, unsigned char *tout) { unsigned long a, b, c, d, t, u; unsigned char _tin[16], _tout[16]; unsigned long in_blk[4], out_blk[4]; for(int i=0; i<16; i++) _tin[i] = (GetNum(tin[i<<1])<<4)|GetNum(tin[(i<<1)+1]); in_blk[0] = _tin[0]|(_tin[1]<<8)|(_tin[2]<<16)|(_tin[3]<<24); in_blk[1] = _tin[4]|(_tin[5]<<8)|(_tin[6]<<16)|(_tin[7]<<24); in_blk[2] = _tin[8]|(_tin[9]<<8)|(_tin[10]<<16)|(_tin[11]<<24); in_blk[3] = _tin[12]|(_tin[13]<<8)|(_tin[14]<<16)|(_tin[15]<<24); d = in_blk[3]; c = in_blk[2] - l_key[43]; b = in_blk[1]; a = in_blk[0] - l_key[42]; i_rnd(40,d,a,b,c); i_rnd(38,c,d,a,b); i_rnd(36,b,c,d,a); i_rnd(34,a,b,c,d); i_rnd(32,d,a,b,c); i_rnd(30,c,d,a,b); i_rnd(28,b,c,d,a); i_rnd(26,a,b,c,d); i_rnd(24,d,a,b,c); i_rnd(22,c,d,a,b); i_rnd(20,b,c,d,a); i_rnd(18,a,b,c,d); i_rnd(16,d,a,b,c); i_rnd(14,c,d,a,b); i_rnd(12,b,c,d,a); i_rnd(10,a,b,c,d); i_rnd( 8,d,a,b,c); i_rnd( 6,c,d,a,b); i_rnd( 4,b,c,d,a); i_rnd( 2,a,b,c,d); out_blk[3] = d - l_key[1]; out_blk[2] = c; out_blk[1] = b - l_key[0]; out_blk[0] = a; _tout[0]=out_blk[0]&0x000000ff; _tout[1]=(out_blk[0]>>8)&0x000000ff; _tout[2]=(out_blk[0]>>16)&0x000000ff; _tout[3]=(out_blk[0]>>24)&0x000000ff; _tout[4]=out_blk[1]&0x000000ff; _tout[5]=(out_blk[1]>>8)&0x000000ff; _tout[6]=(out_blk[1]>>16)&0x000000ff; _tout[7]=(out_blk[1]>>24)&0x000000ff; _tout[8]=out_blk[2]&0x000000ff; _tout[9]=(out_blk[2]>>8)&0x000000ff; _tout[10]=(out_blk[2]>>16)&0x000000ff; _tout[11]=(out_blk[2]>>24)&0x000000ff; _tout[12]=out_blk[3]&0x000000ff; _tout[13]=(out_blk[3]>>8)&0x000000ff; _tout[14]=(out_blk[3]>>16)&0x000000ff; _tout[15]=(out_blk[3]>>24)&0x000000ff; // char hex[]="0123456789ABCDEF"; // for (int i=0; i<32; i++) { // tout[i++] = hex[_tout[i>>1]/16]; // tout[i] = hex[_tout[i>>1]%16]; // } // tout[32] = 0; int i, k; i = k = 0; while(i<16) { tout[i++] = ConvertTable[_tout[k]&0x3f]; tout[i++] = ConvertTable[(_tout[k]>>6|_tout[k+1]<<2)&0x3f]; tout[i++] = ConvertTable[(_tout[k+1]>>4|_tout[k+2]<<4)&0x3f]; tout[i++] = ConvertTable[_tout[k+2]>>2]; k += 3; } tout[16] = 0; }*/ //--------------------------------------------------------------------------- #endif