得到机器码:
CString Mycode[16]={"ah","tm","ib","nw","rt","vx","zc","ls","pn","xq","fc","zk","eq","wm","np","qw"};
CString stred = '0';
int num1;
stred = GetCUPNum()+GetDISKNum()+GetMACaddress();//获取CPU 硬盘 mac地址
stred.MakeLower();//转换小写字母
int lenleng = strlen(stred);
for(int i = 0;i<lenleng ;i++)
{
char p = stred.GetAt(i);//返回当前数组下标对应的数组元素
if(p >= 'a' && p <= 'f')
{
num1 = p - 'a'+ 10;
}
else
{
num1 = p - '0';
}
CString tmp = Mycode[num1]; //获得对应秘钥组合
RegCode += tmp;
}
RegCode.MakeUpper();//转换大写
得到注册码
//传入机器码 转换成注册码
CString CCreateRegDlg::GetRegPasswd( CString &DirName )
{
cml.WriteLog(LEVEL_WARN, "%s %u --注册机序列号-:---%s", __FILE__, __LINE__, DirName);
long Num1,Num2,Num3;
char sn[16]={0};
CString p;
int i,len;
Num1=Num2=Num3=0;
len=int(strlen(DirName));
if(len!=0)
{
for( i=1;i<=len;i++)
{
//第一步算法
Num1=(long(Num1+(int(DirName[i-1])*i*i)*(i*sqrt((float)DirName[i-1])+1)))%100000;
//第二步算法
Num2=(Num2*i+(long(pow((float)DirName[i-1],2)*i)))%100000;
//第三步算法
Num3=(Num2+(long)sqrt((float)Num1))%100000;
}
//把三个算法结果分别生成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,a----z
for(i=0;i<15;i++)
{
while((sn[i]<'0' || sn[i]>'9') && (sn[i]<'A' || sn[i]>'Z') &&(sn[i]<'a' || sn[i]>'z') )
{
sn[i]=(sn[i]+31+7*i)%128;
}
}
//赋值给一个CSTRING变量,用做函数返回值
p.Format("%s",sn);
}
return p;
}
#常量
#define C1 52845
#define C2 22719
CString CmfcDlg::Encrypt(CString S, WORD Key)//加密
{
CString Result, str;
int i, j;
Result = S; // 初始化结果字符串
for (i = 0; i<S.GetLength(); i++) // 依次对字符串中各字符进行操作
{
Result.SetAt(i, S.GetAt(i) ^ (Key >> 8)); // 将密钥移位后与字符异或
Key = ((BYTE)Result.GetAt(i) + Key)*C1 + C2; // 产生下一个密钥
}
S = Result; // 保存结果
Result.Empty(); // 清除结果
for (i = 0; i<S.GetLength(); i++) // 对加密结果进行转换
{
j = (BYTE)S.GetAt(i); // 提取字符
// 将字符转换为两个字母保存
str = "12"; // 设置str长度为2
str.SetAt(0, 65 + j / 26);//这里将65改大点的数例如256,密文就会变乱码,效果更好,相应的,解密处要改为相同的数
str.SetAt(1, 65 + j % 26);
Result += str;
}
return Result;
}
CString CmfcDlg::Decrypt(CString S, WORD Key)//解密
{
CString Result, str;
int i, j;
Result.Empty(); // 清除结果
for (i = 0; i < S.GetLength() / 2; i++) // 将字符串两个字母一组进行处理
{
j = (((BYTE)S.GetAt(2 * i) - 65) * 26);//相应的,解密处要改为相同的数
j += (BYTE)S.GetAt(2 * i + 1) - 65;
str = "1"; // 设置str长度为1
str.SetAt(0, j);
Result += str; // 追加字符,还原字符串
}
S = Result; // 保存中间结果
for (i = 0; i<S.GetLength(); i++) // 依次对字符串中各字符进行操作
{
Result.SetAt(i, (BYTE)S.GetAt(i) ^ (Key >> 8)); // 将密钥移位后与字符异或
Key = ((BYTE)S.GetAt(i) + Key)*C1 + C2; // 产生下一个密钥
}
return Result;
}
用法
CString text=_T("192.168.18.14");//需要加密的字符串
WORD key=1314;//key
CString jiami=Encrypt(text,key);//加密
AfxMessageBox(_T("密文:")+jiami);
CString jiemi=Decrypt(jiami,key);//解密
AfxMessageBox(_T("原文:")+jiemi);
试用天数,大神这句话说得好:
照样获取系统时间,第一次记录为空,进行时间加密,保存,第二次运行,时间要大于第一次,记录下时间,第三次运行时间要大于第二次时间,记录下时间。。。。。写判断,获取记录的最后时间与当前时间比较,在这次比较之前,先与第一次时间做比较是否够30天。他修改系统时间也不能开启啊。没网就没网,记得。第一次运行,让他对准一下时间。
我是第一次注册后写文件记录当前注册时间,然后在初始化中 把这个时间读出来 然后在比较 这样不管用户怎么修改时间都是要设置成当前时间,不然程序就使用不了…当到期了 程序也运行不了