• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于RSA數(shù)字簽名的注冊碼軟加密保護方案在石油工控軟件的應用

      2017-12-13 09:38:33蘇玉杰楊飛劉波濤
      電腦知識與技術 2017年33期

      蘇玉杰 楊飛 劉波濤

      摘要:傳統(tǒng)石油行業(yè)的工控軟件多采用USB加密狗等硬加密方式對軟件進行加密,但由于硬件的易復制、易丟失和易混淆等特點,造成了軟件操作人員的使用不便,也給軟件提供商增加了額外的成本開銷。針對此現(xiàn)象,該文在充分調研當前軟加密方法的基礎上,提出了一種基于RSA數(shù)字簽名的注冊碼軟加密方法,并根據石油行業(yè)工控軟件的應用特點,對其進行了加殼處理。該保護方案給其他行業(yè)軟件的軟件加密方式提供了一種思路。

      關鍵詞:軟加密;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

      隨著計算機技術的不斷發(fā)展,面向各行業(yè)和各應用的軟件不斷孕育而生[1]。計算機軟件作為計算機產業(yè)的一種重要產品,其開發(fā)成本高、周期長,且需要巨大投入,而其生產和復制則十分容易,故對軟件進行加密就成了保護軟件的一種必要手段[2]。

      依據加密原理和方式,目前所采用的軟件加密方式主要可分為硬加密和軟加密兩大類。硬加密主要是指加密系統(tǒng)依賴于特定的“硬件”來實施加密的過程,如光盤加密、加密卡和加密狗等[1]。傳統(tǒng)石油行業(yè)的工控軟件多采用此種方式進行加密,一般是提供給用戶一個硬件實體作為授權,但由于其易復制、易丟失和易混淆等特點,不但使軟件提供商增加了額外的成本開銷,且不能被很好地控制,并有效地利用互聯(lián)網來進行分發(fā),因此面向石油行業(yè)的工控軟件提供商現(xiàn)希望升級成不依賴于硬件的軟加密方式。

      軟加密主要是指用純軟件的方式來實現(xiàn)對軟件的加密保護,其具有成本低、升級快的優(yōu)勢[3]。目前常見的軟加密方法主要有注冊碼法、警告窗口法、時間限制法、功能限制法、注冊文件法和加殼法[2]。本文主要研究注冊碼法和加殼法,并結合網絡認證加密思想,提出了一種基于RSA數(shù)字簽名算法的軟加密方法,實現(xiàn)了對面向石油行業(yè)工控軟件加密方式的升級。

      1 基于RSA算法的注冊碼加密

      本文提出了一種實用的軟件注冊碼加密方法,主要包括兩個模塊:注冊碼的計算模塊和校驗模塊。林提出了分離軟件程序,把軟件中的關鍵數(shù)據遷移到服務器中的思想,并論證了其優(yōu)勢和可行性[4]。注冊碼計算模塊部署在服務端,可根據用戶提供的計算機機器碼計算出相應的注冊碼。校驗模塊內嵌于用戶客戶端中,主要完成計算機機器碼的提取和注冊碼的校驗功能。由于兩個模塊必須共享一些信息,導致破解者可通過靜態(tài)分析和動態(tài)跟蹤等手段破解注冊碼校驗模塊,從而間接地破解注冊碼計算模塊。而公開密鑰體制利用公鑰和私鑰來對數(shù)據進行加解密和數(shù)字簽名的驗證,而且從公鑰無法推導出私鑰。因此在軟件加密中運用注冊碼加密方式必須使用基于公開密鑰體制的數(shù)字簽名算法[2]。

      本文采用基于RSA數(shù)字簽名算法的注冊碼加密方法。軟件提供商先選定一個私鑰/公鑰對,私鑰用來為用戶計算機機器碼產生數(shù)字簽名,而此數(shù)字簽名即為用戶軟件的注冊碼,公鑰存在于用戶軟件客戶端程序中,校驗模塊在得到用戶計算機機器碼后,利用公鑰來驗證數(shù)字簽名[2]。RSA數(shù)字簽名算法貫穿于注冊碼的計算和校驗環(huán)節(jié),其流程圖如圖1所示[3,5]:

      1.1 注冊碼的計算

      用戶將生成的計算機機器碼通過E-mail發(fā)送給軟件提供商,再由軟件提供商用私鑰對機器碼進行加密,得到數(shù)字簽名,并經Base64編碼將所得注冊碼轉化為可直接輸入的字符,回傳給用戶[1]。使用RSA數(shù)字簽名算法時,密鑰的長度越長,加密的計算量就越大,保密強度也就越高,本文采用1024bit密鑰。而由于計算機機器碼的長度不定,需通過MD5消息摘要算法,產生固定長度的消息摘要,再將其作為RSA數(shù)字簽名算法的消息輸入[2]。

      注冊碼的計算過程實際上就是數(shù)字簽名的產生過程:

      1) 生成密鑰對:公鑰為e,私鑰為d,模數(shù)為n。

      2) 將計算機機器碼作為消息輸入m,使用MD5算法生成計算機機器碼的消息摘要[g=MD5(m)]。

      3) 用私鑰d對g進行加密,得到數(shù)字簽名[s=gdmodn]。s即為與計算機機器碼對應的注冊碼。

      4) 將s作為注冊碼提供為用戶。

      1.2 注冊碼的校驗

      注冊碼的校驗過程實際上就是對數(shù)字簽名進行校驗的過程:

      1) 用戶輸入注冊碼s。公鑰e和模數(shù)n以常數(shù)的形式存在與校驗模塊中。

      2) 計算[g'=semodn]。

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

      4) 比較g和g。如果相等則證實s是m的正確數(shù)字簽名,即可確認用戶輸入的注冊碼是有軟件提供商簽發(fā)的[6]。

      1.3 注冊碼的Base64編解碼表示

      Base64是一種很常見的編解碼規(guī)范,其作用是將二進制序列轉換為人類可讀寫的ASCII字符序列,常用在需要通過文本協(xié)議(比如HTTP和SMTP)來傳輸二進制數(shù)據的情況下。Base64并不是一種用于安全領域的加解密算法,而是一種編碼(Encode)和解碼(Decode)過程,其變換非常簡單,僅僅是為避免信息在傳輸過程中被直接識別[7]。

      2 機器碼的生成

      計算機機器碼對每一個計算機都應是唯一的,考慮到計算機CPU-ID號和硬盤序列號都具有與操作系統(tǒng)無關的特性,能夠唯一標識計算機,故可選取其作為計算機硬件的唯一標識。本文采用將用戶計算機CPU-ID號和硬盤序列號根據一定規(guī)則混合,并通過消息摘要算法轉變?yōu)楣潭ㄩL度的計算機機器碼,其生成流程圖如圖2所示[8]:

      對于獲取CPU-ID號和硬盤序列號的計算機編程語言的選取上,考慮到C++語言反編譯性強的特點,本文采用C++語言編寫。

      2.1 CPU-ID號的獲取

      讀取CPU-ID號的方法如下:首先需創(chuàng)建一個完整的WMI客戶端程序,以完成COM組件的初始化、連接本地主機WMI、同步檢索數(shù)據以及注銷組件等操作。其對應的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)函數(shù)的作用是獲取本機CPU的ProcessorId屬性,vtProp為其字符串緩沖區(qū)。

      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)函數(shù)的作用是獲取本機硬盤的SerialNumber屬性,vtProp為其字符串緩沖區(qū)。

      3 加殼軟件保護

      軟件提供商一般不希望將軟件源代碼提供給用戶,而只交付應用軟件[4]。因此,我們需要一個加殼程序,所謂“殼”,就是用一些專門的壓縮工具,對exe、com和dll等程序文件進行壓縮,在程序中加入一段保護代碼,使程序不被非法修改和反編譯。加過殼的程序可以直接運行,但是不能查看源代碼。通過相關實驗發(fā)現(xiàn),加過殼的軟件要比沒有加過殼的軟件運行速度更快,其原因是在程序運行之前,首先將殼以及程序文件全部加載到內存中,然后使用CPU對殼就行解壓縮,而后將程序文件釋放到內存中,程序完全運行在內存中[9]。

      4 在石油行業(yè)工控軟件的應用

      傳統(tǒng)石油行業(yè)工控軟件由于歷史等原因多采用VB或C#等語言編寫,而本文的注冊碼校驗模塊采用C++語言編寫,故需并且將編譯成了動態(tài)鏈接庫DLL,這樣當軟件提供商在升級注冊碼保護方案時,不必重新給軟件加殼,而只需用新的動態(tài)鏈接庫替換舊的版本即可[10]。下面以.NET平臺托管代碼調用C++非托管代碼為例做簡單介紹:

      1) 平臺調用PInvoke(Platform Invoke)方法

      C#和C++都是面向對象的語言,其對象的生成和銷毀對軟件的穩(wěn)定性極其重要,而C#采用平臺托管方式,C++則采用非托管方式。因為C++的對象實例實際是一個指針,故我們可以用C#的Intptr數(shù)據類型代替,而這中間需要C語言函數(shù)形式的方法作為橋梁以傳遞相互對象的生成和銷毀,其示例代碼如下:

      C++中函數(shù)代碼如下:

      extern "C" UNMANAGEDDLL_API CUnmanagedClass* CreateClass();

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

      C#中函數(shù)代碼如下:

      static public extern IntPtr CreateTestClass();

      static public extern void DisposeTestClass(IntPtr pTestClassObject);

      2) C++托管代碼調用方法

      此方法是用C++托管代碼在C++非托管代碼和C#托管代碼之間建立一個橋梁,而不需要平臺調用的定義方法,但其語法與傳統(tǒng)非托管C++會有很大不同。其示例代碼如下:

      public ref class CmanagedCppBridge{

      public:

      CExampleMCppBridge();

      virtual ~CExampleMCppBridge();

      String^ ReturnString();

      private:

      CUnmanagedTestClass* m_pUnmanagedTestClass;};

      由于std::string非C++標準數(shù)據類型,而其又是軟件最常使用的一種類型,此方法最大的優(yōu)點就是在C++非托管代碼和C#托管代碼之間起到了很好地傳遞字符串的作用,而且無需考慮標準數(shù)據類型char*的內存申請及釋放問題。

      5 結束語

      本文介紹了一種使用公開密鑰體制RSA數(shù)字簽名算法來進行注冊碼的計算和校驗的軟件加密方法。應用成熟的數(shù)字簽名技術來計算注冊碼,可以充分保證其安全性,此外還可以結合身份認證等技術來保護注冊碼校驗模塊,以避免改模塊被繞開或替換[2]。接著本文采用了加殼和動態(tài)鏈接庫技術,可以方便而且安全地升級核心模塊[10],而且本軟件保護方案曾用于荊州某石油機械公司的工控軟件中,用戶反映良好,表明本方案安全可靠性高[11],所以本方案不失為一種可在實際工程中應用的方案。另外本方案在注冊碼的計算和校驗過程中,用到了MD5和RSA算法,為了提高軟件的安全性和加密效率,可以采用由國家密碼局標準化的SM9標準算法IBC(Identity-Based Cryptograph,基于標識的密碼體系)取代以RSA算法為核心的公鑰密碼體制[12]。

      參考文獻:

      [1] 周利華,周虎生,文偉平.一種新型軟件加密流程的設計[J].信息網絡安全,2010(5):25-28.

      [2] 譚毓安,王佐,曹元大. RSA數(shù)字簽名算法在軟件加密中的應用[J].計算機系統(tǒng)應用,2004(8):33-35.

      [3] 佟曉筠,王翥,郭長勇,杜宇,岳銀亮. 基于RSA等算法軟件加密技術的研究與實現(xiàn)[J].微處理機,2003(6):22-25.

      [4] 朱啟輝,黃瓊.基于SaaS的軟件在線授權機制的研究與設計[J].計算機工程與設計,2015,36(3):608-612.

      [5] 鄭成龍.軟件加密保護關鍵技術的研究與實現(xiàn)[D].北方工業(yè)大學,2012.

      [6] 余彥.基于序列號的軟件保護模型改進研究[D].蘭州大學,2015.

      [7] 韓宇貞,朱華生.基于Base64編碼的數(shù)據加密技術[J].南昌水專學報,2002(4):38-40.

      [8] 郭彬.共享軟件注冊保護模塊的設計與實現(xiàn)[D].北京郵電大學,2012.

      [9] 史明.軟件代碼混淆技術研究[D].天津大學,2014.

      [10] 張林,趙勇,劉吉強,韓臻.基于橢圓曲線數(shù)字簽名算法的序列號軟件保護方案[J].中國電子科學研究院學報,2006(1):54-57.

      [11] 周書鋒,孫玉真.基于RSA數(shù)字簽名的軟件保護方案[J].計算機應用與軟件,2008(3):35-37

      [12] 董九山.基于加密自檢測的軟件防篡改技術的研究與實現(xiàn)[D].華中科技大學,2007.

      厦门市| 潼关县| 米易县| 五常市| 福建省| 洪江市| 满洲里市| 惠东县| 唐海县| 新营市| 南平市| 团风县| 平江县| 双辽市| 石门县| 鞍山市| 来凤县| 新宾| 沂水县| 安泽县| 赤城县| 秦安县| 五原县| 同心县| 扎鲁特旗| 恩施市| 五大连池市| 句容市| 昌平区| 大同县| 绥中县| 沂源县| 安龙县| 阿拉善左旗| 平凉市| 安西县| 噶尔县| 哈巴河县| 福贡县| 平度市| 阳城县|