一種加密方法
【專利摘要】本申請公開了一種加密方法,包括:根據(jù)當(dāng)前用于加密的密鑰,將加密程序源代碼中與所述密鑰相關(guān)的變量參數(shù)轉(zhuǎn)化為相應(yīng)的常量參數(shù),對所述轉(zhuǎn)化后得到的加密程序源代碼進(jìn)行編譯;利用所述編譯后得到的加密程序,對待加密數(shù)據(jù)進(jìn)行加密。采用本發(fā)明可以有效隱藏加密時(shí)所使用的密鑰,防止破解者從加密程序文件、內(nèi)存中獲得密鑰,從而可以對密鑰進(jìn)行有效保護(hù)。
【專利說明】一種加密方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及數(shù)據(jù)安全技術(shù),特別是涉及一種加密方法。
【背景技術(shù)】
[0002] 目前,常用的密碼學(xué)算法庫提供的應(yīng)用程序接口 API,都需要把密鑰作為參數(shù)來進(jìn) 行傳遞,而很多加密方法的密鑰(如RSA密鑰)是幾個(gè)大數(shù),在API接口定義中,大數(shù)的數(shù) 據(jù)結(jié)構(gòu)往往是一個(gè)dword類型的數(shù)組,或字節(jié)數(shù)組。例如RSA2048中,模數(shù)是2048位,即 256字節(jié),調(diào)用加解密API時(shí),傳遞的是數(shù)組指針,而數(shù)組則是內(nèi)存中連續(xù)存放的密鑰數(shù)據(jù), 破解者只要找到調(diào)用API的入口,再逐步查找堆棧,即有可能獲得整個(gè)密鑰。
[0003]目前的加密和保護(hù)工具,主要功能是對加密程序的代碼進(jìn)行保護(hù)(亂序、混淆、反 跟蹤)等,沒有對數(shù)據(jù)做針對性的處理。如外殼工具雖然能對文件的數(shù)據(jù)段整體加密,但運(yùn) 行時(shí),在API的入口處,仍然可以找到明文的連續(xù)密鑰。這是因?yàn)槊艽a學(xué)算法本身要求這樣 的數(shù)據(jù)結(jié)構(gòu),并且在運(yùn)算時(shí)數(shù)據(jù)必須是明文的。
[0004]目前尚未提出一種能夠?qū)γ荑€進(jìn)行有效保護(hù),防止破解者從加密程序文件、內(nèi)存 中獲得密鑰的有效方法。
【發(fā)明內(nèi)容】
[0005] 有鑒于此,本發(fā)明的主要目的在于提供一種加密方法,該方法可以對密鑰進(jìn)行有 效保護(hù)。
[0006] 為了達(dá)到上述目的,本發(fā)明提出的技術(shù)方案為:
[0007] 一種加密方法,包括:
[0008] a、根據(jù)當(dāng)前用于加密的密鑰,將加密程序源代碼中與所述密鑰相關(guān)的變量參數(shù)轉(zhuǎn) 化為相應(yīng)的常量參數(shù),對所述轉(zhuǎn)化后得到的加密程序源代碼進(jìn)行編譯;
[0009] b、利用所述編譯后得到的加密程序,對待加密數(shù)據(jù)進(jìn)行加密。
[0010] 綜上所述,本發(fā)明提出的加密方法,在利用密鑰進(jìn)行加密前,根據(jù)密鑰的實(shí)際數(shù) 值,對加密程序的源代碼進(jìn)行修改,對其中與密鑰相關(guān)的變量參數(shù)進(jìn)行固化,轉(zhuǎn)化為相應(yīng)的 常量參數(shù),可以有效隱藏加密時(shí)所使用的密鑰,防止破解者從加密程序文件、內(nèi)存中獲得密 鑰,從而可以對密鑰進(jìn)行有效保護(hù)。
【專利附圖】
【附圖說明】
[0011] 圖1為本發(fā)明實(shí)施例一的流程示意圖。
【具體實(shí)施方式】
[0012] 為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合附圖及具體實(shí)施例對 本發(fā)明作進(jìn)一步地詳細(xì)描述。
[0013] 本發(fā)明的核心思想是:根據(jù)密鑰的實(shí)際取值,將加密程序中與密鑰相關(guān)的變量參 數(shù)轉(zhuǎn)化為取值固定的固化參數(shù)(如宏、常量),這樣,可以實(shí)現(xiàn)隱藏密鑰的目的,提高密鑰的 安全性。
[0014] 圖1為本發(fā)明實(shí)施例一的流程示意圖,如圖1所示,該實(shí)施例主要包括:
[0015] 步驟101、根據(jù)當(dāng)前用于加密的密鑰,將加密程序源代碼中與所述密鑰相關(guān)的變量 參數(shù)轉(zhuǎn)化為相應(yīng)的常量參數(shù),對所述轉(zhuǎn)化后得到的加密程序源代碼進(jìn)行編譯。
[0016] 本步驟,用于將加密程序源代碼中與所述密鑰相關(guān)的變量參數(shù)進(jìn)行固化,以達(dá)到 隱藏密鑰的目的,防止破解者從加密程序文件、內(nèi)存中獲得密鑰。
[0017] 較佳地,本步驟可以采用下述步驟實(shí)現(xiàn):
[0018] 步驟al、對于加密程序源代碼中以密鑰為參數(shù)的每個(gè)函數(shù),將所述密鑰從函數(shù)參 數(shù)集合中刪除。
[0019] 步驟a2、將所述函數(shù)的函數(shù)體中以密鑰整體取值為參數(shù)的每個(gè)運(yùn)算邏輯函數(shù)代 碼,根據(jù)所述密鑰計(jì)算出相應(yīng)的運(yùn)算結(jié)果,將所述運(yùn)算邏輯函數(shù)代碼替換為以所述運(yùn)算結(jié) 果為值的常量參數(shù)。
[0020] 這里,通過將密鑰參數(shù)代替為相應(yīng)的固定的運(yùn)算結(jié)果,即以常量參數(shù)替換算法源 代碼中的密鑰參數(shù),從而可以起到隱藏密鑰的效果。
[0021] 例如:對于如下代碼:
[0022] void func (byte*data,byte*key/* 密鑰 */)
[0023] {
[0024] int key_len = getKeyLength(key) ;//getKeyLength 是另一個(gè)函數(shù),用于在運(yùn)行 時(shí)獲取密鑰的長度。
[0025] }
[0026] 經(jīng)過轉(zhuǎn)化后為:
[0027] void func (byte*data)
[0028] {
[0029] int key_len = KEY_LENGTH ;//由于密鑰已經(jīng)固化了,其長度也是確定的了。
[0030] }
[0031] 步驟a3、對于所述源代碼中每個(gè)有密鑰的部分?jǐn)?shù)值參與運(yùn)算的循環(huán)結(jié)構(gòu),將該循 環(huán)結(jié)構(gòu)展開,得到等效的T組運(yùn)算代碼,所述T為循環(huán)結(jié)構(gòu)所限定的循環(huán)執(zhí)行次數(shù)上限,并 根據(jù)所述密鑰的實(shí)際取值,對每組運(yùn)算代碼中以密鑰的部分?jǐn)?shù)值為參數(shù)的運(yùn)算代碼進(jìn)行修 改,所述修改包括將所述密鑰的部分?jǐn)?shù)值對應(yīng)的變量參數(shù)替換為相應(yīng)的以所述密鑰的部分 數(shù)值為固定取值的常量參數(shù)。
[0032] 這里,考慮到密鑰往往是256、512或更多字節(jié)的數(shù)據(jù),通常是數(shù)組的形式存儲(chǔ),計(jì) 算機(jī)的基本運(yùn)算不能直接處理這種大小的數(shù)據(jù),原始算法中會(huì)有循環(huán)結(jié)構(gòu),一次處理密鑰 的一部分。在循環(huán)結(jié)構(gòu)的函數(shù)體中,密鑰的部分?jǐn)?shù)值所對應(yīng)的數(shù)組元素是通過變量的形式 引用的,即循環(huán)函數(shù)體中,以循環(huán)次數(shù)為變量作為密鑰數(shù)組的下標(biāo)參數(shù),從而可以在每次執(zhí) 行時(shí)使用本次循環(huán)對應(yīng)的密鑰數(shù)組元素。本步驟中,通過將循環(huán)結(jié)構(gòu)展開,即去除函數(shù)體外 面的循環(huán)結(jié)構(gòu),還原執(zhí)行循環(huán)結(jié)構(gòu)時(shí)所需要實(shí)際執(zhí)行的所有運(yùn)算代碼,也就是將執(zhí)行循環(huán) 結(jié)構(gòu)時(shí)每次執(zhí)行的函數(shù)體程序代碼全部羅列出來,這樣,將得到T組運(yùn)算代碼,每組運(yùn)算代 碼對應(yīng)執(zhí)行一次循環(huán)結(jié)構(gòu)的函數(shù)體所要執(zhí)行的程序代碼,第t組運(yùn)算代碼即第t次執(zhí)行函 數(shù)體所要運(yùn)行的程序代碼。如此,每組運(yùn)算代碼中,以循環(huán)次數(shù)為下標(biāo)的密鑰數(shù)組參數(shù)的取 值,也會(huì)因密鑰數(shù)組、以及下標(biāo)值均為固定值,而成為固定值。因此,本步驟中,通過對循環(huán) 結(jié)構(gòu)進(jìn)行展開,可以將循環(huán)結(jié)構(gòu)中的密鑰數(shù)組參數(shù)變量轉(zhuǎn)換為以實(shí)際的數(shù)組元素值為固定 取值的常量參數(shù),從而可以達(dá)到隱藏密鑰的目的。
[0033] 例如,對于下述循環(huán)結(jié)構(gòu)代碼;
[0034] for(i = 0 ;i<15 ;i++)
[0035] {
[0036] sum+ = key[i];
[0037] }
[0038] 將循環(huán)結(jié)構(gòu)展開后為:
[0039] sum+ = KEY_1 ;//密鑰的第一個(gè)部分
[0040] sum+ = KEY_2 ;//密鑰的第二個(gè)部分
[0041]
[0042] sum+ = KEY_15 ;
[0043] 步驟a4、對于所述源代碼中每個(gè)以密鑰的部分?jǐn)?shù)值為除數(shù)的除法運(yùn)算邏輯代碼, 將該除法運(yùn)算邏輯代碼替換為等效的以所述密鑰的部分?jǐn)?shù)值的倒數(shù)為乘數(shù)的運(yùn)算邏輯代 碼,并將所述密鑰的部分?jǐn)?shù)值的倒數(shù)替換為以該倒數(shù)的運(yùn)算結(jié)果為值的常量參數(shù)。
[0044] 這里,考慮到加密程序中如果用到除法,一般是使用密鑰數(shù)組和循環(huán)試除方式實(shí) 現(xiàn),修改方法是:將"除以密鑰"變換為"乘以密鑰的倒數(shù)"(密鑰本質(zhì)上是一個(gè)數(shù),而密鑰固 化后,這個(gè)數(shù)在編譯時(shí)是已知的,因此它的倒數(shù)也是編譯時(shí)已知的)。
[0045] 步驟a5、對于所述源代碼中每個(gè)以密鑰為指數(shù)的模冪運(yùn)算代碼,根據(jù)該密鑰的實(shí) 際數(shù)值,將該模冪運(yùn)算代碼對應(yīng)的循環(huán)結(jié)構(gòu)展開,進(jìn)行所述展開時(shí),對于用于判斷冪的指定 位是否為零的語句,根據(jù)所述密鑰的實(shí)際數(shù)值,確定相應(yīng)的判斷結(jié)果,利用所述判斷結(jié)果對 應(yīng)的程序代碼替代所述判斷的相關(guān)程序代碼。
[0046] 這里,考慮到對于加密程序中的模冪運(yùn)算,一般是循環(huán)判斷冪的各個(gè)位,如果該位 為〇,則做平方后取模;否則做平方并乘以底后取模。密鑰固化后冪值也是編譯時(shí)已知的, 因此它的各個(gè)位的值也是編譯時(shí)已知的,將循環(huán)展開,去掉判斷冪的某一位的代碼,將對該 位要采取的動(dòng)作直接羅列。
[0047] 例如:對于下述以密鑰為指數(shù)的模冪運(yùn)算代碼:
【權(quán)利要求】
1. 一種加密方法,其特征在于,包括: a、 根據(jù)當(dāng)前用于加密的密鑰,將加密程序源代碼中與所述密鑰相關(guān)的變量參數(shù)轉(zhuǎn)化為 相應(yīng)的常量參數(shù),對所述轉(zhuǎn)化后得到的加密程序源代碼進(jìn)行編譯; b、 利用所述編譯后得到的加密程序,對待加密數(shù)據(jù)進(jìn)行加密。
2. 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟a包括: al、對于加密程序源代碼中以密鑰為參數(shù)的每個(gè)函數(shù),將所述密鑰從函數(shù)參數(shù)集合中 刪除; a2、將所述函數(shù)的函數(shù)體中以密鑰整體取值為參數(shù)的每個(gè)運(yùn)算邏輯函數(shù)代碼,根據(jù)所 述密鑰計(jì)算出相應(yīng)的運(yùn)算結(jié)果,將所述運(yùn)算邏輯函數(shù)代碼替換為取值為所述運(yùn)算結(jié)果的常 量參數(shù); a3、對于所述源代碼中每個(gè)有密鑰的部分?jǐn)?shù)值參與運(yùn)算的循環(huán)結(jié)構(gòu),將該循環(huán)結(jié)構(gòu)展 開,得到等效的T組運(yùn)算代碼,所述T為循環(huán)結(jié)構(gòu)所限定的循環(huán)執(zhí)行次數(shù)上限,并根據(jù)所述 密鑰的實(shí)際取值,對每組運(yùn)算代碼中以密鑰的部分?jǐn)?shù)值為參數(shù)的運(yùn)算代碼進(jìn)行修改,所述 修改包括將所述密鑰的部分?jǐn)?shù)值對應(yīng)的變量參數(shù)替換為相應(yīng)的以所述密鑰的部分?jǐn)?shù)值為 固定取值的常量參數(shù); a4、對于所述源代碼中每個(gè)以密鑰的部分?jǐn)?shù)值為除數(shù)的除法運(yùn)算邏輯代碼,將該除法 運(yùn)算邏輯代碼替換為等效的以所述密鑰的部分?jǐn)?shù)值的倒數(shù)為乘數(shù)的運(yùn)算邏輯代碼,并將所 述密鑰的部分?jǐn)?shù)值的倒數(shù)替換為以該倒數(shù)的運(yùn)算結(jié)果為值的常量參數(shù); a5、對于所述源代碼中每個(gè)以密鑰為指數(shù)的模冪運(yùn)算代碼,根據(jù)該密鑰的實(shí)際數(shù)值,將 該模冪運(yùn)算代碼對應(yīng)的循環(huán)結(jié)構(gòu)展開,進(jìn)行所述展開時(shí),對于用于判斷冪的指定位是否為 零的語句,根據(jù)所述密鑰的實(shí)際數(shù)值,確定相應(yīng)的判斷結(jié)果,利用所述判斷結(jié)果對應(yīng)的程序 代碼替代所述判斷的相關(guān)程序代碼; a6、在頭文件里將所有所述常量參數(shù)進(jìn)行定義,將所述頭文件和當(dāng)前得到的加密程序 源代碼文件進(jìn)行編譯,得到編譯后的加密程序。
【文檔編號】G06F21/14GK104392154SQ201410645104
【公開日】2015年3月4日 申請日期:2014年11月10日 優(yōu)先權(quán)日:2014年11月10日
【發(fā)明者】孫吉平, 韓勇 申請人:北京深思數(shù)盾科技有限公司