一種支持數據簽名的java卡實現方法
【專利摘要】本發明提供一種支持數據簽名的java卡實現方法,屬于信息安全領域。采用的方法為:java卡虛擬機根據函數調用指令,執行被調用的函數;通過執行第一函數,將傳入的第一數據信息作為私鑰保存,根據私鑰計算公鑰,對第二數據信息、公鑰進行哈希計算,將得到的哈希結果作為第一中間值,將計算模式信息作為簽名模式保存,將公鑰、傳入的第二數據信息和第一中間值保存;通過執行第二函數,更新第一向量值;通過執行第三函數,分配存儲區,對第一向量值和傳入的原待簽名數據進行哈希計算,得到第二中間值,獲取私鑰,對私鑰和第二中間值進行簽名,將得到的簽名結果保存至存儲區中,計算簽名結果的長度,返回簽名結果的長度。
【專利說明】一種支持數據簽名的java卡實現方法
【技術領域】
[0001]本發明涉及信息安全領域,特別涉及一種支持數據簽名的java卡實現方法。
【背景技術】
[0002]隨著通信技術的迅速發展,信息網絡得到廣泛的應用,與此同時計算機網絡犯罪也層出不窮。人們通常采用集合國密算法的智能卡進行身份識別,從而達到保護信息網絡內部數據安全的目的。
[0003]目前,智能卡種類很多,java卡作為智能卡中的一種得到廣泛應用,然而,本發明技術人員在開發的過程中發現,java卡不能夠支持國密算法,限制了 java卡在身份識別方面的應用。
【發明內容】
[0004]為了解決現有技術的缺陷,現提出一種支持數據簽名的java卡實現方法,包括:java卡虛擬機進行初始化時,清空第一存儲區;當所述java卡虛擬機執行函數調用指令時,所述java卡虛擬機從堆棧中獲取函數引用及對象引用:
[0005]當第一函數被調用時,執行步驟SI ;
[0006]步驟S1:所述java卡虛擬機獲取第一數據信息、計算模式信息、第二數據信息,執行步驟S2 ;
[0007]步驟S2:所述java卡虛擬機判斷所述第一數據信息的類型和所述計算模式信息的類型,如果所述第一數據信息為私鑰類型,并且所述計算模式信息為簽名模式,則將所述第一數據信息作為私鑰保存至所述第一存儲區中,根據所述私鑰計算公鑰,執行步驟S3 ;否則報錯,結束;
[0008]步驟S3:所述java卡虛擬機將預先設置的第一向量值置為初始值,并對所述公鑰、所述第二數據信息以及預先保存的第一預設數據、第二預設數據、第三預設數據、第四預設數據進行哈希計算,將得到的哈希結果作為第一中間值,將所述公鑰、所述簽名模式、所述第二數據信息和所述第一中間值保存至所述第一存儲區中;
[0009]當第二函數被調用時,所述java卡虛擬機獲取傳入的原待簽名數據,判斷第一存儲區中是否存在公鑰、簽名模式、第二數據信息、第一中間值,是則獲取第一向量值,采用預設哈希算法對所述原待簽名數據和所述第一向量值進行哈希計算,用得到的哈希結果更新所述第一向量值;否則報錯,結束;
[0010]當第三函數被調用時,執行步驟Tl ;
[0011]步驟Tl:所述java卡虛擬機獲取傳入的原待簽名數據,并且分配第二存儲區,判斷第一存儲區中是否存在私鑰、簽名模式、第二數據信息、第一中間值,是則執行步驟T2 ;否則報錯,結束;
[0012]步驟T2:所述java卡虛擬機獲取第一向量值,執行步驟T3 ;
[0013]步驟T3:所述java卡虛擬機采用預設哈希算法對所述原待簽名數據和所述第一向量值進行哈希計算,用得到的哈希結果更新所述第一向量值,采用預設哈希算法對所述第一向量值進行哈希計算,將得到的哈希結果作為第二中間值,從所述第一存儲區中獲取私鑰,采用簽名算法對所述私鑰和所述第二中間值進行簽名,將得到的簽名結果保存至所述第二存儲區中,計算所述簽名結果的長度,返回所述簽名結果的長度。
[0014]所述步驟SI中,所述java卡虛擬機獲取第一數據信息、計算模式信息、第二數據信息,具體為:
[0015]步驟01:所述java卡虛擬機接收第一函數的第一參數、第一函數的第二參數、第一函數的第三參數、第一函數的第四參數、第一函數的第五參數;
[0016]步驟02:所述java卡虛擬機根據所述第一函數的第一參數查找與其對應的地址,獲取所述地址中的數據將所述數據作為第一數據信息,將所述第一函數的第二參數作為計算模式信息;根據所述第一函數的第三參數、所述第一函數的第四參數、所述第一函數的第五參數獲取第二數據信息。
[0017]當第一函數被調用時,還包括:將表示第一函數的第一參數已經初始化的標識置位;所述java卡虛擬機接收第一函數的第一參數、第一函數的第二參數、第一函數的第三參數、第一函數的第四參數、第一函數的第五參數之后,還包括:
[0018]步驟1:所述java卡虛擬機根據所述表示第一函數的第一參數已經初始化的標識,判斷所述第一函數的第一參數是否已經初始化,如果已經初始化,則執行步驟2;否則報錯,結束;
[0019]步驟2:所述java卡虛擬機判斷所述第一函數的第三參數、所述第一函數的第四參數、所述第一函數的第五參數是否合法,如果合法,則執行步驟02 ;如果不合法,則報錯,結束。
[0020]所述判斷所述第一數據信息的類型,具體包括:
[0021]計算所述第一數據信息的長度,根據所述第一數據信息的長度判斷所述第一數據信息的類型,如果所述第一數據信息的長度為第一預設長度,則確定所述第一數據信息為私鑰類型;否則確定所述第一數據信息為公鑰類型。
[0022]所述步驟S2中,如果所述第一數據信息為私鑰類型,并且所述計算模式信息為簽名模式時,還包括:
[0023]判斷所述第一存儲區中是否存在私鑰、簽名模式、所述第二數據信息,是則結束;否則將所述第一數據信息作為私鑰保存至第一存儲區中,根據所私鑰計算公鑰,執行步驟S3。
[0024]所述步驟S3中,所述采用預設哈希算法對所述第二數據信息、所述第一預設數據、所述第二預設數據、所述第三預設數據、所述第四預設數據、所述公鑰進行哈希計算,具體包括:
[0025]根據所述第二數據信息計算第二數據信息長度值,將所述第二數據信息長度值、所述第二數據信息、所述第三預設數據、所述第四預設數據、所述第一預設數據、所述第二預設數據、所述公鑰順序拼接得到拼接結果,采用預設哈希算法對所述拼接結果進行哈希計算。
[0026]當所述第二函數被調用時,所述java卡虛擬機獲取傳入的原待簽名數據,具體包括:
[0027]步驟11:所述java卡虛擬機接收第二函數的第一參數、第二函數的第二參數、第二函數的第三參數,將所述第二函數的第一參數作為存儲原待簽名數據的數組,將所述第二函數的第二參數作為所述原待簽名數據在存儲原待簽名數據的數組中的起始地址,將所述第二函數的第三參數作為原待簽名數據的長度,根據所述原待簽名數據在存儲原待簽名數據的數組中的起始地址和所述原待簽名數據的長度,從存儲原待簽名數據的數組中獲取所述原待簽名數據。
[0028]所述java卡虛擬機接收第二函數的第一參數、第二函數的第二參數、第二函數的第三參數之后,還包括:
[0029]判斷是否同時滿足所述第二函數的第一參數不為空、所述第二函數的第二參數大于等于0,并且所述第二函數的第三參數大于等于0,是則執行步驟11 ;否則報錯,結束。
[0030]所述采用預設哈希算法對所述原待簽名數據和所述第一向量值進行哈希計算,用得到的哈希結果更新所述第一向量值,具體包括:
[0031]步驟al:判斷所述第一向量值是否為初始值,是則執行步驟a2;否則執行步驟a3 ;
[0032]步驟a2:將所述第一向量值置為預設值,從所述第一存儲區中獲取所述第一中間值,采用預設哈希算法對所述第一中間值和所述第一向量值進行哈希計算,用得到的哈希結果更新所述第一向量值,執行步驟a3 ;
[0033]步驟a3:采用預設哈希算法對所述原待簽名數據和所述第一向量值進行哈希計算,用得到的哈希結果更新所述第一向量值。
[0034]所述步驟Tl中,所述java卡虛擬機獲取傳入的原待簽名數據,并且分配第二存儲區,具體包括:
[0035]步驟21:所述java卡虛擬機接收第三函數的第一參數、第三函數的第二參數、第三函數的第三參數、第三函數的第四參數、第三函數的第五參數;
[0036]步驟22:所述java卡虛擬機將所述第三函數的第一參數作為存儲原待簽名數據的數組,將所述第三函數的第二參數作為原待簽名數據在存儲原待簽名數據的數組中的起始地址,將所述第三函數的第三參數作為原待簽名數據的長度,根據原待簽名數據在存儲原待簽名數據的數組的起始地址和原待簽名數據的長度,從存儲原待簽名數據的數組中獲取原待簽名數據;將所述第三函數的第四參數作為存儲簽名結果的數組,將所述第三函數的第五參數作為簽名結果在存儲簽名結果的數組中的起始地址,根據簽名結果在存儲數組中的起始地址和存儲簽名結果的數組分配第二存儲區。
[0037]所述java卡虛擬機接收第三函數的第一參數、第三函數的第二參數、第三函數的第三參數、第三函數的第四參數、第三函數的第五參數之后,還包括:
[0038]判斷是否同時滿足所述第三函數的第一參數是否不為空、所述第三函數的第二參數大于等于O、所述第三函數的第三參數大于等于O、所述第三函數的第四參數不為空,并且所述第三函數的第五參數大于等于0,是則執行步驟22 ;否則報錯,結束。
[0039]所述步驟T2中,所述獲取第一向量值之后,還包括:
[0040]步驟bl:判斷所述第一向量值是否為初始值,是則執行步驟b2 ;否則執行步驟T3 ;
[0041]步驟b2:將所述第一向量值置為預設值,從所述第一存儲區中獲取所述第一中間值,執行步驟b3 ;
[0042]步驟b3:采用預設哈希算法對所述第一中間值和所述第一向量值進行哈希計算,用得到的哈希結果更新所述第一向量值,執行步驟T3。
[0043]所述步驟T3中,所述采用簽名算法對所述私鑰和所述第二中間值進行簽名,將得到的簽名結果保存至所述第二存儲區中,具體包括:
[0044]步驟Cl:獲取預先保存的第一常量,根據所述第一常量生成第一隨機數;
[0045]步驟c2:獲取預先保存的第一預設數據、第二預設數據,根據所述第一預設數據、所述第二預設數據和所述第一隨機數生成臨時參數;
[0046]步驟c3:根據所述第二中間值、所述第一常量和所述臨時參數生成第一取模值,并判斷所述第一取模值是否為所需值,是則執行步驟c4 ;否則返回步驟Cl ;
[0047]步驟c4:根據所述私鑰、所述第一取模值和所述第一隨機數生成第二取模值,并判斷所述第二取模值是否為所需值,是則執行步驟c5 ;否則返回執行步驟Cl ;
[0048]步驟c5:根據所述第一取模值和所述第二取模值生成簽名結果。
[0049]所述步驟c3中,所述根據所述第二中間值、所述第一常量和所述臨時參數生成第一取模值,具體包括:
[0050]對所述第二中間值和所述臨時參數執行模數為所述第一常量的加法運算,并將取模結果作為第一取模值。
[0051]所述判斷所述第一取模值是否為所需值,具體為:
[0052]判斷所述第一取模值是否等于0,或等于所述第一常量與所述第一隨機數的差,是則確定所述第一取模值不是所需值;否則確定所述第一取模值是所需值。
[0053]所述根據所述私鑰、所述第一取模值和所述第一隨機數生成第二取模值,具體為:
[0054]步驟c4_l:將所述私鑰加1,并對得到的結果取倒數,將所述倒數的值記為第一運算值;
[0055]步驟c4_2:將所述第一取模值與所述私鑰做乘積,并以所述第一隨機數為被減數減去上述乘積結果,得到第二運算值;
[0056]步驟c4_3:對所述第一運算值和所述第二運算值執行模數為所述第一常量的乘法運算,并記取模結果作為第二取模值。
[0057]所述判斷所述第二取模值是否為所需值,具體為:
[0058]判斷所述第二取模值是否為0,是則確定所述第二取模值不是所需值;否則確定所述第二取模值是所需值。
[0059]所述步驟c5中所述根據所述第一取模值和所述第二取模值生成簽名結果,具體包括:
[0060]將所述第一取模值和所述第二取模值分別轉換為長度為256比特的字節類型,得到第一字節串和第二字節串,將所述第一字節串和所述第二字節串順序拼接,將拼接結果作為簽名結果。
[0061]采用本發明提供的方法,能達到的有益效果為,java卡中進行數據簽名,擴展了java卡的應用范圍,提高了 java卡在應用過程中的安全性。
【專利附圖】
【附圖說明】
[0062]圖1為實施例1提供的一種支持數據簽名的java卡實現方法流程圖;
[0063]圖2為實施例1提供的執行第一函數的方法流程圖;
[0064]圖3為實施例1提供的執行第二函數的方法流程圖;
[0065]圖4為實施例1提供的執行第三函數的方法流程圖。
【具體實施方式】
[0066]下面將結合本發明實施例中的附圖,對本發明實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發明一部分實施例,而不是全部的實施例。基于本發明中的實施例,本領域普通技術人員在沒有做出創造性勞動前提下所獲得的所有其他實施例,都屬于本發明保護的范圍。
[0067]為使本發明的目的、技術方案和優點更加清楚,下面將結合附圖對本發明實施方式做進一步的詳細描述。
[0068]實施例1
[0069]本發明提供一種支持數據簽名的java卡實現方法,如圖1所示,具體包括:
[0070]步驟WOl: java卡虛擬機進行初始化,清空第一存儲區;
[0071]步驟W02:當java卡虛擬機執行函數調用指令時,從堆棧中獲取函數引用及對象引用;
[0072]步驟W03:java卡虛擬機判斷函數引用,如果函數引用等于java卡標準函數中的第一函數,則執行步驟W04 ;如果函數引用等于java卡標準函數中的第二函數,則執行步驟W05 ;如果函數引用等于java卡標準函數中的第三函數,則執行步驟W06 ;
[0073]步驟W04: java卡虛擬機根據函數引用及對象引用獲取第一函數地址,并將java卡虛擬機的PC指針指向第一函數地址,執行第一函數,然后返回步驟W02;
[0074]步驟W05: java卡虛擬機根據函數引用及對象引用獲取第二函數地址,并將java卡虛擬機的PC指針指向第二函數地址,執行第二函數,然后返回步驟W02;
[0075]步驟W06: java卡虛擬機根據函數引用及對象引用獲取第三函數地址,并將java卡虛擬機的PC指針指向第三函數地址,執行第三函數,然后返回步驟W02;
[0076]java卡虛擬機執行第一函數時,如圖2所示,包括以下步驟:
[0077]步驟k01: java卡虛擬機獲取第一數據信息、計算模式信息、第二數據信息;
[0078]具體地,
[0079]步驟kOl-Ι: java卡虛擬機接收第一函數的第一參數、第一函數的第二參數、第一函數的第三參數、第一函數的第四參數、第一函數的第五參數;
[0080]其中,第一函數的第一參數為密鑰對象,第一函數的第二參數為計算模式信息,第一函數的第三參數為存儲第二數據信息的數組,第一函數的第四參數為起始偏移量,第一函數的第五參數為第二數據信息長度;java卡虛擬機根據上述參數獲取第二信息。
[0081]例如:java卡虛擬機接收到的第一函數的第一參數為:1000 ;
[0082]第一函數的第二參數為:0 ;
[0083]第一函數的第三參數為:
[0084]68E7FA9E9C7F5E344C579E4BCF6509A7F39789F514AB8F96CA8CBC414C940E93 ;
[0085]第一函數的第四參數為:01 ;
[0086]第一函數的第五參數為:08。
[0087]步驟k01-2: java卡虛擬機判斷第一函數的第一參數是否已經初始化,如果已經初始化,則執行步驟k01-3 ;否則報錯,結束;
[0088]本實施例中,java卡虛擬機調用第一函數時,將表示第一函數的第一參數已經初始化的標識置位;java卡虛擬機根據表示第一函數的第一參數已經初始化的標識判斷第一函數的第一參數是否初始化,如果表示第一函數的第一參數已經初始化的標識置位,則表示第一函數的第一參數已經初始化;如果表示第一函數的第一參數已經初始化的標識未置位,則表示第一函數的第一參數未初始化。
[0089]步驟k01-3: java卡虛擬機判斷第一函數的第三參數、第一函數的第四參數、第一函數的第五參數是否合法,如果合法,則執行步驟k01-4 ;如果不合法,則報錯,結束。
[0090]本實施例中,java卡虛擬機判斷是否同時滿足第一函數的第三參數不為空,第一函數的第四參數大于等于0,并且第一函數的第五參數大于等于0,是則執行步驟k01-4 ;否則報錯,結束;
[0091]例如:第一函數的第三參數為:
[0092]68E7FA9E9C7F5E344C579E4BCF6509A7F39789F514AB8F96CA8CBC414C940E93 ;
[0093]第一函數的第四參數為:01 ;
[0094]第一函數的第五參數為:08。
[0095]即:同時滿足第一函數的第三參數不為空,第一函數的第四參數大于等于0,并且第一函數的第五參數大于等于0,執行步驟k01-4 ;
[0096]步驟kOl-4:根據第一函數的第一參數查找與其對應的地址,獲取地址中的數據將數據作為第一數據信息,將第一函數的第二參數作為計算模式信息;根據第一函數的第三參數、第一函數的第四參數、第一函數的第五參數獲取第二數據信息。
[0097]例如:第一函數的第一參數為:1000 ;
[0098]獲取1000對應的地址中存儲的第一數據信息為:
[0099]FB0EEB34DD4BD85C645F2CD2DD343ECD0ED03349282C3E1BF6DB51F1384FBC76 ;
[0100]根據第一函數的第二參數確定計算模式信息為:簽名模式;
[0101]根據第一函數的第三參數、第一函數的第四參數、第一函數的第五參數獲取第二數據信息為:31323334353637383132333435363738 ;
[0102]步驟k02: java卡虛擬機判斷第一數據信息的類型和計算模式信息的類型,如果第一數據信息為私鑰類型,并且計算模式信息為簽名模式,則執行步驟k03 ;否則報錯,結束;
[0103]本實施例中,判斷第一數據信息的類型,具體為:計算第一數據信息的長度,根據第一數據信息的長度判斷第一數據信息的類型,如果第一數據信息的長度為第一預設長度,則確定第一數據信息為私鑰類型;否則確定第一數據信息為公鑰類型。優選的,第一預設長度為32字節。判斷計算模式信息的類型,具體為:判斷第一函數的第二參數,如果第一函數的第二參數的取值為0,則計算模式信息為簽名模式;否則計算模式信息不是簽名模式。
[0104]例如:第一數據信息為:
[0105]FB0EEB34DD4BD85C645F2CD2DD343ECD0ED03349282C3E1BF6DB51F1384FBC76 ;第一數據信息的長度為32字節,等于第一預設長度,確定第一數據信息為私鑰;第一函數的第二參數為0,確定計算模式信息是簽名模式,執行步驟k03 ;
[0106]步驟k03: java卡虛擬機判斷第一存儲區中是否存在私鑰、簽名模式、第二數據信息,是則報錯,結束;否則執行步驟k04 ;
[0107]本實施例中,以第一存儲區中不存在私鑰、簽名模式、第二數據信息,執行步驟k04為例來說明;
[0108]步驟k04: java卡虛擬機將第一數據信息作為私鑰保存至第一存儲區中,根據私鑰計算公鑰,執行步驟k05;
[0109]例如,私鑰為:
[0110]FB0EEB34DD4BD85C645F2CD2DD343ECD0ED03349282C3E1BF6DB51F1384FBC76 ;根據私鑰計算得到的公鑰為:
[0111]A876F78AABB8C8C0BBC0D03CD76D2AE8AD19FCF176F6B0E7D0C803783B0CBC91
[0112]2E00F90B473D38D95A03C1C1B3629D0DA1BD07FC796D7CC6E365C8296245E305 ;
[0113]步驟k05:java卡虛擬機將預先設置的第一向量值置為初始值,獲取預先保存的第一預設數據、第二預設數據、第三預設數據、第四預設數據,采用預設哈希算法對第二數據信息、第一預設數據、第二預設數據、第三預設數據、第四預設數據、公鑰進行哈希計算,將得到的哈希結果作為第一中間值,將公鑰、簽名模式、第二數據信息和第一中間值保存至第一存儲區中;
[0114]本實施例中,采用預設哈希算法對第二數據信息、第一預設數據、第二預設數據、第三預設數據、第四預設數據、公鑰進行哈希計算,具體包括:
[0115]根據第二數據信息計算第二數據信息長度值,將第二數據信息長度值、第二數據信息、第三預設數據、第四預設數據、第一預設數據、第二預設數據、公鑰順序拼接得到拼接結果,采用預設哈希算法對拼接結果進行哈希計算。
[0116]其中,第一向量值的初始值為O ;
[0117]第一預設數據為:
[0118]32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7 ;
[0119]第二預設數據為:
[0120]BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0 ;
[0121]第三預設數據為:
[0122]FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC ;
[0123]第四預設數據為:
[0124]28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93 ;
[0125]需要說明的是,java卡虛擬機將公鑰、簽名模式、第二數據信息和第一中間值保存至第一存儲區中,具體為,將公鑰、簽名模式、第二數據信息和第一中間值分別保存至第一存儲區中,并記錄公鑰、簽名模式、第二數據信息和第一中間值在第一存儲區中的地址,java卡虛擬機判斷第一存儲區中是否存在私鑰、簽名模式、第二數據信息,具體為,判斷在第一存儲區中與記錄的地址對應的地址中是否存在數據,是則確定;
[0126]例如:根據第二數據信息計算第二數據信息長度值為:0080 ;
[0127]將第二數據信息長度值、第二數據信息、第三預設數據、第四預設數據、第一預設數據、第二預設數據、公鑰順序拼接得到拼接結果,得到的拼接結果為:
[0128]0080
[0129]31323334353637383132333435363738
[0130]FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC
[0131]28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93
[0132]32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7
[0133]BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0
[0134]A876F78AABB8C8C0BBC0D03CD76D2AE8AD19FCF176F6B0E7D0C803783B0CBC912E00F90B473D38D95A03C1C1B3629D0DA1BD07FC796D7CC6E365C8296245E305 ;
[0135]對上述拼接結果進行哈希計算,得到的第一中間值為:
[0136]6F73DC832ABB274E6B4A7305BE2A4C0F3B78C77F585B3680FF31814E9FE4AA3B。
[0137]java卡虛擬機調用第二函數時,如圖3所示,包括以下步驟:
[0138]步驟mOl: java卡虛擬機獲取傳入的原待簽名數據;
[0139]具體地,
[0140]步驟mOl-Ι: java卡虛擬機接收第二函數的第一參數、第二函數的第二參數、第二函數的第三參數;
[0141]其中,第二函數的第一參數為存儲原待簽名數據的數組,第二函數的第二參數為原待簽名數據在存儲原待簽名數據的數組中的起始地址,第二函數的第三參數為原待簽名數據的長度;java卡虛擬機可以根據原待簽名數據在存儲原待簽名數據的數組中的起始地址和原待簽名數據的長度從存儲原待簽名數據的數組中獲取原待簽名數據。
[0142]例如:第二函數的第一參數為:
[0143]CA305245A430F32B 37E7FA9E5C7F5E31 1C579E1BCF6502A7F49359F5312B8F96CD8CBF137C910E93 ;
[0144]第二函數的第二參數為:01 ;
[0145]第二函數的第三參數為:08。
[0146]步驟mOl-2: java卡虛擬機判斷第二函數的第一參數是否不為空,是則執行步驟m01-3 ;否則報錯,結束;
[0147]以步驟mOl-Ι中的數據為例,第二函數的第一參數不為空,執行步驟m01_3 ;
[0148]步驟mOl-3: java卡虛擬機判斷是否同時滿足第二函數的第二參數大于等于0,并且第二函數的第三參數大于等于0,是則執行步驟m01-4 ;否則報錯,結束;
[0149]以步驟mOl-Ι中的數據為例,第二函數的第二參數大于0,并且第二函數的第三參數大于O,執行步驟m01-4 ;
[0150]步驟mOl-4: java卡虛擬機將第二函數的第一參數作為存儲原待簽名數據的數組,將第二函數的第二參數作為原待簽名數據在存儲原待簽名數據的數組中的起始地址,將第二函數的第三參數作為原待簽名數據的長度,根據原待簽名數據在存儲原待簽名數據的數組中的起始地址和原待簽名數據的長度,從存儲原待簽名數據的數組中獲取原待簽名數據;
[0151]例如:java卡虛擬機獲取到的原待簽名數據為:
[0152]CA305245A430F32B ;
[0153]步驟m02:java卡虛擬機判斷第一存儲區中是否存在公鑰、簽名模式、第二數據信息、第一中間值,是則執行步驟m03 ;否則報錯,結束;
[0154]步驟m03:java卡虛擬機獲取第一向量值,采用預設哈希算法對原待簽名數據和第一向量值進行哈希計算,用得到的哈希結果更新第一向量值;
[0155]具體地,
[0156]步驟m03-l:判斷第一向量值是否為初始值,是則執行步驟m03_2 ;否則執行步驟m03_3 ;
[0157]以第一向量值是初始值為例,執行步驟m03-2 ;
[0158]步驟m03-2:將第一向量值置為預設值,從第一存儲區中獲取第一中間值,采用預設哈希算法對第一中間值和第一向量值進行哈希計算,用得到的哈希結果更新第一向量值,執行步驟m03-3 ;
[0159]例如:第一中間值為:
[0160]6F73DC832ABB274E6B4A7305BE2A4C0F3B78C77F585B3680FF31814E9FE4AA3B ;采用預設哈希算法對第一中間值和第一向量值進行計算,得到的哈希結果為:
[0161]43A3DC832A222A4E324AA3052E2A4C0F32A8CAAF58523380FF31814E9FE4AA32,將其作為更新后的第一向量值,執行步驟m03-3 ;
[0162]步驟m03-3:采用預設哈希算法對原待簽名數據和第一向量值進行哈希計算,用得到的哈希結果更新第一向量值。
[0163]例如:原待簽名數據為:CA305245A430F32B ;
[0164]第一向量值為:
[0165]43A3DC832A222A4E324AA3052E2A4C0F32A8CAAF58523380FF31814E9FE4AA32 ;
[0166]對原待簽名數據和第一向量值進行哈稀計算得到的更新后的第一向量值為:
[0167]53A3DC83EAE7EA5E3E5A6305E3EA5C0F3EA8CA8F585E3380FF31815E9FB5A73E。
[0168]java卡虛擬機調用第三函數時,如圖4所示,包括以下步驟:
[0169]步驟Tl: java卡虛擬機獲取傳入的原待簽名數據,并且分配第二存儲區;
[0170]具體地:
[0171]步驟Tl-1: java卡虛擬機接收第三函數的第一參數、第三函數的第二參數、第三函數的第三參數、第三函數的第四參數、第三函數的第五參數;
[0172]其中,第三函數的第一參數為存儲原待簽名數據的數組,第三函數的第二參數為原待簽名數據在存儲原待簽名數據的數組中的起始地址,第三函數的第三參數為原待簽名數據的長度,第三函數的第四參數為存儲簽名結果的數組、第三函數的第五參數為簽名結果在存儲簽名結果的數組中的起始地址,java卡虛擬機可以根據原待簽名數據在存儲原待簽名數據的數組的起始地址和原待簽名數據的長度,從存儲原待簽名數據的數組中獲取原待簽名數據,根據簽名結果在存儲數組中的起始地址和存儲簽名結果的數組分配第二存儲區;
[0173]步驟T1-2: java卡虛擬機判斷第三函數的第一參數是否不為空,是則執行步驟T1-3 ;否則報錯,結束;
[0174]步驟Tl-3:java卡虛擬機判斷是否同時滿足第三函數的第二參數大于等于0,并且第三函數的第三參數大于等于O,是則執行步驟T1-4 ;否則報錯,結束;
[0175]步驟T1-4: java卡虛擬機判斷是否同時滿足第三函數的第四參數不為空,并且第三函數的第五參數大于等于0,是則執行步驟T1-5 ;否則報錯,結束;
[0176]步驟T1-5: java卡虛擬機將第三函數的第一參數作為存儲原待簽名數據的數組,將第三函數的第二參數作為原待簽名數據在存儲原待簽名數據的數組中的起始地址,將第三函數的第三參數作為原待簽名數據的長度,根據原待簽名數據在存儲原待簽名數據的數組的起始地址和原待簽名數據的長度,從存儲原待簽名數據的數組中獲取原待簽名數據;將第三函數的第四參數作為存儲簽名結果的數組,將第三函數的第五參數作為簽名結果在存儲簽名結果的數組中的起始地址,根據簽名結果在存儲數組中的起始地址和存儲簽名結果的數組分配第二存儲區;
[0177]例如,第三函數的第一參數為:31323334 ;
[0178]第三函數的第二參數為:00 ;
[0179]第三函數的第三參數為:04 ;
[0180]第三函數的第四參數為:輸出數據數組的應用;
[0181]第三函數的第五參數為:0 ;
[0182]獲取到的原待簽名數據為:CA305245A430F32B ;
[0183]步驟T2: java卡虛擬機判斷第一存儲區中是否存在私鑰、簽名模式、第二數據信息、第一中間值,是則執行步驟T3 ;否則報錯,結束;
[0184]以第一存儲區中存在私鑰、簽名模式、第二數據信息、第一中間值為例,執行步驟T3 ;
[0185]步驟T3: java卡虛擬機獲取第一向量值,執行步驟T4 ;
[0186]具體地,本步驟包括:
[0187]步驟T3-1: java卡虛擬機獲取第一向量值,判斷第一向量值是否為初始值,是則執行步驟T3-2 ;否則執行步驟T4 ;
[0188]步驟T3-2:java卡虛擬機將第一向量值置為預設值,從第一存儲區中獲取第一中間值,執行步驟T3-3 ;
[0189]步驟T3-3: java卡虛擬機采用預設哈希算法對第一中間值和第一向量值進行哈希計算,用得到的哈希結果更新第一向量值,執行步驟T4。
[0190]例如:第一中間值為:
[0191]6F73DC832ABB274E6B4A7305BE2A4C0F3B78C77F585B3680FF31814E9FE4AA3B ;
[0192]更新后的第一向量值為:
[0193]43A3DC832A222A4E324AA3052E2A4C0F32A8CAAF58523380FF31814E9FE4AA32 ;
[0194]步驟T4: java卡虛擬機采用預設哈希算法對原待簽名數據和第一向量值進行哈希計算,用得到的哈希結果更新第一向量值,采用預設哈希算法對第一向量值進行哈希計算,將得到的哈希結果作為第二中間值,從第一存儲區中獲取私鑰,采用簽名算法對私鑰和第二中間值進行簽名,將得到的簽名結果保存至第二存儲區中,計算簽名結果的長度,返回簽名結果的長度。
[0195]具體地:
[0196]步驟T4-1: java卡虛擬機采用預設哈希算法對原待簽名數據和第一向量值進行哈希計算,用得到的哈希結果更新第一向量值,采用預設哈希算法對第一向量值進行計算,將得到的計算結果作為第二中間值;
[0197]步驟T4-2: java卡虛擬機從第一存儲區中獲取私鑰;
[0198]步驟T4-3: java卡虛擬機獲取預先保存的第一常量,根據第一常量生成第一隨機數,獲取預先保存的第一預設數據、第二預設數據,根據第一預設數據、第二預設數據和第一隨機數生成臨時參數,根據第二中間值、第一常量和臨時參數生成第一取模值,并判斷第一取模值是否為所需值,是則執行步驟T4-4 ;否則返回步驟T4-3 ;
[0199]具體地,java卡虛擬機獲取預先保存的第一常量,根據第一常量生成第一隨機數,獲取預先保存的第一預設數據、第二預設數據,根據第一預設數據、第二預設數據和第一隨機數生成臨時參數,對第二中間值和臨時參數執行模數為第一常量的加法運算,并將取模結果作為第一取模值,判斷第一取模值是否等于0,或等于第一常量與第一隨機數的差,是則確定第一取模值不是所需值;否則確定第一取模值是所需值。
[0200]步驟T4-4: java卡虛擬機根據私鑰、第一取模值和第一隨機數生成第二取模值,并判斷第二取模值是否為所需值,是則執行步驟T4-5 ;否則返回執行步驟T4-3 ;
[0201]具體地,java卡虛擬機將私鑰加1,并對得到的結果取倒數,將倒數的值記為第一運算值,將第一取模值與私鑰做乘積,并以第一隨機數為被減數減去上述乘積結果,得到第二運算值,對第一運算值和第二運算值執行模數為第一常量的乘法運算,并記取模結果作為第二取模值,判斷第二取模值是否為0,是則確定第二取模值不是所需值;否則確定第二取模值是所需值。
[0202]步驟T4-5: java卡虛擬機根據第一取模值和第二取模值生成簽名結果,計算簽名結果長度,返回簽名結果長度。
[0203]具體地,java卡虛擬機將第一取模值和第二取模值分別轉換為長度為256比特的字節類型,得到第一字節串和第二字節串,將第一字節串和第二字節串順序拼接,將拼接結果作為簽名結果。
[0204]例如:java卡虛擬機采用預設哈希算法對原待簽名數據和第一向量值進行哈希計算,得到更新后的第一向量值為:
[0205]53A3DC83EAE7EA5E3E5A6305E3EA5C0F3EA8CA8F585E3380FF31815E9FB5A73E ;采用預設哈希算法對第一向量值進行計算,得到第二中間值為:
[0206]83A3DC23BAB7BA8B3B8A6308B3BA8C0F3BA2CA2F828B3320FF3I218B9FB8A73B ;
[0207]獲取到的私鑰為:
[0208]FB0EEB34DD4BD85C645F2CD2DD343ECD0ED03349282C3E1BF6DB51F1384FBC76 ;
[0209]得到的簽名結果為:
[0210]635C1F237D5A57CAD826208AF564D28A1E9383023FD0032A540A8986B335FD54FC3BAB38FC9F749478CFB9C8AD82F04F13C5E2D074FE6A1F7D4E00B6AFA4D4DD ;根據簽名結果計算得到簽名結果長度為64字節。
[0211]以上,僅為本發明的【具體實施方式】,但本發明的保護范圍并不局限于此,任何熟悉本【技術領域】的技術人員在本發明揭露的技術范圍內,可輕易想到變化或替換,都應涵蓋在本發明的保護范圍之內。因此,本發明的保護范圍應以權利要求的保護范圍為準。
【權利要求】
1.一種支持數據簽名的java卡實現方法,其特征在于,包括:java卡虛擬機進行初始化時,清空第一存儲區;當所述java卡虛擬機執行函數調用指令時,所述java卡虛擬機從堆棧中獲取函數引用及對象引用: 當第一函數被調用時,執行步驟SI ; 步驟S1:所述java卡虛擬機獲取第一數據信息、計算模式信息、第二數據信息,執行步驟S2 ; 步驟S2:所述java卡虛擬機判斷所述第一數據信息的類型和所述計算模式信息的類型,如果所述第一數據信息為私鑰類型,并且所述計算模式信息為簽名模式,則將所述第一數據信息作為私鑰保存至所述第一存儲區中,根據所述私鑰計算公鑰,執行步驟S3 ;否則報錯,結束; 步驟S3:所述java卡虛擬機將預先設置的第一向量值置為初始值,并對所述公鑰、所述第二數據信息以及預先保存的第一預設數據、第二預設數據、第三預設數據、第四預設數據進行哈希計算,將得到的哈希結果作為第一中間值,將所述公鑰、所述簽名模式、所述第二數據信息和所述第一中間值保存至所述第一存儲區中; 當第二函數被調用時,所述java卡虛擬機獲取傳入的原待簽名數據,判斷第一存儲區中是否存在公鑰、簽名模式、第二數據信息、第一中間值,是則獲取第一向量值,采用預設哈希算法對所述原待簽名數據和所述第一向量值進行哈希計算,用得到的哈希結果更新所述第一向量值;否則報錯,結束; 當第三函數被調用時,執行步驟Tl ; 步驟Tl:所述java卡虛擬機獲取傳入的原待簽名數據,并且分配第二存儲區,判斷第一存儲區中是否存在私鑰、簽名模式、第二數據信息、第一中間值,是則執行步驟T2 ;否則報錯,結束; 步驟T2:所述java卡虛擬機獲取第一向量值,執行步驟T3 ; 步驟T3:所述java卡虛擬機采用預設哈希算法對所述原待簽名數據和所述第一向量值進行哈希計算,用得到的哈希結果更新所述第一向量值,采用預設哈希算法對所述第一向量值進行哈希計算,將得到的哈希結果作為第二中間值,從所述第一存儲區中獲取私鑰,采用簽名算法對所述私鑰和所述第二中間值進行簽名,將得到的簽名結果保存至所述第二存儲區中,計算所述簽名結果的長度,返回所述簽名結果的長度。
2.如權利要求1所述的方法,其特征在于,所述步驟SI中,所述java卡虛擬機獲取第一數據信息、計算模式信息、第二數據信息,具體為: 步驟Ol:所述java卡虛擬機接收第一函數的第一參數、第一函數的第二參數、第一函數的第三參數、第一函數的第四參數、第一函數的第五參數; 步驟02:所述java卡虛擬機根據所述第一函數的第一參數查找與其對應的地址,獲取所述地址中的數據將所述數據作為第一數據信息,將所述第一函數的第二參數作為計算模式信息;根據所述第一函數的第三參數、所述第一函數的第四參數、所述第一函數的第五參數獲取第二數據信息。
3.如權利要求2所述的方法,其特征在于,當第一函數被調用時,還包括:將表示第一函數的第一參數已經初始化的標識置位;所述java卡虛擬機接收第一函數的第一參數、第一函數的第二參數、第一函數的第三參數、第一函數的第四參數、第一函數的第五參數之后,還包括: 步驟1:所述java卡虛擬機根據所述表示第一函數的第一參數已經初始化的標識,判斷所述第一函數的第一參數是否已經初始化,如果已經初始化,則執行步驟2 ;否則報錯,結束; 步驟2:所述java卡虛擬機判斷所述第一函數的第三參數、所述第一函數的第四參數、所述第一函數的第五參數是否合法,如果合法,則執行步驟02 ;如果不合法,則報錯,結束。
4.如權利要求1所述的方法,其特征在于,所述判斷所述第一數據信息的類型,具體包括: 計算所述第一數據信息的長度,根據所述第一數據信息的長度判斷所述第一數據信息的類型,如果所述第一數據信息的長度為第一預設長度,則確定所述第一數據信息為私鑰類型;否則確定所述第一數據信息為公鑰類型。
5.如權利要求1所述的方法,其特征在于,所述步驟S2中,如果所述第一數據信息為私鑰類型,并且所述計算模式信息為簽名模式時,還包括: 判斷所述第一存儲區中是否存在私鑰、簽名模式、所述第二數據信息,是則結束;否則將所述第一數據信息作為私鑰保存至第一存儲區中,根據所私鑰計算公鑰,執行步驟S3。
6.如權利要求1所述的方法,其特征在于,所述步驟S3中,所述采用預設哈希算法對所述第二數據信息、所述第一預設數據、所述第二預設數據、所述第三預設數據、所述第四預設數據、所述公鑰進行哈希計算,具體包括: 根據所述第二數據信息計算第二數據信息長度值,將所述第二數據信息長度值、所述第二數據信息、所述第三預設數據、所述第四預設數據、所述第一預設數據、所述第二預設數據、所述公鑰順序拼接得到拼接結果,采用預設哈希算法對所述拼接結果進行哈希計算。
7.如權利要求1所述的方法,其特征在于,當所述第二函數被調用時,所述java卡虛擬機獲取傳入的原待簽名數據,具體包括: 步驟11:所述java卡虛擬機接收第二函數的第一參數、第二函數的第二參數、第二函數的第三參數,將所述第二函數的第一參數作為存儲原待簽名數據的數組,將所述第二函數的第二參數作為所述原待簽名數據在存儲原待簽名數據的數組中的起始地址,將所述第二函數的第三參數作為原待簽名數據的長度,根據所述原待簽名數據在存儲原待簽名數據的數組中的起始地址和所述原待簽名數據的長度,從存儲原待簽名數據的數組中獲取所述原待簽名數據。
8.如權利要求7所述的方法,其特征在于,所述java卡虛擬機接收第二函數的第一參數、第二函數的第二參數、第二函數的第三參數之后,還包括: 判斷是否同時滿足所述第二函數的第一參數不為空、所述第二函數的第二參數大于等于0,并且所述第二函數的第三參數大于等于0,是則執行步驟11 ;否則報錯,結束。
9.如權利要求1所述的方法,其特征在于,所述采用預設哈希算法對所述原待簽名數據和所述第一向量值進行哈希計算,用得到的哈希結果更新所述第一向量值,具體包括: 步驟al:判斷所述第一向量值是否為初始值,是則執行步驟a2 ;否則執行步驟a3 ; 步驟a2:將所述第一向量值置為預設值,從所述第一存儲區中獲取所述第一中間值,采用預設哈希算法對所述第一中間值和所述第一向量值進行哈希計算,用得到的哈希結果更新所述第一向量值,執行步驟a3 ; 步驟a3:采用預設哈希算法對所述原待簽名數據和所述第一向量值進行哈希計算,用得到的哈希結果更新所述第一向量值。
10.如權利要求1所述的方法,其特征在于,所述步驟Tl中,所述java卡虛擬機獲取傳入的原待簽名數據,并且分配第二存儲區,具體包括: 步驟21:所述java卡虛擬機接收第三函數的第一參數、第三函數的第二參數、第三函數的第三參數、第三函數的第四參數、第三函數的第五參數; 步驟22:所述java卡虛擬機將所述第三函數的第一參數作為存儲原待簽名數據的數組,將所述第三函數的第二參數作為原待簽名數據在存儲原待簽名數據的數組中的起始地址,將所述第三函數的第三參數作為原待簽名數據的長度,根據原待簽名數據在存儲原待簽名數據的數組的起始地址和原待簽名數據的長度,從存儲原待簽名數據的數組中獲取原待簽名數據;將所述第三函數的第四參數作為存儲簽名結果的數組,將所述第三函數的第五參數作為簽名結果在存儲簽名結果的數組中的起始地址,根據簽名結果在存儲數組中的起始地址和存儲簽名結果的數組分配第二存儲區。
11.如權利要求10所述的方法,其特征在于,所述java卡虛擬機接收第三函數的第一參數、第三函數的第二參數、第三函數的第三參數、第三函數的第四參數、第三函數的第五參數之后,還包括: 判斷是否同時滿足所述第三函數的第一參數是否不為空、所述第三函數的第二參數大于等于O、所述第三函數的第三參數大于等于O、所述第三函數的第四參數不為空,并且所述第三函數的第五參數大于等于0,是則執行步驟22 ;否則報錯,結束。
12.如權利要求1所述的方法,其特征在于,所述步驟T2中,所述獲取第一向量值之后,還包括: 步驟bl:判斷所述第一向量值是否為初始值,是則執行步驟b2 ;否則執行步驟T3 ; 步驟b2:將所述第一向量值置為預設值,從所述第一存儲區中獲取所述第一中間值,執行步驟b3 ; 步驟b3:采用預設哈希算法對所述第一中間值和所述第一向量值進行哈希計算,用得到的哈希結果更新所述第一向量值,執行步驟T3。
13.如權利要求1所述的方法,其特征在于,所述步驟T3中,所述采用簽名算法對所述私鑰和所述第二中間值進行簽名,將得到的簽名結果保存至所述第二存儲區中,具體包括: 步驟Cl:獲取預先保存的第一常量,根據所述第一常量生成第一隨機數; 步驟c2:獲取預先保存的第一預設數據、第二預設數據,根據所述第一預設數據、所述第二預設數據和所述第一隨機數生成臨時參數; 步驟c3:根據所述第二中間值、所述第一常量和所述臨時參數生成第一取模值,并判斷所述第一取模值是否為所需值,是則執行步驟c4 ;否則返回步驟Cl ; 步驟c4:根據所述私鑰、所述第一取模值和所述第一隨機數生成第二取模值,并判斷所述第二取模值是否為所需值,是則執行步驟c5 ;否則返回執行步驟Cl ; 步驟c5:根據所述第一取模值和所述第二取模值生成簽名結果。
14.如權利要求13所述的方法,其特征在于,所述步驟c3中,所述根據所述第二中間值、所述第一常量和所述臨時參數生成第一取模值,具體包括: 對所述第二中間值和所述臨時參數執行模數為所述第一常量的加法運算,并將取模結果作為第一取模值。
15.如權利要求13所述的方法,其特征在于,所述判斷所述第一取模值是否為所需值,具體為: 判斷所述第一取模值是否等于O,或等于所述第一常量與所述第一隨機數的差,是則確定所述第一取模值不是所需值;否則確定所述第一取模值是所需值。
16.如權利要求13所述的方法,其特征在于,所述根據所述私鑰、所述第一取模值和所述第一隨機數生成第二取模值,具體為: 步驟c4-l:將所述私鑰加1,并對得到的結果取倒數,將所述倒數的值記為第一運算值; 步驟c4-2:將所述第一取模值與所述私鑰做乘積,并以所述第一隨機數為被減數減去上述乘積結果,得到第二運算值; 步驟c4-3:對所述第一運算值和所述第二運算值執行模數為所述第一常量的乘法運算,并記取模結果作為第二取模值。
17.如權利要求13所述的方法,其特征在于,所述判斷所述第二取模值是否為所需值,具體為: 判斷所述第二取模值是否為O,是則確定所述第二取模值不是所需值;否則確定所述第二取模值是所需值。
18.如權利要求13所述的方法,其特征在于,所述步驟c5中所述根據所述第一取模值和所述第二取模值生成簽名結果,具體包括: 將所述第一取模值和所述第二取模值分別轉換為長度為256比特的字節類型,得到第一字節串和第二字節串,將所述第一字節串和所述第二字節串順序拼接,將拼接結果作為簽名結果。
【文檔編號】G06F21/62GK104331657SQ201410513378
【公開日】2015年2月4日 申請日期:2014年9月29日 優先權日:2014年9月29日
【發明者】陸舟, 于華章 申請人:飛天誠信科技股份有限公司