问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

请问怎么给软件加注册验证

发布网友 发布时间:2022-04-21 09:46

我来回答

1个回答

热心网友 时间:2023-08-25 14:47

要实现软件注册功能,首先需要知道实现注册机制要涉及到的几个问题:1、如何加入注册检测,判断软件是否注册;2、如何生成注册码,如何保证一个用户名只生成与之唯一对应的注册码;3、在软件不注册情况下,如何*软件功能的局限性;4、对已经负费使用用户而言,不应造成使用不便。

首先,应该有一个生成注册码的算法,以下是我简单的一个生成15位注册码的算法:
//该函数返回一个CSTRING类型的15位注册码,入口参数为用户名
CString GetRegPasswd(CString &DirName)
{
//将用户名换算成15位注册码
long Num1,Num2,Num3;

char sn[16]={0};
CString p;
int i,len;

Num1=0;
Num2=0;
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(DirName[i-1])+1)))%100000;
//第二步算法
Num2=(Num2*i+(long(pow((int)DirName[i-1],2)*i)))%100000;
//第三步算法
Num3=(Num2+(long)sqrt(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;
}
//检查软件是否注册的函数

BOOL GetRegFlag(void)
{
HKEY hKey = NULL;
BYTE i;

CString str;
str.LoadString(IDS_REG_KEY);// IDS_REG_KEY为在注册表中的子目录字符串

if (RegCreateKey(HKEY_CURRENT_USER, str, &hKey) != ERROR_SUCCESS) return false;

DWORD cbA;
cbA=sizeof(int);
if( RegQueryValueEx(hKey, "SzMima",NULL,NULL, &i,&cbA) != ERROR_SUCCESS)
return false;

BYTE j=i;
if(j==0)//0代表软件已经注册,可以正常使用
{
RegCloseKey(hKey);
return true;
}
else
{
RegCloseKey(hKey);
return false;
}

return false;
};
//设置软件已经注册标志的函数

BOOL SetRegFlag(void)
{
HKEY hKey = NULL;
BYTE i;

CString str;
str.LoadString(IDS_REG_KEY);// IDS_REG_KEY为在注册表中的子目录字符串

if (RegCreateKey(HKEY_CURRENT_USER, str, &hKey) != ERROR_SUCCESS) return false;

BYTE j=0;//0代表已经注册
if(RegSetValueEx(hKey, "SzMima", 0, REG_BINARY, &j,4) != ERROR_SUCCESS)
{
AfxMessageBox("设置注册表数据失败!");
return FALSE;
}
return false;
};
以上三个函数即可实现软件注册机制,只需要在程序初始化的时候加入以下几句代码即可
BOOL bReg= GetRegFlag ();
if(!bReg)
{
//在此加入*功能或者拒绝是使用的代码
}
如果用户注册只需要加入以下代码即可
//这是我的程序中的一个注册界面,输入用户名和注册码提交后检验注册码是否正确的代码
void CRegEdit::OnBnClickedOk()
{
if(!UpdateData()) return;//取得编辑框的内容,并赋值到类变量中

m_RegUser.TrimLeft();//m_RegUser是用户名
m_RegUser.TrimRight();
if(m_RegUser.IsEmpty())
{
AfxMessageBox("用户名不能为空,请重新输入。");
GetDlgItem(IDC_REGUSER)->SetFocus();
return;
}
m_RegPasswd.TrimLeft();m_RegPasswd是注册码
m_RegPasswd.TrimRight();
if(m_RegPasswd.IsEmpty())
{
AfxMessageBox("注册码不能为空,请重新输入。");
GetDlgItem(IDC_REGPASSWD)->SetFocus();
return;
}
CString Passwd;
Passwd=GetRegPasswd(m_RegUser);//调用算法取得该用户名的注册码
if(Passwd==m_RegPasswd)//与用户输入的注册进行比较
{
SetRegFlag();//设置注册标志
OnOK();
}
else
AfxMessageBox("注册码错误,请重新输入。");
UpdateData(false);
}

RSA做软件的注册功能,如果密钥设置的比较大位数的话,基本别人是无法写出注册机的,但是防止别人暴破你的程序又是另一回事了。
Imports System.Security.Cryptography
Imports System.Text
Imports System.IO
Imports System.Xml

Public Class FrmReg
Inherits System.Windows.Forms.Form

'Dim xmlKeys As String 'A combination of both the public and 'private keys
'Dim xmlPublicKey As String 'The public key only
''The plaintext message in a byte array
'Dim PlainTextBArray As Byte()
''The cyphertext message in a byte array
'Dim CypherTextBArray As Byte()

#Region " Windows 窗体设计器生成的代码 "

Public Sub New()
MyBase.New()

'该调用是 Windows 窗体设计器所必需的。
InitializeComponent()

'在 InitializeComponent() 调用之后添加任何初始化

End Sub

'窗体重写 dispose 以清理组件列表。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

'Windows 窗体设计器所必需的
Private components As System.ComponentModel.IContainer

'注意: 以下过程是 Windows 窗体设计器所必需的
'可以使用 Windows 窗体设计器修改此过程。
'不要使用代码编辑器修改它。
Friend WithEvents btnReg As System.Windows.Forms.Button
Friend WithEvents btnexit As System.Windows.Forms.Button
Friend WithEvents Label1 As System.Windows.Forms.Label
Friend WithEvents Label2 As System.Windows.Forms.Label
Friend WithEvents txtRegCode As System.Windows.Forms.TextBox
Friend WithEvents txtRegName As System.Windows.Forms.TextBox
Friend WithEvents LinkLabel1 As System.Windows.Forms.LinkLabel
Private Sub InitializeComponent()
Me.btnReg = New System.Windows.Forms.Button
Me.btnexit = New System.Windows.Forms.Button
Me.txtRegName = New System.Windows.Forms.TextBox
Me.Label1 = New System.Windows.Forms.Label
Me.Label2 = New System.Windows.Forms.Label
Me.txtRegCode = New System.Windows.Forms.TextBox
Me.LinkLabel1 = New System.Windows.Forms.LinkLabel
Me.SuspendLayout()
'
'btnReg
'
Me.btnReg.FlatStyle = System.Windows.Forms.FlatStyle.Flat
Me.btnReg.Location = New System.Drawing.Point(64, 192)
Me.btnReg.Name = "btnReg"
Me.btnReg.Size = New System.Drawing.Size(75, 24)
Me.btnReg.TabIndex = 0
Me.btnReg.Text = "注册(&R)"
'
'btnexit
'
Me.btnexit.FlatStyle = System.Windows.Forms.FlatStyle.Flat
Me.btnexit.Location = New System.Drawing.Point(168, 192)
Me.btnexit.Name = "btnexit"
Me.btnexit.Size = New System.Drawing.Size(75, 24)
Me.btnexit.TabIndex = 1
Me.btnexit.Text = "取消(&C)"
'
'txtRegName
'
Me.txtRegName.Location = New System.Drawing.Point(8, 24)
Me.txtRegName.Name = "txtRegName"
Me.txtRegName.Size = New System.Drawing.Size(296, 21)
Me.txtRegName.TabIndex = 2
Me.txtRegName.Text = ""
'
'Label1
'
Me.Label1.Location = New System.Drawing.Point(8, 0)
Me.Label1.Name = "Label1"
Me.Label1.Size = New System.Drawing.Size(48, 16)
Me.Label1.TabIndex = 3
Me.Label1.Text = "注册名:"
'
'Label2
'
Me.Label2.Location = New System.Drawing.Point(8, 56)
Me.Label2.Name = "Label2"
Me.Label2.Size = New System.Drawing.Size(56, 16)
Me.Label2.TabIndex = 4
Me.Label2.Text = "注册码:"
'
'txtRegCode
'
Me.txtRegCode.Location = New System.Drawing.Point(8, 80)
Me.txtRegCode.Multiline = True
Me.txtRegCode.Name = "txtRegCode"
Me.txtRegCode.Size = New System.Drawing.Size(296, 104)
Me.txtRegCode.TabIndex = 5
Me.txtRegCode.Text = ""
'
'LinkLabel1
'
Me.LinkLabel1.Location = New System.Drawing.Point(128, 56)
Me.LinkLabel1.Name = "LinkLabel1"
Me.LinkLabel1.Size = New System.Drawing.Size(128, 16)
Me.LinkLabel1.TabIndex = 6
Me.LinkLabel1.TabStop = True
Me.LinkLabel1.Text = "http://Testbug.Net"
'
'FrmReg
'
Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)
Me.ClientSize = New System.Drawing.Size(306, 223)
Me.Controls.Add(Me.LinkLabel1)
Me.Controls.Add(Me.txtRegCode)
Me.Controls.Add(Me.txtRegName)
Me.Controls.Add(Me.Label2)
Me.Controls.Add(Me.Label1)
Me.Controls.Add(Me.btnexit)
Me.Controls.Add(Me.btnReg)
Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle
Me.MaximizeBox = False
Me.Name = "FrmReg"
Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
Me.Text = "RSA&MD5注册例子程序 by www.TestBug.net"
Me.TopMost = True
Me.ResumeLayout(False)

End Sub

#End Region

Private Sub btnexit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnexit.Click
Application.Exit()
End Sub

Private Sub btnReg_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnReg.Click
If txtRegName.Text = "" Then
MessageBox.Show("注册名不能为空", "提示")
Return
Else
If txtRegCode.Text = "" Then
MessageBox.Show("注册码不能为空", "提示")
Return
Else
If txtRegCode.Text.Length <> 172 Then
MessageBox.Show("注册码长度不对", "提示")
Return
End If
End If
End If
Try
Dim RSA As System.Security.Cryptography.RSACryptoServiceProvider = New System.Security.Cryptography.RSACryptoServiceProvider
'公钥
RSA.FromXmlString("xzALwAOqEcj8jWrKXyaecAhyz9W+wH26K8ZcMv9ZFYDJeR5jMhK7AhNbwn+q1mAH7VV146v6S2SlJeErEvTXS3dJR0pjaED0R2JSf0FwrWP6CDsKREQC803E+Faaw/Kou134K6mejPg16dxYfcIlJgoWRqn58qnjo6g87XlUMUs=AQAB")
Dim RSADeformatter As System.Security.Cryptography.RSAPKCS1SignatureDeformatter = New System.Security.Cryptography.RSAPKCS1SignatureDeformatter(RSA)
'指定解密的时候HASH算法为MD5
RSADeformatter.SetHashAlgorithm("MD5")
Dim Regcode As Byte() = Convert.FromBase64String(txtRegCode.Text)
Dim RegName As Byte() = (New System.Text.ASCIIEncoding).GetBytes(txtRegName.Text)
Dim dataToHash As Byte() = (New System.Text.ASCIIEncoding).GetBytes(txtRegName.Text)
Dim hash As Byte() = CType(System.Security.Cryptography.CryptoConfig.CreateFromName("MD5"), System.Security.Cryptography.HashAlgorithm).ComputeHash(dataToHash)
'验证签名
If RSADeformatter.VerifySignature(hash, Regcode) Then
'注册通过的话就写入注册文件
Dim textWriter As XmlTextWriter = New XmlTextWriter("reg.xml", Nothing)
textWriter.WriteStartElement("RegInfo")
textWriter.WriteStartElement("RegName")
textWriter.WriteString(txtRegName.Text)
textWriter.WriteEndElement()
textWriter.WriteStartElement("RegCode")
textWriter.WriteString(txtRegCode.Text)
textWriter.WriteEndElement()
textWriter.Close()
MessageBox.Show("注册正确,谢谢注册本软件,请重新启动程序完成注册", "提示")
Application.Exit()
Else
MessageBox.Show("错误的注册码", "提示")
End If
Catch ex As Exception
'MessageBox.Show(ex.Message())
MessageBox.Show("错误的注册码", "提示")
End Try
End Sub

Private Sub FrmReg_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed
Application.Exit()
End Sub

Private Sub LinkLabel1_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkLabel1.LinkClicked
System.Diagnostics.Process.Start("http://testbug.net")
End Sub
End Class

参考资料:http://www.sowto.com/Article/cxsj/200602/Article_5362.html

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
第二次世界大战进一步爆发的标志是( )。 第二次世界大战扩大到最大规模、成为一场名符其实的世界大战的标志是... 第二次世界大战达到最大规模的标志是 [ ] A.德军突袭波兰,英法对德宣战... 笔记本电脑连接蓝牙音箱,小爱小度亲测有效!台式电脑估计也可以。_百度... 小爱音箱怎么连接到电脑上? 小爱音箱2怎么连接电脑? 如何将小爱音箱和电脑连接 ...打开文件 右击就能打印 现在右键的命令没有打印这一项 苹果雷雳4Pro 连接线 1m 评测:集快充、数据传输、视频传输于一身_百... 有一个健康问题我很想问一下大家,希望大家给我指导一下,如有答得对的... 最新的世界俱乐部排名 有什么办法可防止电脑自动跳网页? 设置的时间到了,电脑屏幕保护程序不执行怎么办 下面的命令是什么意思? 我家被恶意网站侵蚀!我没办法清除谁有可以清除的软件! ie浏览器主页被篡改 哪里有世界上所有国家地区的中英文对照表. 正则表达式怎么获取&lt;option&gt;中的属性 电脑初学者必需的60个电脑技巧 小弟跪求卡巴斯基反病毒6.0激火码。一定能用的哦。或者给KEY也行 钻杆接头的类型以及扣型的表示和识别方法; TR.WinREG.StartPage.dj.104是什么恶意木马? 趋势科技软件如何彻底删除 电脑卸载不了趋势杀毒软件 趋势科技网络版怎么卸载 怎么卸载趋势科技防毒墙网络版,更改注册表那套没用 如何卸载趋势科技 怎么卸载趋势杀毒软件? 怎么卸载趋势科技杀毒软件 如何卸载360杀毒软件 注册表的run项为何被锁定??如何解除? 1688运费险怎么赔付呢 404 Not Found 指数函数中同底数不同指数的怎么比较大小 div css 门户架构 怎样比较计算底数相同,指数不同的数的大小 D-link路由器怎么登陆 指数函数中同底数不同指数的怎么比较大小 HD音频是什么 幂函数的底数一样,指数不同,幂值大小判断依据 底数不同指数相同比大小和底数相同指数不同比大小的方法是什么?麻烦说的详细些。谢谢 什么是HDMI,CE-LINK的HDMI线好不好? 对数比大小 和指数比大小 解释下 HDMI的cec功能 指数函数中同指数不同底数的怎么比较大小 D_Link和Tp_Link路由器哪个好? 同指数不同底的对数函数怎么比较大小? 求路由器排行榜,有哪些比较推荐? 数学幂函数的大小怎样比较 播放器的HD是什么意思?