李錕華 杜英國 桑志強
摘要:該文通過程序對計算機設備信息進行提取,生成該計算機唯一的機器碼。軟件開發(fā)者使用機器碼和矩陣進行加密,生成一個包含有加密矩陣信息的注冊碼,提供給用戶注冊使用。注冊碼中包含了加密矩陣信息,所以每個注冊碼均可以靈活使用隨機矩陣進行加密。用戶通過注冊碼還原出機器碼,和當前的計算機設備信息進行比較,檢查運行的計算機是否經過授權,從而對軟件版權進行有效的保護。
關鍵詞:機器碼;注冊碼;矩陣加密
中圖分類號:TP18 文獻標識碼:A 文章編號:1009-3044(2017)33-0110-03
Abstract: In this paper, the computer equipment information is extracted and the only machine code of the computer is generated. The software developer USES the machine code and the matrix to encrypt it, and generates a registration code that contains information about the encrypted matrix, which is provided to the user for registration. Encryption matrix information is included in the registration code, so each registration code can be encrypted using random matrix.The user can restore the machine code by the registration code, compare with the current computer equipment information, check whether the running computer is authorized, and thus effectively protect the software copyright.
Key words: Machine code; registration code; matrix encryption
1 背景
隨著計算機技術的不斷發(fā)展,計算機被廣泛應用于生產和生活。當計算機普及的同時,軟件的版權侵權行為出現(xiàn)的概率也越來越多。如何有效保證計算機軟件的版權不受侵犯,保護軟件開發(fā)設計者和軟件開發(fā)商的權益,是計算機軟件行業(yè)共同面臨的問題。
目前,對于軟件的侵權行為主要集中在一些授權軟件,應該在相應約定的計算機上運行,然而授權軟件經過一些用戶解密或破解后,讓它在多臺未授權計算機上免費運行,讓軟件開發(fā)商和軟件設計者造成巨大損失。如何避免類似情況發(fā)生,開發(fā)者通常用加密手段進行版權保護,其中通過注冊碼進行授權就是一種簡單而又有效的方法。注冊碼授權就是通過程序獲得機器設備基本信息生成機器碼,用戶把機器碼發(fā)送給軟件設計者或軟件開發(fā)商,軟件設計者或軟件開發(fā)商生成該設備對應的注冊碼提供給用戶使用,通過注冊碼校驗判斷是否為授權計算機,從而有效保護軟件的版權。本文以Visual Basic.net平臺為例,利用矩陣對機器碼和注冊碼進行加密和解密,為有效保護計算機軟件的版權提供一種簡單有效的方法。
2 生成注冊碼的設計思想
通過Visual Basic.net平臺,讀取授權機器的中央處理器,硬盤,網(wǎng)卡MAC的序列號,這三組信息對于每個設備都是唯一的[1]。程序通過這三組信息,生成對應的ASCII編碼,形成該機器的機器碼,該機器碼也是唯一的。用戶將機器碼發(fā)送給軟件設計者和軟件開發(fā)商,開發(fā)商通過矩陣加密方式生成相應的注冊碼,注冊碼中包含了硬件加密的信息和加密矩陣的信息。將生成注冊碼發(fā)送給用戶,用戶就可以正常注冊成功該軟件。當用戶登錄使用軟件時,程序將提取該計算機的硬件信息組成機器碼,將包含有加密矩陣信息的注冊碼進行分解,讓注冊碼矩陣和加密矩陣的逆矩陣進行運算,得出曾經注冊過的機器碼,和現(xiàn)有的機器碼進行比較,完全一致,則可以使用該授權軟件,否則軟件無法運行[2]。
3 生成注冊碼設計與實現(xiàn)
3.1 讀取設備信息的方法
3.1.1 讀取CPU的序列號信息方法
利用Visual Basic.net平臺,讀出當前計算機CPU的序列號存放入st1字符串變量中。
Dim Wmi1 As New System.Management.ManagementObjectSearcher("SELECT * FROM Win32_Processor")
Dim Uint1 As String
For Each WmiObj1 As ManagementObject In Wmi1.Get
Uint1 = WmiObj1("ProcessorId")
Next
st1 = Uint1
3.1.2 讀取硬盤序列號的方法
利用Visual Basic.net平臺,讀出當前計算機硬盤的序列號存放入st2字符串變量中。
Dim cmicWmi1 As New System.Management.ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive")
Dim Uint1 As UInt32
j = 0
For Each cmicWmiObj1 As ManagementObject In cmicWmi1.Get
Uint1 = cmicWmiObj1("signature")
str(j) = Uint1.ToString
j = j + 1
Next
st2 = str(0)
3.1.3 讀取網(wǎng)卡mac地址的方法
利用Visual Basic.net平臺,讀取當前計算機網(wǎng)卡的mac存放入st3字符串變量中。
Dim Wmi1 As New System.Management.ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration")
Dim Uint1 As String
j = 0
For Each WmiObj1 As ManagementObject In Wmi1.Get
If WmiObj1("IPEnabled") = True Then
Uint1 = Trim(WmiObj1("MacAddress"))
str(j) = Uint1
j = j + 1
End If
Next
st3 = str(0)
3.2 生成機器碼方法
將以上程序獲得的計算機CPU序列號,硬盤序列號和網(wǎng)卡mac地址,組成一個字符串,然后,將字符串中每個字符轉換成相應ASCII編碼數(shù)值,加入“-”組成當前的機器碼,存入sss字符串變量中,該字符串就是生成的機器碼。
Dim i, j, k As Integer
Dim sss As String = ""
st4 = st1 + st2 + st3
k = 1
For i = 0 To 7
For j = 0 To 7
If k <= Len(st1 + st2 + st3) Then
sss = sss + Asc(Mid(st4, k, 1)).ToString + "-"
k = k + 1
End If
Next
Next
3.3 生成注冊碼和還原機器碼的方法
3.3.1 生成注冊碼和還原機器碼的原理
當開發(fā)人員獲得要授權的計算機機器碼后,開發(fā)者通過機器碼生成注冊碼。目前,CPU序列號,硬盤序列號和網(wǎng)卡mac地址字符總數(shù)一般不會超過64個字符,我們選用8×8矩陣進行加密處理。首先將機器碼轉化成8×8的機器碼矩陣,通過和一個隨機產生有逆矩陣的8×8加密矩陣進行相乘后,獲得注冊碼矩陣,即:A機器碼矩陣×M加密矩陣=A注冊碼矩陣。將注冊碼矩陣轉換成注冊碼,同時將隨機加密矩陣的信息轉換成ASCII數(shù)值進行數(shù)值加密,附加到注冊碼后面,形成一個帶有加密矩陣信息的注冊碼。
當用戶獲得注冊碼后,輸入計算機即可獲得成功授權。當用戶使用該授權軟件登錄時,通過帶有加密矩陣信息的注冊碼,分解出注冊碼矩陣和加密矩陣,通過加密矩陣求出加密矩陣的逆矩陣[3],然后用注冊碼矩陣和加密矩陣的逆矩陣相乘,即可求出機器碼矩陣,即:A注冊碼×M加密矩陣的逆矩陣=A機器碼,從而還原出機器碼。將該機器碼和目前計算機CPU序列號,硬盤序列號和網(wǎng)卡mac信息生成的本機機器碼相互比較,判斷是否為授權的計算機。
3.3.2 機器碼加密生成注冊碼的設計
當開發(fā)者獲得機器碼后,將機器碼轉化成8×8的矩陣,存入a(8,8)二維數(shù)組,將隨機產生的加密矩陣存入b(8,8)數(shù)組,把a數(shù)組和b數(shù)組按照矩陣相乘的規(guī)則運算,將結果存入c(8,8)數(shù)組。通過c(8,8)數(shù)組生成注冊碼存入str1字符串變量之中,然后將加密矩陣每個元素乘以任意一個加密數(shù)值(本例以20為加密數(shù)值),然后轉換成字符串,連接到str1之后,兩者之間用”AA”字符作為分隔符,str1就是帶有加密矩陣信息的注冊碼。
Dim i, j, k As Integer
Dim str1 As String = ""
For i = 0 To 7
For j = 0 To 7
For k = 0 To 7
c(i, j) = c(i, j) + a(i, k) * b(k, j)
Next
If c(i,j)<>0 Then
str 1 = str 1 + c(i, j).ToString + "-"
End If
Next
Next
str2 = str2 + "AA-"
For i = 0 To 7
For j = 0 To 7
str2 = str2 + (b(i, j)*2).ToString + "-"
Next
Next
3.3.3 注冊碼解密生成機器碼的設計
當用戶獲得注冊碼注冊成功后,每次啟動該授權軟件,程序將取出帶有加密矩陣的注冊碼,以“AA”作為分隔符,將該注冊碼分解成注冊碼部分和加密矩陣部分,將注冊碼轉換成注冊碼矩陣存入c(8,8)數(shù)組,將加密矩陣的每個元素除以加密數(shù)值(本例以20為加密數(shù)值),求出加密矩陣的逆矩陣存入d(8,8)數(shù)組,把c數(shù)組和d數(shù)組按照矩陣相乘的規(guī)則運算,將結果存入e1(8,8)數(shù)組。通過e1(8,8)數(shù)組生成機器碼放入str2字符串變量。將目前使用的計算機硬件信息讀出,生成機器碼str3字符串變量,和str2進行驗證,判斷是否為軟件授權的計算機。
Dim i, j, k As Integer
Dim str2 As String = ""
For i = 0 To 7
For j = 0 To 7
For k = 0 To 7
e1(i, j) = (e1(i, j) + c(i, k) * d(k, j))
Next
e1(i, j) = Math.Round(e1(i, j), 0)
If e1(i, j) <> 0 Then
str2 = str2 + e1(i, j).ToString + "-"
End If
Next
Next
4 矩陣加密生成注冊碼的結果與分析
4.1 讀取設備序列號和機器碼的運行結果(如圖1所示)
圖1 設備序列號和生成機器碼
當前的計算機CPU序列號為: BFEBFBFF000206A7
硬盤序列號為:2156105262
網(wǎng)卡mac為:60:D8:19:C7:E0:83
生成的機器碼為:
66-70-69-66-70-66-70-70-48-48-48-50-48-54-65-55-50-49-53-54-49-48-53-50-54-50-54-48-58-68-56-58-49-57-58-67-55-58-69-48-58-56-51-
4.2 將機器碼加密生成注冊碼的運行結果(如圖2所示)
圖2 注冊碼的生成
輸入機器碼后,轉換成矩陣,和加密矩陣相乘后得到注冊碼矩陣,加入加密矩陣信息后,生成的注冊碼為:
349-407-612-682-415-617-477-687-254-296-453-523-319-474-361-540-251-303-454-504-305-458-356-503-286-332-504-574-330-494-396-580-264-344-510-552-329-539-411-569-51-165-272-274-165-221-109-165-AA-0-20-20-40-20-20-20-20-0-20-40-20-20-40-0-20-20-20-40-40-20-20-20-20-0-20-20-0-0-20-20-0-40-20-0-0-0-20-40-20-0-20-40-40-0-20-20-40-0-0-0-20-20-40-20-40-40-0-20-40-40-0-0-40-
其中“AA”之前的為注冊碼信息,“AA”之后的為加密矩陣信息。
4.3 將注冊碼解密生成機器碼的運行結果(如圖3所示)
軟件注冊成功后,每次登錄軟件,注冊碼轉換成注冊碼矩陣和加密矩陣,使注冊碼矩陣和加密矩陣的逆矩陣相乘后得到機器碼,生成的機器碼為:
66-70-69-66-70-66-70-70-48-48-48-50-48-54-65-55-50-49-53-54-49-48-53-50-54-50-54-48-58-68-56-58-49-57-58-67-55-58-69-48-58-56-51-
此時,得到的機器碼和目前使用的機器碼一致,判斷是軟件授權的計算機。
5 結束語
本文利用程序獲取機器的硬件信息,組成機器碼,通過機器碼矩陣和加密矩陣相乘運算生成注冊碼,讓注冊碼矩陣和加密矩陣的逆矩陣相乘還原得到機器碼,這種方法既簡單而又有效。同時注冊碼中包含了加密矩陣的信息,對傳統(tǒng)固定的加密矩陣生成注冊碼方法進行了改進,可以實現(xiàn)不同計算機的注冊碼使用不同的矩陣加密,進一步提高了注冊碼的安全性和可靠性。該種方法在軟件的版權保護和知識產權的保護中可以得到廣泛應用。
參考文獻:
[1] 何定華. 基于CPU序列號和加密技術的軟件注冊機[J]. 科技導報, 2012, 30(2):36-38.
[2] 周蓉. 在Visual Basic中運用矩陣實現(xiàn)字符串的加密[J]. 四川職業(yè)技術學院學報, 2004(3):92-94.
[3] 郭承志. n階矩陣逆矩陣的求解算法及其實現(xiàn)[J]. 電腦知識與技術, 2012(14):3418-3425.
[4] 陳珊, 葛艷玲, 石峰. 一種實現(xiàn)軟件注冊碼的非對稱加密算法[J]. 電腦知識與技術, 2007(17):190-193.
[5] 魏彥. 軟件的加密——注冊碼實現(xiàn)原理[J]. 信息技術與信息化, 2016(6):129-131.
[6] 曹淑琴, 劉洋, 鄭成龍. 一種基于RSA算法的安全注冊碼系統(tǒng)設計[J]. 中國科技信息, 2014(1):94.
[7] 鄭羽, 楊春生, 于江. 加密與解密實戰(zhàn)入門[M]. 北京: 電子工業(yè)出版社, 2006.
[8] 段鋼. 加密與解密[M]. 北京: 電子工業(yè)出版社, 2008.