你好,欢迎来到电脑编程技巧与维护杂志社! [免费注册][请登录 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 计算机安全与维护
用软件加密技术
 

 

一、引言

在互联网飞速发展的今天,大量单位和个人以网络为平台进行软件等信息产品的传播,形成一种新的网络运营模式。通过网络,人们可以方便地下载、使用和复制软件,而作为计算机软件本身而言,它是一种特殊的产品,如果企业或个人没有给自己开发的软件采取防盗版措施,那么该软件就极易被复制使用,甚至被恶意者破坏,给企业或个人带来经济损失。为了有效地保护计算机软件的产权,一般采取一些加密手段来保护自己的软件。

二、加密手段

通常,防御最终用户试图非法获得软件的手段是进行身份认证,大致有以下几种方法:

1.在安装过程要求输入产品的序列号,如Windows 98office 97等,由于序列号具有通用性,很难保证用户不盗用他人的许可证,这很难从根本上解决每一用户都不侵犯著作者的知识产权。

2.在软件安装或使用软件的时候要求用户在软驱中插入软件附带的密钥盘,这种加密的原理是在软盘的特殊位置写入一些信息,软件在运行时要检验这些信息。这种软盘就好像一把钥匙,软件开发商只需一次投资购买一套加密工具就可以自己制作多张钥匙盘。此方法加密简单,成本低,在软件发展的不同时期都能看到其闪光点。由于软盘是一种易损载体,加密软件对软件加密点的反复读写很容易造成软盘的损坏。而这张加密盘又不能备份,软件公司要不断应付用户更换加密盘的请求。

3.在软件安装完成后要求用户通过Internet注册产品序列号,注册成功后可以使用该软件,或给最终用户一段时间的试用期限,如果超过期限且未联网注册,则强迫终止用户对该软件的使用,这种方式比较方便,而且具有较好的加密性能,但对于不能联网的计算机有时也会出现一些麻烦。

4.采用软件加密狗,它是一种智能型的软件加密工具,包含一个安装在计算机并行口或 USB 口上的硬件,及一套适用于各种语言的接口软件和工具软件。是基于硬件加密技术,其目的是通过对软件与数据的加密防止知识产权被非法使用。这种方式加密性能好,但造价稍高。

本文将主要对第二、三方法的实现进行介绍。

三、预备知识

磁盘序列号,简称磁盘ID,是对磁盘格式化时随机产生的磁盘标识信息,是一个卷序列号,该序列号一般是唯一的,重复率为百亿分之一。在MSDOS下键入dir命令回车,屏幕会显示当前磁盘的卷标序列号信息,如:584FFB76,是一个16进制数值,用高级语言程序也可以读出这个序列号来。我们可以把这个序列号通过逻辑运算进行加密,将加密后的结果以许可文件的形式写回磁盘,这样就保证磁盘和磁盘里的许可文件一一对应,防止了对该盘的复制,这就是第二种加密方式中许可盘的制作方法。对于第三种方式则可以利用最终用户机器的唯一标识,如硬盘序列号,由应用程序读取用户硬盘序列号,加密后形成一个文件或一个字符串,用户发送这个文件或字符串到软件制作者,软件制作者把这个文件或字符串按照预定的算法加密后发给用户注册。这样也可以保证注册文件和机器唯一对应,防止了用户随意拷贝应用程序。关于软件试用期,则还需要在用户第一次运行程序的时候把运行的时间加密后写入系统注册表的一隐蔽位置,以后启动该程序的时候先检测注册文件,如果没有注册,则检测注册表来判断软件是否过期,并当用户没有注册的时候提示用户注册,如果已经注册则跳过这一步。在本文中为使程序简单,暂时不考虑试用期的情况。以下是读取磁盘序列号的函数:

BOOL GetVolumeInformation(
  LPCTSTR lpRootPathName,        // address of root directory of the  file system
  LPTSTR lpVolumeNameBuffer,     // address of name of the volume
  DWORD nVolumeNameSize,         // length of lpVolumeNameBuffer
  LPDWORD lpVolumeSerialNumber,  // address of volume serial number
  LPDWORD lpMaximumComponentLength, // address of system's maximum filename length
  LPDWORD lpFileSystemFlags,     // address of file system flags
  LPTSTR lpFileSystemNameBuffer, // address of name of file system
  DWORD nFileSystemNameSize      // length of lpFileSystemNameBuffer
);

四、实现过程

 

1. 具体实现

Visual Basic6.0(以下简称VB)为例说明,其他语言的实现方法类似。首先,注册程序要在应用程序执行之前启动,可以把这段检测代码放在第一个窗体的载入过程或放在模块的Sub Main()函数中,并在工程属性中设定启动项。本程序放入Sub Main()函数,在VB工程中添加一模块,通过API Viewer复制GetVolumeInformation函数至添加的模块中,并添加以下函数:

Function EnCode(Data As String, Key As String) As String  `数据加密函数

    Dim Res As String

    Dim KeyLen, DataLen, KeyPos As Integer

    Res = ""

    KeyPos = 1

    KeyLen = Len(Key) '密钥的长度

    DataLen = Len(Data) '待加密数据的长度

    For i = 1 To DataLen

Res = Res & Chr(Asc(Mid(Data, i, 1)) Xor Asc(Mid(Key, KeyPos, 1))) '数据和密钥进行异或操作,用相同的密钥加密2次,可以回复到原来的数据,这样软件著作者,很容易得知用户的磁盘序列号。

    KeyPos = KeyPos + 1

    If KeyPos > KeyLen Then KeyPos = 1

    Next i

    EnCode = Res

End Function

Function GetRegData() As String '读取注册文件内的信息

    Dim RegData As String

    Open "reg.dat" For Input As #1

    Line Input #1, RegData

    Close #1

    GetRegData = RegData

End Function

Sub SetErrorDataToFile(Data As String) '写信息至注册文件

    Dim RegData As String

    Open "reg.dat" For Output As #1

    Print #1, Data

    Close #1

End Sub

Sub main()

    Dim VolumeNameBuffer As String

    Dim VolumeNameSize As Long

    Dim VolumeSerialNumber As Long

    Dim MaximumComponentLength As Long

    Dim FileSystemFlags As Long

    Dim FileSystemNameBuffer As String

    Dim FileSystemNameSize As Long

    Dim TheData As String

    Dim ThisData As String

Dim RegData As String

`获取磁盘序列号

GetVolumeInformation "c:\", VolumeNameBuffer, VolumeNameSize, VolumeSerialNumber,

MaximumComponentLength, FileSystemFlags, FileSystemNameBuffer, FileSystemNameSize

    TheData = Str(VolumeSerialNumber) '把磁盘序列号转化为字符串的形式

    ThisData = EnCode(TheData, "comprg.com") '以“comprg.com”为密钥对磁盘序列号进行加密

    RegData = GetRegData() '从注册文件中读取注册信息

    If ThisData <> RegData Then

    MsgBox "没有注册,退出!"

    SetErrorDataToFile EnCode(TheData, "xyz") '用户没有注册,把磁盘序列号以“xyz”加密后写回注 

`册文件

    Exit Sub

    End If

    Load Form1 '进入应用程序

    Form1.Show

End Sub

软件作者运行的生成用户注册文件的主要程序如下:

Private Sub CmdOK_Click() '根据用户发送的序列号信息生成正确的软件注册信息

    Dim TheData As String

    Dim RegData As String

    If TxtCode.Text = "" Then

    MsgBox "没有任何数据"

    Exit Sub

    End If

    TheData = EnCode(TxtCode.Text, "xyz") '还原用户磁盘序列号

    RegData = EnCode(TheData, "comprg.com") '重新加密用户磁盘序列号

SetRegDataToFile RegData '把加密后的序列号信息写入文件

MsgBox "终端用户注册文件已生成!"

End Sub

五、结语

本文分析了应用软件加密的基本方法和思想,并给出了一种数据加密的算法,用VB实现,该方法同样可适用于其他高级语言。如果把生成正确注册号的算法应用于网络,用户便可以运用reg.dat的内容,随时通过网络注册并获得正确的序列号。由于加密密钥的长度本身可变,文中的算法只要稍加改动,即可有效防止非法用户破解软件注册码而实施盗版的企图,保护了软件的知识产权。

参考文献

MSDN library Visual Studio 6.0

  推荐精品文章

·一文解读:工程师常用的接口大全
·谷歌在深圳设立办公室 或专注硬件业务
·甲骨文发布关键补丁 修复英特尔芯片漏洞
·容器圈2017年回顾及2018年技术热点预测
·外媒速递:Web开发者与用户界面开发者之间…
·在2018年最值得去学习的编程语言
·共享医疗来了!温州全民健康信息化“十三…
·百度 CES 发布会:重磅推出 Apollo 2.0,…
·数据科学热到爆,如何让数据成为运维的大…
·芯片涨价潮再度来袭,2018芯片国产化迫在…
·美团云+AI,打造最开放人工智能平台,带来…
·京东京麦:微服务架构下的高可用网关与容…
·阿里云计算公司总部效果图曝光 预计2021年…
·东进:加密将成为中国企业数据安全的标配…

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备06048724号,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区长春桥路5号6号楼1209室,邮编:100089