为保护软件开发者的利益,打击盗版软件,我们提出一种基于信息隐藏、非对称加密体制、单向散列函数的软件保护方法,这种结合防范明码,加密、信息隐藏等技术,与传统的方法相比,该方法具有加密强度高、成本低、安全可靠等特点。

一、软件加密算法的思路、流程

1、信息隐藏实现模型

图像信息隐藏系统的模型如图1所示。

软件加密中数字水印技术的应用
2、软件加密算法的设计原理_

机器指纹可以根据计算机的CPU序号、网卡的MAC地址等,可以唯一标志计算机身份的信息产生,其指纹与计算机是一一对应的。用户将机器指纹提供给开发商后,得到开发商提供的一个加密的BMP图像,这个图像中隐藏着重要的注册信息,用户按照提示把加密的BMP图像放到指定的位置。重新运行软件,软件首先对图片文件进行加密、数字签名、图像完整性等的检验,检验是否这张图片是来自开发商、在传输的过程中有没有被第三方修改等,如果进行以上的检测后发现异常,则立即中止程序的运行。如正确则解密BMP图像,从中读取隐藏在其中的注册码,与正确的相比较,如果正确,则运行;否则拒绝执行。

3、软件加密算法的流程设计

软件开发商在收到用户提供的机器指纹以后,对任何一张BMP文件加密、隐藏、数字签名等一系列的操作(图2)。

软件加密中数字水印技术的应用

用户在得到开发商提供的BMP图像后,按照要求把其放人指定的位置,运行程序后,软件内部验证模块运行(图3)。

软件加密中数字水印技术的应用

二、软件加密算法、数字水印加密算法实现

1、公钥加密体制

RSA加密算法是公钥加密体制中最负盛名的算法,该加密体质既可用于加密,也可以用于数字签名。另外,该加密算法思想简单,易于理解,易于程序实现。RSA加密算法经过各界多年的深入分析,到目前仍然是安全的,且是最为广泛采用的一种加密体制。其安全性是基于整数的因子分解困难性。它的私钥参数d,公钥参数e,满足一定的条件,即ed =l modφn,其中n是两个素数之积,φ是Euler函数。现在其采用的模数n一般位数达上百比特,甚至上千比特。而明文和密文间就是0到(n-1)之间的数值。

RSA加密算法的明文和密文之间就是0到(n-1)之间的数值,显然,RSA加密算法是属于分组加密体制的。明文、密文分组分别用M,C表示,公钥、私钥参数分别用e,d表示,那么RSA加密算法可以简单的叙述为:

加密:C=Memod n

解密:M=Cdmod n

其中n是两个非常大的两素数之积。要计算出大素数的积是十分容易的,但要分解两个大素数之积却是很困难的。

2、SHA加密算法

安全散列算法(SHA:Secure Hash Algorithm)是美国NIST和NSA共同设计的—个标准,用于作为数字签名标准( DSS)的散列函数,产生数据摘要。 SHA的要求是消息长度小于264比特,输出的散列长度为160 Bit,分组长度是512 Bito在计算上保证不可能根据消息摘要取得原消息;不可能找两个消息,产生相同的消息摘要。

3、注册码的唯一性

计算机指纹是每个计算机唯一的一个身份编号,软件使用计算机指纹来识别是否是同一个计算机。不管系统如何变化,计算机指纹始终不会改变,即使某个计算机上的软件被解密,但仅仅是这么一个计算机而已,不可能造成注册码的广泛传播。在这里,取CPU的ID作为计算机的指纹,每块CPU在生产出来后,都有一个唯一的编号标志自己,且不会与其它CPU重复。

4、软件加密算法的设计

明码泄漏是因为局部变量通常都是存储在堆栈中的,而软件作者一般都使用局部变量存放临时计算出来的注册码,以比较真假,使得它们的位置很接近。“序列号= F(用户名)"算法计算出来的序列号是以明文形式在内存中出现的,很容易在内存中找到它,从而获得注册码。稍不留意还会造成明码泄漏。

为了避免程序中出现明码,提出以下加密算法。

软件注册码验证模块:

tmp1=SHA -1( USERNAME +ID)

tmp2=RSA_Encrypt( License Key)

if tmp1=tmp2,则注册成功,否则失败

软件作者可用如下生成License Key:

tmp1=SHA -1(USERNAME +ID)

License Key=RSA_Decrypt( tmp1)

由于RSA加密算法加密一个信息msg,pri为私钥,pub为公钥:

Encrypt: ret_enc - msg^pri;

Decrypt: ret_dec=rec_enc^pub=msg;

USERNAME+ID经过SHA -1哈希后,成为一个长为160 Bit的字符串,可以理解为上面的msg。然后使用RSA加密算法验证。由于pub是公开的,可以验证ret_enc是不是私钥pri加密的,但却很难生成ret enc。

5、信息隐藏

由于任何文本文件(TXT)都是由字符流构成的,每个字符占用1个字节,由一个ASCII CODE表示。每个字节都是由8个二进制位构成的,如下所示。

软件加密中数字水印技术的应用

注册码的第一位H用二进制表示为010010010:先用输入的密码和每一个注册码进行and操作,加强密码的强度。

1)“Hi"——二进制位 01001000  01101001

注册码的每一位如H的二进制与输入的密码如1234进行and操作:o1oo1ooo and o0000001=00000000

2)部分BMP文件数据

软件加密中数字水印技术的应用

将加密后的密文一次写入BMP文件中。

从外观上软件加密后的文件和一般的BMP文件没有任何区别,而且软件加密前后位图文件大小也不会发生变化。其次,由于冗余位的存在,在密码学上往往采取加大冗余位的方式来提高软件加密的可靠性,显然这种拥有大量冗余码的软件加密方法还是颇为可靠的。最后,破译者并不知晓软件加密所采取的协议,而且待软件加密的内容都同加密密钥经过了异或运算,在没有正确加密密码的情况下也是很难破译的。

小知识之数字水印技术

数字水印(Digital Watermarking)技术是将一些标识信息(即数字水印)直接嵌入数字载体(包括多媒体、文档、软件等)当中,但不影响原载体的使用价值,也不容易被人的知觉系统(如视觉或听觉系统)觉察或注意到。通过这些隐藏在载体中的信息,可以达到确认内容创建者、购买者、传送隐秘信息或者判断载体是否被篡改等目的。