1 题目
功能:非明码序列号保护
描述: 本实例的验证算法是将序列号分为 4 段,每段 5 个字符,每段之间以字符“-”分隔。计算每段所有 ASCI 码的和,如果第一段 ASC 码的和模 6 的值为 1, 第二段 ASC 码的和模 8 的值为 1, 第三段 ASC 码的和模 9 的值为 2, 第四段 ASCⅡ码的和模 3 的值为 0, 那么该序列号视为合法,否则非法。
2 思路
采用菲明码序列号保护的方式验证序列号比采用明码序列号保护的方式安全。因为,非明码序列号保护是通过将输入的序列号进行算法验证实现的,而明码序列号保护是通过将输入的序列号与计算生成的合法序列号进行字符串比较实现的。采用明码序列号保护的程序在注册时会生成合法的序列号,该序列号可以通过内存设断的方式获取。一而采用非明码序列号保护的方式无法通过内在设断的方式获取。
本实例的验证算法是将序列号分为 4 段,每段 5 个字符,每段之间以字符“-”分隔。计算每段所有 ASCI 码的和,如果第一段 ASC 码的和模 6 的值为 1, 第二段 ASC 码的和模 8 的值为 1, 第三段 ASC 码的和模 9 的值为 2, 第四段 ASCⅡ码的和模 3 的值为 0, 那么该序列号视为合法,否则非法。
3 代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
/**
功能:非明码序列号保护
描述:
本实例的验证算法是将序列号分为 4 段,每段 5 个字符,每段之间以字符“-”分隔。计算每段所有 ASCI 码的和,如果第一段 ASC 码的和模 6 的值为 1, 第二段 ASC 码的和模 8 的值为 1, 第三段 ASC 码的和模 9 的值为 2, 第四段 ASCⅡ码的和模 3 的值为 0, 那么该序列号视为合法,否则非法。
**/
intgetsn1(char*str) {
inti;
intsum;
sum=0;
for(i=0;i<5;i++) {
sum=sum+toascii(str[i]);
}
printf("%d\n",sum%6);
returnsum;
}
intgetsn2(char*str) {
inti;
intsum;
sum=0;
for(i=6;i<11;i++) {
sum=sum+toascii(str[i]);
}
printf("%d\n",sum%8);
returnsum;
}
intgetsn3(char*str) {
inti;
intsum;
sum=0;
for(i=12;i<17;i++) {
sum=sum+toascii(str[i]);
}
printf("%d\n",sum%9);
returnsum;
}
intgetsn4(char*str) {
inti;
intsum;
sum=0;
for(i=18;i<23;i++) {
sum=sum+toascii(str[i]);
}
printf("%d\n",sum%3);
returnsum;
}
intmain(intargc,charconst*argv[]) {
charstr[23];
printf("\nplease input the serial number:\n");
scanf("%s",str);
if(strlen(str)==23&&str[5]=='-'&&str[11]=='-'&&str[17]=='-') {
if(getsn1(str)%6==1&&getsn2(str)%8==1&&getsn3(str)%9==2&&getsn4(str)%3==0) {
printf("%s\n","register succeed");
return0;
}else{
printf("%s\n","register Lose");
return-1;
}
}else{
printf("%s\n","register Lose");
return-1;
}
}
示例结果:
$ gccex070.c-odemo
$ ./demo
please input the serial number:
11113-22221-33332-11112
register succeed
$ ./demo
please input the serial number:
11113-22221-33332-11111
register Lose