回 帖 发 新 帖 刷新版面

主题:编写的数据库程序如何实现软加密?

本人在写一个数据库程序,因为该程序是针对行业的程序,这样程序写完后就可以把它卖到这个行业里,但是自己也不会写加密程序,不知道如何才能将程序进行软加密呢?
比如说一个序列号只能应用一台机器,既使别的机器使用该序列号的软件也不好使呢!

回复列表 (共3个回复)

沙发

工程文件:

begin
  获得本机硬盘序列号、网卡序列号、主板序号...;
  对上述信息进行只有你自己知道的运算处理,形成一个字符串TrueKey;
  查找注册表里或程序路径下有没有相应的Key标记;
  如果没有,则弹出一个要求输入注册码的窗口
      如果不输入注册码,或注册码不等于TrueKey,则退出程序;
      如果输入的注册码正确,则把该码写到注册表里或程序路径下;
  正常启动程序
end;

板凳

另外,程序中需要有提交本机硬盘序列号、网卡序列号、主板序号...等信息的部分,注意不是提交TrueKey。可以用网上注册的方式。你知道他的这些信息后,就经你运算,算出TrueKey,然后告诉你的用户。

3 楼

收到你的站内短消息。即兴给你写了一个Demo,希望对你有帮助。
因我未在应用项目中使用这种注册方案,所以不知其实用性如何。如果你使用这种方案,希望你能通过站内短信向我反馈应用效果。

这个方案的关键之处,就在于对用户机器及操作系统信息的加密处理的程度。你可以看到,注册码直接放到了程序目录下,但其他用户即使复制这个注册码,也是无用的。

Demo中部分代码需要你从网上下载成熟源码参考。因是演示,所以,假设的用户电脑信息字符串为'abcd',加密后的注册码为'bacd'。你只需在注册窗口中提交注册码bacd即可打开程序主窗口。注册码被保存在程序目录下的key.txt。

//-----以下是工程文件----------

program Prj_RegDemo;

uses
  Forms, Windows, SysUtils,
  Unt_MainForm in 'Unt_MainForm.pas' {MainForm},
  Unt_RegForm in 'Unt_RegForm.pas' {RegForm};

{$R *.res}

var
  Key, TrueKey, RegisterKey : string;
  F : TextFile;
  Registed : Boolean;

begin
  Application.Initialize;

  Registed := False; //初始值本就是False。
  Key := GetUserInfo;
  TrueKey := GetTrueKey(Key);
  if FileExists(SysUtils.ExtractFilePath(Application.ExeName)+'Key.txt') then
     begin
     AssignFile(F, SysUtils.ExtractFilePath(Application.ExeName)+'Key.Txt');
     Reset(F);
     ReadLn(F, RegisterKey);
     CloseFile(F);
     //只有程序目录下有正确的注册码,Registed才为True
     if RegisterKey = TrueKey then Registed := True;
     end;
  if Not Registed then //如果用户未注册或注册码不正确,则出现注册窗口
    begin
    RegForm := TRegForm.Create(nil);
    try
      RegForm.ShowModal;
    finally
      RegForm.Free;
    end;
    Application.Terminate; //注册窗口关闭后,程序退出
    end else begin  //如果用户已正确注册,则直接打开主窗口
    Application.CreateForm(TMainForm, MainForm);
    Application.Run;
    end;
end.


//--------以下是RegForm的单元文件--------

unit Unt_RegForm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

function GetUserInfo: string;
function GetTrueKey(Key : string): string;

type
  TRegForm = class(TForm)
    Edit_PleaseEnterUserMailAddr: TEdit;
    Edit_PleaseEnterYourSN: TEdit;
    Btn_Register: TButton;
    Btn_SendMail: TButton;
    Label1: TLabel;
    procedure Btn_SendMailClick(Sender: TObject);
    procedure Btn_RegisterClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  RegForm: TRegForm;

implementation

{$R *.dfm}

function GetUserInfo: string;
begin
  //获得用户机器的一些硬件信息和操作系统信息。网上有成熟代码。
  //此处用一个字符串'abcd'假设就是获得的上述信息
  Result := 'abcd';
end;

function GetTrueKey(Key : string): string;
var
  TempStr : string;
begin
  //你可以自己写一个对字符串进行加密处理的算法。
  //也可以参考Base64编码等算法
  //在此简单地把前二个字符互换,假设就是进行了加密处理
  TempStr := Key;
  TempStr[1] := Key[2];
  TempStr[2] := Key[1];
  Result := TempStr;
end;

procedure TRegForm.Btn_SendMailClick(Sender: TObject);
begin
  //把GetUserInfo获得的用户信息以及用户的邮址,通过电子邮件发到你的邮箱
  //如何发邮件?网上有成熟代码。
  ShowMessage('谢谢您申请注册!三日后请查询'+Edit_PleaseEnterUserMailAddr.Text+
              '邮箱,将会收到我们给您的注册码!');
  self.ModalResult := 1;
end;

procedure TRegForm.Btn_RegisterClick(Sender: TObject);
var
  F : TextFile;
begin
  AssignFile(F, SysUtils.ExtractFilePath(Application.ExeName)+'Key.txt');
  ReWrite(F);
  WriteLn(F, Edit_PleaseEnterYourSN.Text);
  CloseFile(F);
  ShowMessage('谢谢您提交SN!程序将关闭,请重新运行。');
  self.ModalResult := 1;
end;

procedure TRegForm.FormCreate(Sender: TObject);
begin
  Label1.WordWrap := True;
  Label1.Caption := '本软件注册后方可使用。如果您已经得到注册码,'+
                    '请在Edit_PleaseEnterYourSN框中输入您的注册码,'+
                    '然后点击Btn_Register按钮;'+
                    '如果您想现在申请注册码,请在Edit_PleaseEnterUserMailAddr'+
                    '框中输入您的常用邮箱,然后点击Btn_SendMail按钮。';
end;

end.

//----------以下是程序主窗口的单元文件(无内容)------

unit Unt_MainForm;
//这就是你自己的事情了。
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TMainForm = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

end.

我来回复

您尚未登录,请登录后再回复。点此登录或注册