当前位置:蚂蚁文档网 > 述职报告 > 基于RSA数字签名的注册码软加密保护方案在石油工控软件的应用

基于RSA数字签名的注册码软加密保护方案在石油工控软件的应用

时间:2022-05-17 10:20:05 浏览次数:

摘要:传统石油行业的工控软件多采用USB加密狗等硬加密方式对软件进行加密,但由于硬件的易复制、易丢失和易混淆等特点,造成了软件操作人员的使用不便,也给软件提供商增加了额外的成本开销。针对此现象,该文在充分调研当前软加密方法的基础上,提出了一种基于RSA数字签名的注册码软加密方法,并根据石油行业工控软件的应用特点,对其进行了加壳处理。该保护方案给其他行业软件的软件加密方式提供了一种思路。

关键词:软加密;RSA;MD5;注册码;加壳

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2017)33-0074-03

Abstract: Petroleum industrial control software always uses traditional USB encryption dogs or other hardware methods to encrypt the software, but for the hardware"s easy to copy, lose and to confuse which causes the software operators’ many inconvenience, and also caused the extra cost expense to the software supplier. In view of this phenomenon, this paper proposes a soft encryption method Based on RSA digital signature on the basis of fully investigating the current soft encryption methods, and carries on a shell processing according to the application characteristics of petroleum industry control software. This protection scheme provides a kind of thinking to the software encryption way of other industry software.

Key words: soft encryption; RSA; MD5; registration code; packers

随着计算机技术的不断发展,面向各行业和各应用的软件不断孕育而生[1]。计算机软件作为计算机产业的一种重要产品,其开发成本高、周期长,且需要巨大投入,而其生产和复制则十分容易,故对软件进行加密就成了保护软件的一种必要手段[2]。

依据加密原理和方式,目前所采用的软件加密方式主要可分为硬加密和软加密两大类。硬加密主要是指加密系统依赖于特定的“硬件”来实施加密的过程,如光盘加密、加密卡和加密狗等[1]。传统石油行业的工控软件多采用此种方式进行加密,一般是提供给用户一个硬件实体作为授权,但由于其易复制、易丢失和易混淆等特点,不但使软件提供商增加了额外的成本开销,且不能被很好地控制,并有效地利用互联网来进行分发,因此面向石油行业的工控软件提供商现希望升级成不依赖于硬件的软加密方式。

软加密主要是指用纯软件的方式来实现对软件的加密保护,其具有成本低、升级快的优势[3]。目前常见的软加密方法主要有注册码法、警告窗口法、时间限制法、功能限制法、注册文件法和加壳法[2]。本文主要研究注册码法和加壳法,并结合网络认证加密思想,提出了一种基于RSA数字签名算法的软加密方法,实现了对面向石油行业工控软件加密方式的升级。

1 基于RSA算法的注册码加密

本文提出了一种实用的软件注册码加密方法,主要包括两个模块:注册码的计算模块和校验模块。林提出了分离软件程序,把软件中的关键数据迁移到服务器中的思想,并论证了其优势和可行性[4]。注册码计算模块部署在服务端,可根据用户提供的计算机机器码计算出相应的注册码。校验模块内嵌于用户客户端中,主要完成计算机机器码的提取和注册码的校验功能。由于两个模块必须共享一些信息,导致破解者可通过静态分析和动态跟踪等手段破解注册码校验模块,从而间接地破解注册码计算模块。而公开密钥体制利用公钥和私钥来对数据进行加解密和数字签名的验证,而且从公钥无法推导出私钥。因此在软件加密中运用注册码加密方式必须使用基于公开密钥体制的数字签名算法[2]。

本文采用基于RSA数字签名算法的注册码加密方法。软件提供商先选定一个私钥/公钥对,私钥用来为用户计算机机器码产生数字签名,而此数字签名即为用户软件的注册码,公钥存在于用户软件客户端程序中,校验模块在得到用户计算机机器码后,利用公钥来验证数字签名[2]。RSA数字签名算法贯穿于注册码的计算和校验环节,其流程图如图1所示[3,5]:

1.1 注册码的计算

用戶将生成的计算机机器码通过E-mail发送给软件提供商,再由软件提供商用私钥对机器码进行加密,得到数字签名,并经Base64编码将所得注册码转化为可直接输入的字符,回传给用户[1]。使用RSA数字签名算法时,密钥的长度越长,加密的计算量就越大,保密强度也就越高,本文采用1024bit密钥。而由于计算机机器码的长度不定,需通过MD5消息摘要算法,产生固定长度的消息摘要,再将其作为RSA数字签名算法的消息输入[2]。

注册码的计算过程实际上就是数字签名的产生过程:

1) 生成密钥对:公钥为e,私钥为d,模数为n。

2) 将计算机机器码作为消息输入m,使用MD5算法生成计算机机器码的消息摘要[g=MD5(m)]。

3) 用私钥d对g进行加密,得到数字签名[s=gdmodn]。s即为与计算机机器码对应的注册码。

4) 将s作为注册码提供为用户。

1.2 注册码的校验

注册码的校验过程实际上就是对数字签名进行校验的过程:

1) 用户输入注册码s。公钥e和模数n以常数的形式存在与校验模块中。

2) 计算[g"=semodn]。

3) 计算[g=MD5(m)]。

4) 比较g和g’。如果相等则证实s是m的正确数字签名,即可确认用户输入的注册码是有软件提供商签发的[6]。

1.3 注册码的Base64编解码表示

Base64是一种很常见的编解码规范,其作用是将二进制序列转换为人类可读写的ASCII字符序列,常用在需要通过文本协议(比如HTTP和SMTP)来传输二进制数据的情况下。Base64并不是一种用于安全领域的加解密算法,而是一种编码(Encode)和解码(Decode)过程,其变换非常简单,仅仅是为避免信息在传输过程中被直接识别[7]。

2 机器码的生成

计算机机器码对每一个计算机都应是唯一的,考虑到计算机CPU-ID号和硬盘序列号都具有与操作系统无关的特性,能够唯一标识计算机,故可选取其作为计算机硬件的唯一标识。本文采用将用户计算机CPU-ID号和硬盘序列号根据一定规则混合,并通过消息摘要算法转变为固定长度的计算机机器码,其生成流程图如图2所示[8]:

对于获取CPU-ID号和硬盘序列号的计算机编程语言的选取上,考虑到C++语言反编译性强的特点,本文采用C++语言编写。

2.1 CPU-ID号的获取

读取CPU-ID号的方法如下:首先需创建一个完整的WMI客户端程序,以完成COM组件的初始化、连接本地主机WMI、同步检索数据以及注销组件等操作。其对应的C++关键代码如下:

HRESULT hr = pEnumerator→Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);

hr = pclsObj→Get(L"ProcessorId", 0, &vtProp, 0, 0);

return vtProp.bstrVal;

其中,pclsObj→Get(L" ProcessorId ", 0, &vtProp, 0, 0)函数的作用是获取本机CPU的ProcessorId属性,vtProp为其字符串缓冲区。

2.2 硬盘序列号的获取

读取硬盘序列号的C++关键代码如下:

HRESULT hr = pEnumerator→Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);

hr = pclsObj→Get(L"SerialNumber", 0, &vtProp, 0, 0);

return vtProp.bstrVal;

其中,pclsObj→Get(L"SerialNumber", 0, &vtProp, 0, 0)函数的作用是获取本机硬盘的SerialNumber属性,vtProp为其字符串缓冲区。

3 加壳软件保护

软件提供商一般不希望将软件源代码提供给用户,而只交付应用软件[4]。因此,我们需要一个加壳程序,所谓“壳”,就是用一些专门的压缩工具,对exe、com和dll等程序文件进行压缩,在程序中加入一段保护代码,使程序不被非法修改和反编译。加过壳的程序可以直接运行,但是不能查看源代码。通过相关实验发现,加过壳的软件要比没有加过壳的软件运行速度更快,其原因是在程序运行之前,首先将壳以及程序文件全部加载到内存中,然后使用CPU对壳就行解压缩,而后将程序文件释放到内存中,程序完全运行在内存中[9]。

4 在石油行业工控软件的应用

传统石油行业工控软件由于历史等原因多采用VB或C#等語言编写,而本文的注册码校验模块采用C++语言编写,故需并且将编译成了动态链接库DLL,这样当软件提供商在升级注册码保护方案时,不必重新给软件加壳,而只需用新的动态链接库替换旧的版本即可[10]。下面以.NET平台托管代码调用C++非托管代码为例做简单介绍:

1) 平台调用PInvoke(Platform Invoke)方法

C#和C++都是面向对象的语言,其对象的生成和销毁对软件的稳定性极其重要,而C#采用平台托管方式,C++则采用非托管方式。因为C++的对象实例实际是一个指针,故我们可以用C#的Intptr数据类型代替,而这中间需要C语言函数形式的方法作为桥梁以传递相互对象的生成和销毁,其示例代码如下:

C++中函数代码如下:

extern "C" UNMANAGEDDLL_API CUnmanagedClass* CreateClass();

extern "C" UNMANAGEDDLL_API void DisposeClass(CUnmanagedClass* pObject);

C#中函数代码如下:

static public extern IntPtr CreateTestClass();

static public extern void DisposeTestClass(IntPtr pTestClassObject);

2) C++托管代码调用方法

此方法是用C++托管代码在C++非托管代码和C#托管代码之间建立一个桥梁,而不需要平台调用的定义方法,但其语法与传统非托管C++会有很大不同。其示例代码如下:

public ref class CmanagedCppBridge{

public:

CExampleMCppBridge();

virtual ~CExampleMCppBridge();

String^ ReturnString();

private:

CUnmanagedTestClass* m_pUnmanagedTestClass;};

由于std::string非C++标准数据类型,而其又是软件最常使用的一种类型,此方法最大的优点就是在C++非托管代码和C#托管代码之间起到了很好地传递字符串的作用,而且无需考虑标准数据类型char*的内存申请及释放问题。

5 结束语

本文介绍了一种使用公开密钥体制RSA数字签名算法来进行注册码的计算和校验的软件加密方法。应用成熟的数字签名技术来计算注册码,可以充分保证其安全性,此外还可以结合身份认证等技术来保护注册码校验模块,以避免改模块被绕开或替换[2]。接着本文采用了加壳和动态链接库技术,可以方便而且安全地升级核心模块[10],而且本软件保护方案曾用于荆州某石油机械公司的工控软件中,用户反映良好,表明本方案安全可靠性高[11],所以本方案不失为一种可在实际工程中应用的方案。另外本方案在注册码的计算和校验过程中,用到了MD5和RSA算法,為了提高软件的安全性和加密效率,可以采用由国家密码局标准化的SM9标准算法IBC(Identity-Based Cryptograph,基于标识的密码体系)取代以RSA算法为核心的公钥密码体制[12]。

参考文献:

[1] 周利华,周虎生,文伟平.一种新型软件加密流程的设计[J].信息网络安全,2010(5):25-28.

[2] 谭毓安,王佐,曹元大. RSA数字签名算法在软件加密中的应用[J].计算机系统应用,2004(8):33-35.

[3] 佟晓筠,王翥,郭长勇,杜宇,岳银亮. 基于RSA等算法软件加密技术的研究与实现[J].微处理机,2003(6):22-25.

[4] 朱启辉,黄琼.基于SaaS的软件在线授权机制的研究与设计[J].计算机工程与设计,2015,36(3):608-612.

[5] 郑成龙.软件加密保护关键技术的研究与实现[D].北方工业大学,2012.

[6] 余彦.基于序列号的软件保护模型改进研究[D].兰州大学,2015.

[7] 韩宇贞,朱华生.基于Base64编码的数据加密技术[J].南昌水专学报,2002(4):38-40.

[8] 郭彬.共享软件注册保护模块的设计与实现[D].北京邮电大学,2012.

[9] 史明.软件代码混淆技术研究[D].天津大学,2014.

[10] 张林,赵勇,刘吉强,韩臻.基于椭圆曲线数字签名算法的序列号软件保护方案[J].中国电子科学研究院学报,2006(1):54-57.

[11] 周书锋,孙玉真.基于RSA数字签名的软件保护方案[J].计算机应用与软件,2008(3):35-37

[12] 董九山.基于加密自检测的软件防篡改技术的研究与实现[D].华中科技大学,2007.

推荐访问:数字签名 注册码 工控 加密 石油

猜你喜欢