当前位置:天才代写 > tutorial > C语言/C++ 教程 > 共享软件注册部门的简朴实现

共享软件注册部门的简朴实现

2017-11-06 08:00 星期一 所属: C语言/C++ 教程 浏览:483

副标题#e#

今朝,许多共享软件中利用注册码来实现对软件的掩护。所谓注册码,就是一组与用户的某些特定信息(如用户名称、计较机硬件等等)相关的字符串。由于注册码传输起来较量简朴,同时容易验证(相对付磁盘、光盘指纹等),因此此刻注册码的应用越来越遍及,甚至一些贸易软件,如Windows XP也利用了雷同的机制(Microsoft称为Windows Product Activation)。

谈起注册码,就不能不提注册器。注册器是用来发生注册码的措施,其计较逻辑凡是与受掩护的应用措施一致。通过与受掩护应用措施沟通,或预先约定的计较逻辑获得的注册号,将抉择受掩护应用措施的行为,如显示“软件未注册”、禁用某些成果,或在“关于”对话框中显示注册者的姓名,等等。

个中,最终用户通过某种方法提交其注册信息,譬喻他(或他地址的组织)的名字,甚至极度一些,提供某些可以确定或人身份的信息,如Pentium III CPU的CPU ID,硬盘的序列号,网卡的MAC地点等等。然后,注册处事器,或呼唤中心的处事人员按照用户提供的信息,计较一个注册号,并汇报最终用户。

凡是,由于人工操纵大概造成过错,我们但愿注册进程由计较机自动实现。不外这就带来了一个问题:用户凭什么相信我们的措施并不会泄漏他的小我私家隐私呢?针对这一问题,今朝风行的做法是提供若干选项,个中包罗电话注册,网络注册,以及平信注册等等,并把措施提交的内容奉告用户。

另外,某些与用户的电脑相关的信息,如设置等等,不宜利用明文传送。这一方面是由于用户大概不肯意将这些信息透露给我们,另一方面是以明文传送信息大概会导致第三方(如cracker)截获信息。今朝较量风行的要领是把那些我们并不需要,但却抉择用户身份的信息用某种散列算法举办编码然后再发送。虽然,在发送进程中我们可以利用SSL加密,可能其他一些要领来担保安详,由于与本文的主要内容干系不大,在此不赘述,读者可参考相关书籍。

需要保密的用户信息→ 散列算法 → 安详传输(如SSL) →处事器

就笔者小我私家的履历,计较注册码和验证注册码利用差异的算法,可以在必然水平上提高注册进程的安详性。虽然,任何安详法子都不行能担保不被解密,“世界上没有打不开的锁”,解密只是一个时间问题,在结构注册码算法的时候,只要让解密价钱大于软件代价即可,不必做得太巨大。

作为用户而言,无论是用什么注册方法,他都不但愿过于巨大。通过计较机直接注册的方法无疑是最利便的,但许多用户大概不肯意这样做。作为用户来说,通过电话注册这种方法,说出本身的注册ID(凡是包罗了产物ID、用户的名字等信息),以及输入注册码应该是各类注册方法中最贫苦的一种。

注册ID和注册码应该具有以下特点:

(1)便于辨认、输入。注册码不是暗码,没有须要是用大量的非凡标记、巨细写组合。因此,注册码和注册ID中不该该包括差异巨细写的字母,以及容易夹杂的数字(1-I,0-O,2-Z)。

(2)具有查错本领。统计证明,输入注册码时,错序(如把1234输入成1243)、击键错误是最常见的错误。较量常用的要领是把注册码分成若干节,每节包罗一个校验码,这样注册码就具有查错本领了。

为了浮现上面的要求,我结构了一个这样的算法:

(1)计较输入的用户名,并凭据下面的法则计较和:

设功效为a,预置为0

按顺序取用户名字符串的每一个字符的ASCII值,乘上位号,累加到a上。

譬喻:

J a s o n   L i

1 2 3 4 5 6 7 8

这样,a=(char)’J’+((char)’a’)*2+((char)’s’)*3+…


#p#副标题#e#

(2)将a、a²凭据必然法则调动之后成为注册字符串。

实现措施如下:

// reg.cpp : Demo program for Keygen
// By Jason Li, 2001. Written for FrontFree techonology network
#include <string>
#include <iostream>
using namespace std;
typedef int BOOL;
const BOOL TRUE=(1==1);
const BOOL FALSE=!TRUE;
// Define the magic string
const string sMagic="L5WXTUYJH7VMB4GA8SFKQN9E36RPDC";
string GetRegstr(string &sName){
string sResult="FFTN-";
long lSum=0;
long lSum1;
long lChksum;
register unsigned int i;
// Calculate the registration string
for(i=0;i<sName.length();i++){
lSum += sName.at(i) * (i+1);
}
// The checksum prevents accident input
lChksum=sMagic.at(lSum%30);
sResult+=sMagic.at(lSum%30);
lSum1=lSum;
for(i=0;i<4;i++){
sResult+=(char)((lSum%10)+’0’);
lChksum+=((lSum%10)+’0’);
lSum/=10;
}
sResult+=(sMagic.at(lChksum%30));
sResult+="-";
lChksum=0;
lSum=lSum1*lSum1/3;
for(i=0;i<5;i++){
sResult+=sMagic.at(lSum%30);
lChksum+=sMagic.at(lSum%30)*((i%2)+1); // Sum even bytes twice
lSum/=7;
}
sResult+=(sMagic.at(lChksum%36));
sResult+="-";
lChksum=0;
lSum=lSum1*lSum1/5;
for(i=0;i<5;i++){
sResult+=sMagic.at(lSum%30);
lChksum+=sMagic.at(lSum%30)*((i%2)+1); // Sum even bytes twice
lSum/=11;
}
sResult+=(sMagic.at(lChksum%36));
sResult+="-";
lChksum=0;
lSum=lSum1*lSum1/7;
for(i=0;i<5;i++){
sResult+=sMagic.at(lSum%30);
lChksum+=sMagic.at(lSum%30)*((i%2)+1); // Sum even bytes twice
lSum/=17;
}
sResult+=(sMagic.at(lChksum%30));
return sResult;
}
int main(void){
string sName;
string sRegstr;
// Output the prompt for user
cout << "Registration Code Generator DEMO program version 1.00" << endl;
cout << "By Jason Li, 2001. For test purpose only." << endl;
cout << endl;
// Loop until the user name is legal to the algorithm
do{
// Get the user name
cout << "Enter the user’s name (5 chars min), followed by comma(,): ";
getline(cin, sName, ’,’);
}while(sName.length()<=5);
cout<<"User "<<sName;
sRegstr=GetRegstr(sName);
cout<<" has the registration string of "<<sRegstr;
cout<<endl;
return 0;
}

措施按ANSI C++尺度编写,在Visual C++ 6和GNU C++中运行通

 

    关键字:

天才代写-代写联系方式