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