1,在本文中,我试图将算法中经典的动态规划设计用于软件加密,可结合其他加密算法共同使用。
2,以C++实现,不进行API调用,主要关注算法在软件保护方面的灵活运用。
3,欢迎各位进行破解尝试,源代码附有示例姓名与序列号。
4,原创拙作,水平有限,欢迎各位给予指点。
Green Tsai
代码:
/* Name: 动态规划算法用于软件加密初探(1) Copyright: @Green Tsai Author: Green Tsai Date: 04-03-10 12:11 Description: 1,思路与想法:本程序试图将动态规划算法用于软件加密,并用动态规划中最经典的LIS(Longest Increasing Subsequence) 问题作一示例。 2,对软件进行非明码比较加密,避免一般的逆向破解。 3,示例姓名:kanxue,序列号:xbayczhfea80。 */ #include <cstdlib> #include <iostream> using namespace std; int Solve(char *a,int n); bool CheckName(char *name,int len); bool CheckSerial(char *serial,int len); bool CheckLen(int a,int b); int main(int argc,char *argv[]) { bool ok=false; while(ok==false) { char name[30],serial[30]; cout<<"Please input your name:"<<endl; cin>>name; cout<<"Please input your serial number:"<<endl; cin>>serial; int x=Solve(name,strlen(name)); int y=Solve(serial,strlen(serial)); // cout<<"strlen:"<<strlen(name)<<" "<<strlen(serial)<<endl; // cout<<x<<" "<<y<<endl; if(CheckName(name,strlen(name)) && CheckSerial(serial,strlen(serial)) && (2*strlen(name)==strlen(serial)) && (x==y) && (x>=3)) { ok=true; cout<<"Congratulations!"<<endl; cout<<endl; } else { cout<<"Sorry!"<<endl; cout<<endl; } } system("PAUSE"); return 0; } int Solve(char *a,int n) { int dp[30]; dp[0]=1; int ans=0; for(int i=1;i<n;i++) { int max=0; for(int j=0;j<i;j++) { if(a[i]>=a[j] && max<dp[j]) max=dp[j]; } dp[i]=max+1; if(ans<dp[i]) ans=dp[i]; } return ans; } bool CheckName(char *name,int len) { if(len>=3 && len<=10) return true; else return false; } bool CheckSerial(char *serial,int len) { if(len>=6 && len<=20) return true; else return false; }