本發(fā)明涉及密碼算法技術(shù)領(lǐng)域,尤其是涉及一種密鑰獲取方法、數(shù)字簽名方法和裝置。
背景技術(shù):
SM2橢圓曲線公鑰密碼算法是一種更為先進(jìn)安全的密碼算法。在多倍點(diǎn)運(yùn)算中,已知多倍點(diǎn)與基點(diǎn),求解倍數(shù)的問題成為橢圓曲線離散對(duì)數(shù)問題。與大數(shù)分解問題及有限域上離線對(duì)數(shù)問題相比,橢圓曲線離散對(duì)數(shù)問題的求解難度要大很多。因此,在相同安全程度要求下,橢圓曲線密碼較其他公鑰密碼所需的密鑰規(guī)模要小很多。
在進(jìn)行基于SM2的數(shù)字簽名算法的研發(fā)中,需要對(duì)簽名算法的安全性進(jìn)行測(cè)試。現(xiàn)有的測(cè)試方式主要是在數(shù)字簽名的過程中注入一定的錯(cuò)誤數(shù)據(jù),并獲得驗(yàn)簽結(jié)果,繼而判斷是否能夠獲得上述簽名算法中的密鑰,以確定上述簽名算法是否符合安全性標(biāo)準(zhǔn);然而,上述獲取密鑰的方式通常要求簽名過程中產(chǎn)生的隨機(jī)數(shù)具有一定的范圍,該限制大大降低了對(duì)數(shù)字簽名算法測(cè)試的有效性和可實(shí)施性。
針對(duì)上述獲取密鑰的方式限制性較大的問題,尚未提出有效的解決方案。
技術(shù)實(shí)現(xiàn)要素:
有鑒于此,本發(fā)明的目的在于提供一種密鑰獲取方法、數(shù)字簽名方法和裝置,以降低獲取密鑰的方式限制性。
第一方面,本發(fā)明實(shí)施例提供了一種密鑰獲取方法,該密鑰用于基于SM2橢圓曲線公鑰密碼算法的數(shù)字簽名算法中,該方法包括:設(shè)置密鑰的最高字節(jié)位置為目標(biāo)字節(jié)位置,進(jìn)行下述字節(jié)值獲取操作:采用物理方式更改目標(biāo)字節(jié)位置的數(shù)據(jù),生成與密鑰字節(jié)長(zhǎng)度相同的偽密鑰;其中,該物理方式包括激光照射方式或電泳刺激方式;根據(jù)偽密鑰進(jìn)行數(shù)字簽名,記錄數(shù)字簽名過程中生成的第一橢圓曲線點(diǎn)和簽名結(jié)果;根據(jù)簽名結(jié)果進(jìn)行數(shù)字簽名的驗(yàn)簽,記錄驗(yàn)簽過程中生成的第二橢圓曲線點(diǎn);根據(jù)第一橢圓曲線點(diǎn)和第二橢圓曲線點(diǎn)的差值,從預(yù)設(shè)的字節(jié)值范圍內(nèi)搜索密鑰與偽密鑰的目標(biāo)字節(jié)位置的字節(jié)差值;根據(jù)字節(jié)差值,設(shè)置密鑰的目標(biāo)字節(jié)位置的字節(jié)值的取值范圍;根據(jù)取值范圍確定密鑰的目標(biāo)字節(jié)位置的字節(jié)值;設(shè)置目標(biāo)字節(jié)位置的下一個(gè)字節(jié)位置為新的目標(biāo)字節(jié)位置,繼續(xù)進(jìn)行上述字節(jié)值獲取操作,直至獲取到密鑰的所有字節(jié)位置的字節(jié)值,將所有字節(jié)位置的字節(jié)值確定為密鑰。
結(jié)合第一方面,本發(fā)明實(shí)施例提供了第一方面的第一種可能的實(shí)施方式,其中,上述根據(jù)第一橢圓曲線點(diǎn)和第二橢圓曲線點(diǎn)的差值,從預(yù)設(shè)的字節(jié)值范圍內(nèi)搜索密鑰與偽密鑰的目標(biāo)字節(jié)位置的字節(jié)差值包括:設(shè)置字節(jié)差值的初始值d=00,進(jìn)行下述字節(jié)差值搜索操作:判斷字節(jié)差值d的[d*2248*r mod n]G的坐標(biāo)是否等于第一橢圓曲線點(diǎn)和第二橢圓曲線點(diǎn)的差值[k]G-(x1’,y1’);其中,(x1,y1)=[k]G為第一橢圓曲線點(diǎn);(x1’,y1’)為第二橢圓曲線點(diǎn);r=(e+x1)mod n;ZA為關(guān)于用戶A的可辨別標(biāo)識(shí)、部分橢圓曲線系統(tǒng)參數(shù)和用戶A公鑰的雜湊值;M為待簽名的消息;Hv()為消息摘要長(zhǎng)度為v比特的密碼雜湊函數(shù);e為密碼雜湊函數(shù)作用于消息M的輸出值;modn為模n運(yùn)算;n為基點(diǎn)G的階;如果否,更新d=d+1,繼續(xù)進(jìn)行上述字節(jié)差值搜索操作,直至d=FF;如果是,記錄字節(jié)差值;或者;設(shè)置字節(jié)差值的初始值d=-01,進(jìn)行下述字節(jié)差值搜索操作:判斷字節(jié)差值d的[d*2248*r mod n]G的坐標(biāo)是否等于第一橢圓曲線點(diǎn)和第二橢圓曲線點(diǎn)的差值[k]G-(x1’,y1’);其中,(x1,y1)=[k]G為第一橢圓曲線點(diǎn);(x1’,y1’)為第二橢圓曲線點(diǎn);r=(e+x1)mod n;ZA為關(guān)于用戶A的可辨別標(biāo)識(shí)、部分橢圓曲線系統(tǒng)參數(shù)和用戶A公鑰的雜湊值;M為待簽名的消息;Hv()為消息摘要長(zhǎng)度為v比特的密碼雜湊函數(shù);e為密碼雜湊函數(shù)作用于消息M的輸出值;modn為模n運(yùn)算;n為橢圓曲線基點(diǎn)G的階;(r,s)為發(fā)送的簽名;x||y為x與y的拼接;如果否,更新d=d-1,繼續(xù)進(jìn)行上述字節(jié)差值搜索操作,直至d=-FF;如果是,記錄字節(jié)差值。
結(jié)合第一方面的第一種可能的實(shí)施方式,本發(fā)明實(shí)施例提供了第一方面的第二種可能的實(shí)施方式,其中,上述第二橢圓曲線點(diǎn)(x1’,y1’)通過下述方式獲得:(x1’,y1’)=[s’]G+[t]PA=[s’+t*dA]G=[s’+(s’+r)*dA]=[(1+dA)s’+r*dA]G=[k-r*dA’+r*dA]G;其中,PA=[dA]G;(r’,s’)為收到的簽名;t=(r’+s’)mod n;PA為用戶A的公鑰;dA為用戶A的私鑰;dA’為偽密鑰;k為隨機(jī)數(shù)發(fā)生器產(chǎn)生的隨機(jī)數(shù),且k∈[1,n-1];[k]G=(r-e)mod n;或者;(x1’,y1’)=[s’+t*dA]G=[s’+(s’+r)*dA]=[(1+dA)s’+r*dA]G=[(1+dA)(1+dA’)-1(k-r*dA)+r*dA]G=[k+(dA-dA’)(k-r*dA)]G=[k]G+[(dA-dA’)k]G–[(dA-dA’)r]PA;其中,(r’,s’)為收到的簽名;t=(r’+s’)mod n;PA為用戶A的公鑰;dA為用戶A的私鑰;dA’為偽密鑰;k為隨機(jī)數(shù)發(fā)生器產(chǎn)生的隨機(jī)數(shù),且k∈[1,n-1];[k]G=(r-e)mod n。
結(jié)合第一方面,本發(fā)明實(shí)施例提供了第一方面的第三種可能的實(shí)施方式,其中,上述根據(jù)字節(jié)差值,設(shè)置密鑰的目標(biāo)字節(jié)位置的字節(jié)值的取值范圍包括:設(shè)置密鑰的目標(biāo)字節(jié)位置的字節(jié)值d1=d+d2的取值范圍M=[d,FF];其中,d為字節(jié)差值,且d≥0;d2為偽密鑰的目標(biāo)字節(jié)位置的字節(jié)值;d2、d1和d為十六進(jìn)制的兩位數(shù),且0≤d2≤FF;或者;設(shè)置密鑰的目標(biāo)字節(jié)位置的字節(jié)值d1=d+d2的取值范圍M=[00,FF+d];其中,d為字節(jié)差值,且d≤0;d2為偽密鑰的目標(biāo)字節(jié)位置的字節(jié)值;d2、d1和d為十六進(jìn)制的兩位數(shù),且0≤d2≤FF。
結(jié)合第一方面,本發(fā)明實(shí)施例提供了第一方面的第四種可能的實(shí)施方式,其中,上述根據(jù)取值范圍確定密鑰的目標(biāo)字節(jié)位置的字節(jié)值包括:判斷取值范圍中最大值和最小值是否相同;如果否,繼續(xù)進(jìn)行字節(jié)值獲取操作;如果是,確定最大值和/或最小值為密鑰的目標(biāo)字節(jié)位置的字節(jié)值。
第二方面,本發(fā)明實(shí)施例提供了一種數(shù)字簽名方法,該方法包括:將接收到的待簽名的消息M與預(yù)先存儲(chǔ)的ZA進(jìn)行拼接處理,獲得拼接處理結(jié)果其中,ZA為關(guān)于用戶A的可辨別標(biāo)識(shí)、部分橢圓曲線系統(tǒng)參數(shù)和用戶A公鑰的雜湊值;進(jìn)行下述生成簽名結(jié)果的操作:根據(jù)密碼雜湊函數(shù),對(duì)進(jìn)行處理,獲得密碼雜湊函數(shù)作用于消息M的輸出值其中,Hv()為消息摘要長(zhǎng)度為v比特的密碼雜湊函數(shù);通過隨機(jī)數(shù)發(fā)生器獲取隨機(jī)數(shù)k;其中,k∈[1,n-1];n為n為橢圓曲線基點(diǎn)G的階;獲取第一橢圓曲線點(diǎn)(x1,y1)=[k]G;獲取r=(e+x1)mod n;判斷r=0或者r+k=n是否成立;如果是,繼續(xù)進(jìn)行上述生成簽名結(jié)果的操作;如果否,獲取s=((1+dA)-1(k-r*dA))mod n;其中,(1+dA)-1和dA均為預(yù)先存儲(chǔ)的數(shù)據(jù);dA為用戶A的私鑰;判斷s是否等于0;如果s等于0,繼續(xù)進(jìn)行上述生成簽名結(jié)果的操作;如果s不等于0,確定數(shù)字簽名結(jié)果(r,s)。
第三方面,本發(fā)明實(shí)施例提供了一種密鑰獲取裝置,該密鑰用于基于SM2橢圓曲線公鑰密碼算法的數(shù)字簽名算法中,該裝置包括:目標(biāo)字節(jié)位置設(shè)置模塊,用于設(shè)置密鑰的最高字節(jié)位置為目標(biāo)字節(jié)位置,進(jìn)行下述字節(jié)值獲取操作:偽密鑰生成模塊,用于采用物理方式更改目標(biāo)字節(jié)位置的數(shù)據(jù),生成與密鑰字節(jié)長(zhǎng)度相同的偽密鑰;其中,該物理方式包括激光照射方式或電泳刺激方式;數(shù)字簽名模塊,用于根據(jù)偽密鑰進(jìn)行數(shù)字簽名,記錄數(shù)字簽名過程中生成的第一橢圓曲線點(diǎn)和簽名結(jié)果;驗(yàn)簽?zāi)K,用于根據(jù)簽名結(jié)果進(jìn)行數(shù)字簽名的驗(yàn)簽,記錄驗(yàn)簽過程中生成的第二橢圓曲線點(diǎn);字節(jié)差值搜索模塊,用于根據(jù)第一橢圓曲線點(diǎn)和第二橢圓曲線點(diǎn)的差值,從預(yù)設(shè)的字節(jié)值范圍內(nèi)搜索密鑰與偽密鑰的目標(biāo)字節(jié)位置的字節(jié)差值;取值范圍設(shè)置模塊,用于根據(jù)字節(jié)差值,設(shè)置密鑰的目標(biāo)字節(jié)位置的字節(jié)值的取值范圍;字節(jié)值確定模塊,用于根據(jù)取值范圍確定密鑰的目標(biāo)字節(jié)位置的字節(jié)值;密鑰確定模塊,用于設(shè)置目標(biāo)字節(jié)位置的下一個(gè)字節(jié)位置為新的目標(biāo)字節(jié)位置,繼續(xù)進(jìn)行上述字節(jié)值獲取操作,直至獲取到密鑰的所有字節(jié)位置的字節(jié)值,將所有字節(jié)位置的字節(jié)值確定為密鑰。
結(jié)合第三方面,本發(fā)明實(shí)施例提供了第三方面的第一種可能的實(shí)施方式,其中,上述字節(jié)差值搜索模塊包括:第一初始值設(shè)置單元,用于設(shè)置字節(jié)差值的初始值d=00,進(jìn)行下述字節(jié)差值搜索操作:第一判斷單元,用于判斷字節(jié)差值d的[d*2248*r mod n]G的坐標(biāo)是否等于第一橢圓曲線點(diǎn)和第二橢圓曲線點(diǎn)的差值[k]G-(x1’,y1’);其中,(x1,y1)=[k]G為第一橢圓曲線點(diǎn);(x1’,y1’)為第二橢圓曲線點(diǎn);r=(e+x1)mod n;ZA為關(guān)于用戶A的可辨別標(biāo)識(shí)、部分橢圓曲線系統(tǒng)參數(shù)和用戶A公鑰的雜湊值;M為待簽名的消息;Hv()為消息摘要長(zhǎng)度為v比特的密碼雜湊函數(shù);e為密碼雜湊函數(shù)作用于消息M的輸出值;modn為模n運(yùn)算;n為基點(diǎn)G的階;第一更新單元,用于如果字節(jié)差值d的[d*2248*r mod n]G的坐標(biāo)不等于第一橢圓曲線點(diǎn)和第二橢圓曲線點(diǎn)的差值[k]G-(x1’,y1’),更新d=d+1,繼續(xù)進(jìn)行上述字節(jié)差值搜索操作,直至d=FF;第一記錄單元,用于如果字節(jié)差值d的[d*2248*r mod n]G的坐標(biāo)等于第一橢圓曲線點(diǎn)和第二橢圓曲線點(diǎn)的差值[k]G-(x1’,y1’),記錄字節(jié)差值;或者;第二初始值設(shè)置單元,用于設(shè)置字節(jié)差值的初始值d=-01,進(jìn)行下述字節(jié)差值搜索操作:第二判斷單元,用于判斷字節(jié)差值d的[d*2248*r mod n]G的坐標(biāo)是否等于第一橢圓曲線點(diǎn)和第二橢圓曲線點(diǎn)的差值[k]G-(x1’,y1’);其中,(x1,y1)=[k]G為第一橢圓曲線點(diǎn);(x1’,y1’)為第二橢圓曲線點(diǎn);r=(e+x1)mod n;ZA為關(guān)于用戶A的可辨別標(biāo)識(shí)、部分橢圓曲線系統(tǒng)參數(shù)和用戶A公鑰的雜湊值;M為待簽名的消息;Hv()為消息摘要長(zhǎng)度為v比特的密碼雜湊函數(shù);e為密碼雜湊函數(shù)作用于消息M的輸出值;modn為模n運(yùn)算;n為橢圓曲線基點(diǎn)G的階;(r,s)為發(fā)送的簽名;x||y為x與y的拼接;第二更新單元,用于如果字節(jié)差值d的[d*2248*r mod n]G的坐標(biāo)不等于第一橢圓曲線點(diǎn)和第二橢圓曲線點(diǎn)的差值[k]G-(x1’,y1’),更新d=d-1,繼續(xù)進(jìn)行上述字節(jié)差值搜索操作,直至d=-FF;第二記錄單元,用于如果字節(jié)差值d的[d*2248*r mod n]G的坐標(biāo)等于第一橢圓曲線點(diǎn)和第二橢圓曲線點(diǎn)的差值[k]G-(x1’,y1’),記錄字節(jié)差值。
結(jié)合第三方面,本發(fā)明實(shí)施例提供了第三方面的第二種可能的實(shí)施方式,其中,上述字節(jié)值確定模塊包括:第三判斷單元,用于判斷取值范圍中最大值和最小值是否相同;繼續(xù)操作單元,用于如果取值范圍中最大值和最小值不相同,繼續(xù)進(jìn)行字節(jié)值獲取操作;字節(jié)值確定單元,用于如果取值范圍中最大值和最小值相同,確定最大值和/或最小值為密鑰的目標(biāo)字節(jié)位置的字節(jié)值。
第四方面,本發(fā)明實(shí)施例提供了一種數(shù)字簽名裝置,該裝置包括:拼接處理模塊,用于將接收到的待簽名的消息M與預(yù)先存儲(chǔ)的ZA進(jìn)行拼接處理,獲得拼接處理結(jié)果其中,ZA為關(guān)于用戶A的可辨別標(biāo)識(shí)、部分橢圓曲線系統(tǒng)參數(shù)和用戶A公鑰的雜湊值;進(jìn)行下述生成簽名結(jié)果的操作:處理模塊,用于根據(jù)密碼雜湊函數(shù),對(duì)進(jìn)行處理,獲得密碼雜湊函數(shù)作用于消息M的輸出值其中,Hv()為消息摘要長(zhǎng)度為v比特的密碼雜湊函數(shù);隨機(jī)數(shù)獲取模塊,用于通過隨機(jī)數(shù)發(fā)生器獲取隨機(jī)數(shù)k;其中,k∈[1,n-1];n為n為橢圓曲線基點(diǎn)G的階;第一橢圓曲線點(diǎn)獲取模塊,用于獲取第一橢圓曲線點(diǎn)(x1,y1)=[k]G;r獲取模塊,用于獲取r=(e+x1)mod n;第一判斷模塊,用于判斷r=0或者r+k=n是否成立;第一繼續(xù)操作模塊,用于如果r=0或者r+k=n成立,繼續(xù)進(jìn)行上述生成簽名結(jié)果的操作;s獲取模塊,用于如果r=0或者r+k=n不成立,獲取s=((1+dA)-1(k-r*dA))mod n;其中,(1+dA)-1和dA均為預(yù)先存儲(chǔ)的數(shù)據(jù);dA為用戶A的私鑰;第二判斷模塊,用于判斷s是否等于0;第二繼續(xù)操作模塊,用于如果s等于0,繼續(xù)進(jìn)行上述生成簽名結(jié)果的操作;數(shù)字簽名結(jié)果確定模塊,用于如果s不等于0,確定數(shù)字簽名結(jié)果(r,s)。
本發(fā)明實(shí)施例帶來了以下有益效果:
本發(fā)明實(shí)施例提供的一種密鑰獲取方法,根據(jù)生成的偽密鑰進(jìn)行數(shù)字簽名和驗(yàn)簽,可以獲得數(shù)字簽名過程中生成的第一橢圓曲線點(diǎn)和驗(yàn)簽過程中生成的第二橢圓曲線點(diǎn);根據(jù)該第一橢圓曲線點(diǎn)和第二橢圓曲線點(diǎn)的差值,搜索密鑰與偽密鑰的目標(biāo)字節(jié)位置的字節(jié)差值,并設(shè)置密鑰的目標(biāo)字節(jié)位置的字節(jié)值的取值范圍;根據(jù)該取值范圍可以確定密鑰的目標(biāo)字節(jié)位置的字節(jié)值;當(dāng)獲取到密鑰的所有字節(jié)位置的字節(jié)值后,將所有字節(jié)位置的字節(jié)值確定為密鑰。上述方式大大降低了獲取密鑰的方式限制性,對(duì)于SM2橢圓曲線公鑰密碼算法的密鑰具有較好的普適性和可實(shí)施性;且當(dāng)上述密鑰獲取方法應(yīng)用于測(cè)試基于SM2橢圓曲線公鑰密碼算法的數(shù)字簽名算法的抗差分錯(cuò)誤分析的能力時(shí),可以有效地發(fā)現(xiàn)上述數(shù)字簽名算法的漏洞,進(jìn)而提高了上述數(shù)字簽名算法的安全性。
本發(fā)明實(shí)施例提供的一種數(shù)字簽名方法,將用戶A的私鑰dA與(1+dA)-1均預(yù)先存儲(chǔ),可以使用戶在進(jìn)行數(shù)字簽名中直接獲取dA與(1+dA)-1數(shù)據(jù),相較于現(xiàn)有技術(shù)中對(duì)(1+dA)-1進(jìn)行實(shí)時(shí)計(jì)算的方式,該方式可以防御在讀取dA時(shí)進(jìn)行密鑰的獲取操作,提高了數(shù)字簽名方法的安全性和可靠性。
本發(fā)明的其他特征和優(yōu)點(diǎn)將在隨后的說明書中闡述,并且,部分地從說明書中變得顯而易見,或者通過實(shí)施本發(fā)明而了解。本發(fā)明的目的和其他優(yōu)點(diǎn)在說明書、權(quán)利要求書以及附圖中所特別指出的結(jié)構(gòu)來實(shí)現(xiàn)和獲得。
為使本發(fā)明的上述目的、特征和優(yōu)點(diǎn)能更明顯易懂,下文特舉較佳實(shí)施例,并配合所附附圖,作詳細(xì)說明如下。
附圖說明
為了更清楚地說明本發(fā)明具體實(shí)施方式或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)具體實(shí)施方式或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見地,下面描述中的附圖是本發(fā)明的一些實(shí)施方式,對(duì)于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為本發(fā)明實(shí)施例提供的一種密鑰獲取方法的流程圖;
圖2為本發(fā)明實(shí)施例提供的一種數(shù)字簽名方法的流程圖;
圖3為本發(fā)明實(shí)施例提供的一種密鑰獲取裝置的結(jié)構(gòu)示意圖;
圖4為本發(fā)明實(shí)施例提供的一種數(shù)字簽名裝置的結(jié)構(gòu)示意圖。
具體實(shí)施方式
為使本發(fā)明實(shí)施例的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合附圖對(duì)本發(fā)明的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
考慮到現(xiàn)有技術(shù)中獲取密鑰的方式限制性較大的問題,本發(fā)明實(shí)施例提供了一種密鑰獲取方法、數(shù)字簽名方法和裝置,該技術(shù)可以用于測(cè)試在嵌入式系統(tǒng)或智能卡芯片內(nèi)實(shí)現(xiàn)的基于SM2橢圓曲線公鑰密碼算法的數(shù)字簽名算法的抗差分錯(cuò)誤分析的能力,該技術(shù)可以采用相關(guān)的軟件和硬件實(shí)現(xiàn),下面通過實(shí)施例進(jìn)行描述。
實(shí)施例一:
參見圖1所示的一種密鑰獲取方法的流程圖,該密鑰用于基于SM2橢圓曲線公鑰密碼算法的數(shù)字簽名算法中,該方法包括如下步驟:
步驟S102,設(shè)置密鑰的最高字節(jié)位置為目標(biāo)字節(jié)位置,進(jìn)行下述字節(jié)值獲取操作:
步驟S104,采用物理方式更改目標(biāo)字節(jié)位置的數(shù)據(jù),生成與密鑰字節(jié)長(zhǎng)度相同的偽密鑰;其中,該物理方式包括激光照射方式或電泳刺激方式;采用物理方式更改目標(biāo)字節(jié)位置的數(shù)據(jù)時(shí),該數(shù)據(jù)的變化是隨機(jī)的,也是未知的;由于基于SM2橢圓曲線公鑰密碼算法中使用的密鑰長(zhǎng)度是32個(gè)字節(jié),因此,隨機(jī)生成的為密鑰的字節(jié)長(zhǎng)度也為32個(gè)字節(jié);
步驟S106,根據(jù)上述偽密鑰進(jìn)行數(shù)字簽名,記錄數(shù)字簽名過程中生成的第一橢圓曲線點(diǎn)和簽名結(jié)果;
步驟S108,根據(jù)簽名結(jié)果進(jìn)行數(shù)字簽名的驗(yàn)簽,記錄驗(yàn)簽過程中生成的第二橢圓曲線點(diǎn);
步驟S110,根據(jù)第一橢圓曲線點(diǎn)和第二橢圓曲線點(diǎn)的差值,從預(yù)設(shè)的字節(jié)值范圍內(nèi)搜索密鑰與偽密鑰的目標(biāo)字節(jié)位置的字節(jié)差值;
在實(shí)際實(shí)現(xiàn)中,上述密鑰和生成的偽密鑰均未知;但是基于SM2橢圓曲線公鑰密碼算法的數(shù)字簽名和驗(yàn)簽過程中,指定了特定的橢圓曲線,該曲線的數(shù)學(xué)域和曲線的加法群參數(shù)都是確定的,因此,根據(jù)偽密鑰進(jìn)行數(shù)字簽名過程中生成的第一橢圓曲線點(diǎn)和驗(yàn)簽過程中生成的第二橢圓曲線點(diǎn)的差值,可以搜索出真實(shí)密鑰和偽密鑰的目標(biāo)字節(jié)位置的字節(jié)差值。
進(jìn)一步地,由于橢圓曲線基于離散對(duì)數(shù)難題,很難通過坐標(biāo)值解出系數(shù);因此可以采用正向搜索的方式,例如,00、01、02、…、FF。
步驟S112,根據(jù)字節(jié)差值,設(shè)置密鑰的目標(biāo)字節(jié)位置的字節(jié)值的取值范圍;
步驟S114,根據(jù)取值范圍確定密鑰的目標(biāo)字節(jié)位置的字節(jié)值;
上述密鑰和偽密鑰的目標(biāo)字節(jié)位置的字節(jié)值的范圍均為00-FF;對(duì)于某一確定的密鑰,沒生成一個(gè)偽密鑰即可獲得一個(gè)字節(jié)差值,該字節(jié)差值可以縮小密鑰的目標(biāo)字節(jié)位置的字節(jié)值的可能取值范圍,因此,當(dāng)多次生成偽隨機(jī)密鑰后,上述密鑰的目標(biāo)字節(jié)位置的字節(jié)值的可能取值范圍會(huì)逐步縮小,并無限逼近密鑰的目標(biāo)字節(jié)位置的字節(jié)值,且該字節(jié)值為十六進(jìn)制的正數(shù),進(jìn)而獲得密鑰的目標(biāo)字節(jié)位置的字節(jié)值。
步驟S116,設(shè)置目標(biāo)字節(jié)位置的下一個(gè)字節(jié)位置為新的目標(biāo)字節(jié)位置,繼續(xù)進(jìn)行上述字節(jié)值獲取操作,直至獲取到密鑰的所有字節(jié)位置的字節(jié)值,將所有字節(jié)位置的字節(jié)值確定為密鑰。
本發(fā)明實(shí)施例提供的一種密鑰獲取方法,根據(jù)生成的偽密鑰進(jìn)行數(shù)字簽名和驗(yàn)簽,可以獲得數(shù)字簽名過程中生成的第一橢圓曲線點(diǎn)和驗(yàn)簽過程中生成的第二橢圓曲線點(diǎn);根據(jù)該第一橢圓曲線點(diǎn)和第二橢圓曲線點(diǎn)的差值,搜索密鑰與偽密鑰的目標(biāo)字節(jié)位置的字節(jié)差值,并設(shè)置密鑰的目標(biāo)字節(jié)位置的字節(jié)值的取值范圍;根據(jù)該取值范圍可以確定密鑰的目標(biāo)字節(jié)位置的字節(jié)值;當(dāng)獲取到密鑰的所有字節(jié)位置的字節(jié)值后,將所有字節(jié)位置的字節(jié)值確定為密鑰。上述方式大大降低了獲取密鑰的方式限制性,對(duì)于SM2橢圓曲線公鑰密碼算法的密鑰具有較好的普適性和可實(shí)施性;且當(dāng)上述密鑰獲取方法應(yīng)用于測(cè)試基于SM2橢圓曲線公鑰密碼算法的數(shù)字簽名算法的抗差分錯(cuò)誤分析的能力時(shí),可以有效地發(fā)現(xiàn)上述數(shù)字簽名算法的漏洞,進(jìn)而提高了上述數(shù)字簽名算法的安全性。
考慮到上述字節(jié)差值可能為正數(shù)也可能為負(fù)數(shù),上述根據(jù)第一橢圓曲線點(diǎn)和第二橢圓曲線點(diǎn)的差值,從預(yù)設(shè)的字節(jié)值范圍內(nèi)搜索密鑰與偽密鑰的目標(biāo)字節(jié)位置的字節(jié)差值,具體可以以下述方式實(shí)現(xiàn),該方式中,字節(jié)差值從00開始搜索,直至FF,包括:
(1)設(shè)置字節(jié)差值的初始值d=00,進(jìn)行下述字節(jié)差值搜索操作:
(2)判斷字節(jié)差值d的[d*2248*r mod n]G的坐標(biāo)是否等于第一橢圓曲線點(diǎn)和第二橢圓曲線點(diǎn)的差值[k]G-(x1’,y1’);其中,(x1,y1)=[k]G為第一橢圓曲線點(diǎn);(x1’,y1’)為第二橢圓曲線點(diǎn);r=(e+x1)mod n;ZA為關(guān)于用戶A的可辨別標(biāo)識(shí)、部分橢圓曲線系統(tǒng)參數(shù)和用戶A公鑰的雜湊值;M為待簽名的消息;Hv()為消息摘要長(zhǎng)度為v比特的密碼雜湊函數(shù);e為密碼雜湊函數(shù)作用于消息M的輸出值;modn為模n運(yùn)算;n為基點(diǎn)G的階;
(3)如果否,更新d=d+1,繼續(xù)進(jìn)行上述字節(jié)差值搜索操作,直至d=FF;
(4)如果是,記錄字節(jié)差值。
上述根據(jù)第一橢圓曲線點(diǎn)和第二橢圓曲線點(diǎn)的差值,從預(yù)設(shè)的字節(jié)值范圍內(nèi)搜索密鑰與偽密鑰的目標(biāo)字節(jié)位置的字節(jié)差值,具體還可以以下述方式實(shí)現(xiàn),該方式中,字節(jié)差值從-01開始搜索,直至-FF,包括:
(1)設(shè)置字節(jié)差值的初始值d=-01,進(jìn)行下述字節(jié)差值搜索操作:
(2)判斷字節(jié)差值d的[d*2248*r mod n]G的坐標(biāo)是否等于第一橢圓曲線點(diǎn)和第二橢圓曲線點(diǎn)的差值[k]G-(x1’,y1’);其中,(x1,y1)=[k]G為第一橢圓曲線點(diǎn);(x1’,y1’)為第二橢圓曲線點(diǎn);r=(e+x1)mod n;ZA為關(guān)于用戶A的可辨別標(biāo)識(shí)、部分橢圓曲線系統(tǒng)參數(shù)和用戶A公鑰的雜湊值;M為待簽名的消息;Hv()為消息摘要長(zhǎng)度為v比特的密碼雜湊函數(shù);e為密碼雜湊函數(shù)作用于消息M的輸出值;modn為模n運(yùn)算;n為橢圓曲線基點(diǎn)G的階;(r,s)為發(fā)送的簽名;x||y為x與y的拼接;
(3)如果否,更新d=d-1,繼續(xù)進(jìn)行上述字節(jié)差值搜索操作,直至d=-FF;
(4)如果是,記錄字節(jié)差值。
上述搜索方式可以高效地獲得與第一橢圓曲線點(diǎn)和第二橢圓曲線點(diǎn)的差值相匹配的字節(jié)差。
在數(shù)字簽名的驗(yàn)簽過程中,上述第二橢圓曲線點(diǎn)(x1’,y1’)可以通過多種方式獲得,方式一為:(x1’,y1’)=[s’]G+[t]PA=[s’+t*dA]G=[s’+(s’+r)*dA]=[(1+dA)s’+r*dA]G=[k-r*dA’+r*dA]G;其中,PA=[dA]G;(r’,s’)為收到的簽名;t=(r’+s’)mod n;PA為用戶A的公鑰;dA為用戶A的私鑰;dA’為偽密鑰;k為隨機(jī)數(shù)發(fā)生器產(chǎn)生的隨機(jī)數(shù),且k∈[1,n-1];[k]G=(r-e)mod n;
方式二為:(x1’,y1’)=[s’+t*dA]G=[s’+(s’+r)*dA]=[(1+dA)s’+r*dA]G=[(1+dA)(1+dA’)-1(k-r*dA)+r*dA]G=[k+(dA-dA’)(k-r*dA)]G=[k]G+[(dA-dA’)k]G–[(dA-dA’)r]PA;其中,(r’,s’)為收到的簽名;t=(r’+s’)mod n;PA為用戶A的公鑰;dA為用戶A的私鑰;dA’為偽密鑰;k為隨機(jī)數(shù)發(fā)生器產(chǎn)生的隨機(jī)數(shù),且k∈[1,n-1];[k]G=(r-e)mod n。
具體地,上述方式一為將偽密鑰植入至數(shù)字簽名算法中的模乘過程中;上述方式二為將偽密鑰植入至數(shù)字簽名算法中的求逆過程中。
進(jìn)一步地,根據(jù)字節(jié)差值的正負(fù),上述根據(jù)字節(jié)差值,設(shè)置密鑰的目標(biāo)字節(jié)位置的字節(jié)值的取值范圍,可以通過下述方式實(shí)現(xiàn),方式一:設(shè)置密鑰的目標(biāo)字節(jié)位置的字節(jié)值d1=d+d2的取值范圍M=[d,FF];其中,d為字節(jié)差值,且d≥0;d2為偽密鑰的目標(biāo)字節(jié)位置的字節(jié)值;d2、d1和d為十六進(jìn)制的兩位數(shù),且0≤d2≤FF;
方式二:設(shè)置密鑰的目標(biāo)字節(jié)位置的字節(jié)值d1=d+d2的取值范圍M=[00,FF+d];其中,d為字節(jié)差值,且d≤0;d2為偽密鑰的目標(biāo)字節(jié)位置的字節(jié)值;d2、d1和d為十六進(jìn)制的兩位數(shù),且0≤d2≤FF。
進(jìn)一步地,上述根據(jù)取值范圍確定密鑰的目標(biāo)字節(jié)位置的字節(jié)值,包括如下步驟:(1)判斷取值范圍中最大值和最小值是否相同;(2)如果否,繼續(xù)進(jìn)行字節(jié)值獲取操作;(3)如果是,確定最大值和/或最小值為密鑰的目標(biāo)字節(jié)位置的字節(jié)值。
例如,當(dāng)d=-0x33時(shí),M1=[00,CC],可見,d1的取值范圍發(fā)生了縮??;再次隨機(jī)生成偽密碼,并獲得一個(gè)字節(jié)差值,例如,當(dāng)d=0x78時(shí),M2=[78,FF];再如,當(dāng)d=-0x87時(shí),M3=[-87,78];根據(jù)M2和M3的交集,即可確定密鑰的目標(biāo)字節(jié)位置的字節(jié)值d1。
上述方法可以高效準(zhǔn)確地獲取密鑰的字節(jié)值,進(jìn)而獲取完整的密鑰,且具有較強(qiáng)的可實(shí)施性。
實(shí)施例二:
參見圖2所示的一種數(shù)字簽名方法的流程圖,該方法可以防御通過上述實(shí)施例一中提供的密鑰獲取方法進(jìn)行密鑰獲取,該方法包括如下步驟:
步驟S202,將接收到的待簽名的消息M與預(yù)先存儲(chǔ)的ZA進(jìn)行拼接處理,獲得拼接處理結(jié)果其中,ZA為關(guān)于用戶A的可辨別標(biāo)識(shí)、部分橢圓曲線系統(tǒng)參數(shù)和用戶A公鑰的雜湊值;
進(jìn)行下述生成簽名結(jié)果的操作:
步驟S204,根據(jù)密碼雜湊函數(shù),對(duì)進(jìn)行處理,獲得密碼雜湊函數(shù)作用于消息M的輸出值其中,Hv()為消息摘要長(zhǎng)度為v比特的密碼雜湊函數(shù);
步驟S206,通過隨機(jī)數(shù)發(fā)生器獲取隨機(jī)數(shù)k;其中,k∈[1,n-1];n為n為橢圓曲線基點(diǎn)G的階;
步驟S208,獲取第一橢圓曲線點(diǎn)(x1,y1)=[k]G;
步驟S210,獲取r=(e+x1)mod n;
步驟S212,判斷r=0或者r+k=n是否成立;如果是,執(zhí)行步驟S204;如果否,執(zhí)行步驟S214;
步驟S214,獲取s=((1+dA)-1(k-r*dA))mod n;其中,(1+dA)-1和dA均為預(yù)先存儲(chǔ)的數(shù)據(jù);dA為用戶A的私鑰;
步驟S216,判斷s是否等于0;如果s等于0,執(zhí)行步驟S204;如果s不等于0,執(zhí)行步驟S218;
步驟S218,確定數(shù)字簽名結(jié)果(r,s)。
本發(fā)明實(shí)施例提供的一種數(shù)字簽名方法中,將用戶A的私鑰dA與(1+dA)-1均預(yù)先存儲(chǔ),可以使用戶在進(jìn)行數(shù)字簽名中直接獲取dA與(1+dA)-1數(shù)據(jù),相較于現(xiàn)有技術(shù)中對(duì)(1+dA)-1進(jìn)行實(shí)時(shí)計(jì)算的方式,該方式可以防御在讀取dA時(shí)進(jìn)行密鑰的獲取操作,提高了數(shù)字簽名方法的安全性和可靠性。
實(shí)施例三:
對(duì)應(yīng)于上述實(shí)施例一中提供的密鑰獲取方法和實(shí)施例二中提供的數(shù)字簽名方法,本發(fā)明實(shí)施例提供了一種SM2簽名算法過程的差分錯(cuò)誤注入測(cè)試方法及防御方法。
現(xiàn)有的嵌入式密碼設(shè)備,以智能卡和USB key為例,是基于硬件平臺(tái)和軟件編程實(shí)現(xiàn)的。隨著上世紀(jì)90年代提出的一些攻擊方法的提出,人們逐漸意識(shí)到,密碼算法的安全性不僅僅取決于數(shù)學(xué)安全性,同時(shí)這些支持密碼算法的設(shè)備的實(shí)現(xiàn)方式也會(huì)對(duì)密碼算法的安全性造成威脅。目前該領(lǐng)域有很多研究者已經(jīng)提出了各種各樣的側(cè)信道攻擊方法,這些方法可以使攻擊者很容易攻擊獲取密碼學(xué)算法的密鑰。這些常用的方法包括:時(shí)間攻擊、功耗分析、電磁輻射分析、聲音分析、探針分析、測(cè)試電路的重利用分析、緩存攻擊以及錯(cuò)誤注入攻擊、等分電磁分析方法。上述側(cè)信道攻擊方法目前最有效的攻擊方法包括功耗分析、錯(cuò)誤注入攻擊等。
上述錯(cuò)誤注入方式是自1997年Dan Boneh等提出了經(jīng)典的CRT-RSA算法攻擊方法。在1997年,li Biham和Adi Shamir(同時(shí)也是RSA算法的發(fā)明人之一)發(fā)表了針對(duì)對(duì)稱加密算法的錯(cuò)誤攻擊方法,并第一次提出并命名為差分錯(cuò)誤分析(Differential Fault Analysis,簡(jiǎn)稱DFA)的攻擊方法,沿用至今。2002年,對(duì)CRT-RSA算法的實(shí)際實(shí)驗(yàn)攻擊。英飛凌公司的C.Aumuller等人基于學(xué)者們提出的錯(cuò)誤攻擊模型,對(duì)CRT-RSA算法實(shí)際進(jìn)行了攻擊,并取得了成功。同年,P.Dusart等人對(duì)AES的錯(cuò)誤注入進(jìn)行了系統(tǒng)分析。他們認(rèn)為對(duì)于AES的攻擊不能簡(jiǎn)單借鑒對(duì)DES的攻擊思想,因?yàn)閮烧咴谶\(yùn)算結(jié)構(gòu)上存在不同。2008年的CHES會(huì)議上,學(xué)者David Vigilant提出了一種新的CRT-RSA算法實(shí)現(xiàn)方式。2010年,對(duì)于文獻(xiàn)提出的防護(hù)算法,Jean-S′ebastien Coron等人通過分析找出了理論上的漏洞。
而SM2算法是基于橢圓曲線算法實(shí)現(xiàn)的。目前,對(duì)于橢圓曲線算法的攻擊主要是從三個(gè)方面入手。一個(gè)是操作橢圓曲線群上的操作,使運(yùn)算發(fā)生在一個(gè)具有弱安全性的新的群上。這種攻擊方法可以通過檢查結(jié)果是否在橢圓曲線上的方式進(jìn)行防御。另外一種,Blomer等人假設(shè)中間值的符號(hào)可以被改變。這種攻擊方式,結(jié)果仍然是橢圓曲線的有效點(diǎn)。因此,上面提到的防御方法不再有效,需要更復(fù)雜的防御方法才能抵御這種攻擊。還有一種是safe-error方式,為了防御簡(jiǎn)單功耗分析,橢圓曲線算法通常使用總是加法和倍點(diǎn)的方式實(shí)現(xiàn),而有些加法是冗余的。攻擊者可以通過針對(duì)這些加法過程注入臨時(shí)性錯(cuò)誤,觀察是否有錯(cuò)誤結(jié)果產(chǎn)生,如果產(chǎn)生,證明該過程是有效的,而沒有錯(cuò)誤的話,證明該加法是冗余的,從而逐步確認(rèn)每個(gè)比特位的值。
針對(duì)目前SM2簽名算法的差分錯(cuò)誤注入測(cè)試大多具有不可實(shí)施性,本發(fā)明提出的針對(duì)SM2簽名算法的差分錯(cuò)誤注入的測(cè)試方法,使差分錯(cuò)誤注入測(cè)試具有可實(shí)施性,且該方法對(duì)目前的SM2簽名算法實(shí)現(xiàn)過程具有一定的普適性;同時(shí),針對(duì)上述差分錯(cuò)誤注入測(cè)試方法,提出了一種防御方法的建議,可以有效各種錯(cuò)誤注入的攻擊。
對(duì)了更加清楚地描述SM2簽名算法的差分錯(cuò)誤注入的測(cè)試方法和防御方法,首先對(duì)SM2簽名算法進(jìn)行介紹。SM2算法是基于橢圓曲線實(shí)現(xiàn)的。該算法指定了特定的橢圓曲線,曲線的數(shù)學(xué)域和曲線的加法群參數(shù)都是確定的。數(shù)字簽名算法的過程如下:
A1、置M=ZA||M;
A2、計(jì)算e=Hv(M)
A3、使用隨機(jī)數(shù)發(fā)生器產(chǎn)生隨機(jī)數(shù)k屬于[1,n-1]
A4、計(jì)算橢圓曲線點(diǎn)(x1,y1)=[k]G
A5、計(jì)算r=(e+x1)mod n,若r=0或者r+k=n則返回A3。
A6、計(jì)算s=((1+dA)-1(k-r*dA))mod n,若s=0則返回A3。
上述過程得到的(r,s)即為簽名結(jié)果。
數(shù)字簽名的驗(yàn)簽過程如下:
B1、檢驗(yàn)r’是否屬于[1,n-1],不成立則不通過;
B2、檢驗(yàn)s’是否屬于[1,n-1],不成立則不通過;
B3、值M’=ZA||M’;
B4、計(jì)算e=Hv(M’);
B5、計(jì)算t=(r’+s’)mod n,若t=0,則驗(yàn)證不通過。
B6、計(jì)算橢圓曲線點(diǎn)(x1’,y1’)=[s’]G+[t]PA
B7、計(jì)算R=(e+x1’)mod n,驗(yàn)證r’==R,若成立則通過,否則驗(yàn)證不通過。
上述提到的現(xiàn)有技術(shù)中幾種針對(duì)橢圓曲線密碼算法的錯(cuò)誤注入的方法,對(duì)SM2的簽名算法都不具有可實(shí)施性。這些方法都是針對(duì)數(shù)字簽名過程的A4步驟,同時(shí),要求A4步驟中使用的隨機(jī)數(shù)k固定并且可以多次重復(fù)使用。而從A3步驟得知,k是隨機(jī)數(shù),每次都是隨機(jī)產(chǎn)生,因此前面提到的錯(cuò)誤注入方式都不具有可實(shí)施性。
考慮到基于橢圓曲線的數(shù)字簽名算法的獨(dú)特性,Jorn-Marc Schmidt等人提出了針對(duì)橢圓曲線數(shù)字簽名算法的錯(cuò)誤注入方式。但是這種方法無法對(duì)SM2簽名算法實(shí)施,首先這種方式適合的算法流程和SM2算法的流程有差異,另外該作者提出的攻擊方法的假設(shè)要求比較苛刻,要求注入錯(cuò)誤使代碼流程發(fā)生改變,沒有可實(shí)施性。
綜上,本發(fā)明實(shí)施例提供了第一種SM2簽名算法過程的差分錯(cuò)誤注入測(cè)試方法,該方法針對(duì)SM2數(shù)字簽名算法的A6步驟;A6步驟中的(1+dA)-1可以作為常數(shù)存儲(chǔ),也可以通過dA計(jì)算出該值;然后計(jì)算r*dA的值(該實(shí)施例中的“*”表示為相乘)、計(jì)算(k-r*dA)mod n的值、最后計(jì)算兩個(gè)大數(shù)的模乘(1+dA)-1(k-r*dA)。該測(cè)試方案是在計(jì)算r*dA時(shí)進(jìn)行錯(cuò)誤注入。
SM2使用的dA長(zhǎng)度是32個(gè)字節(jié),記為d31d30…d1d0,其中d31是dA的最高字節(jié),而d0是dA的最低字節(jié);在智能卡或者嵌入式系統(tǒng)中,dA是以字節(jié)形式存儲(chǔ)在FLASH或者EEPROM中;在計(jì)算時(shí),系統(tǒng)從Flash或者EEPROM中讀取dA,假設(shè)在測(cè)試過程中對(duì)d31字節(jié)進(jìn)行了錯(cuò)誤注入;這時(shí),r*dA的結(jié)果記為r*dA’,而(dA-dA’)=(d31’,0…,0,0),其中d31’是與dA和dA’的首字節(jié)差值;需要注意的是,由于dA和dA’的大小關(guān)系沒有確定,d31’可以帶有符號(hào);將dA’代入A6步驟運(yùn)算,得到了s’。
然后,將上述簽名結(jié)果(r,s’)代入驗(yàn)簽過程,得到:(x1’,y1’)=[s’]G+[t]PA,而PA=[dA]G;代入公式有:(x1’,y1’)=[s’+t*dA]G=[s’+(s’+r)*dA]=[(1+dA)s’+r*dA]G=[k-r*dA’+r*dA]G;已知[k]G的x坐標(biāo)為(r-e)mod n;因此可以計(jì)算[k]G與(x1’,y1’)的差,即:[k]G–(x1’,y1’)=[r*dA’–r*dA]G=[r*(d31’,0…,0,0)]G。
由于橢圓曲線基于離散對(duì)數(shù)問題,很難通過坐標(biāo)值解出系數(shù)。因此采用正向搜索的方式,這時(shí)需要分兩種情況來分析:一是d31’為正,二是d31’為負(fù);當(dāng)d31’為正時(shí),直接采用該值,而d31’為負(fù)時(shí),需要使用n-(|d31’|,0…,0,0)代替(d31’,0…,0,0)即可,其中|d31’|為絕對(duì)值,n是橢圓曲線的階,為固定常數(shù)。
搜索時(shí),私鑰d首字節(jié)從0x00-0xFF,其它字節(jié)補(bǔ)充為0,計(jì)算該值與r乘積的倍點(diǎn)(其中0x表示十六進(jìn)制);然后計(jì)算n與d的差值,計(jì)算該值與r乘積的倍點(diǎn),觀察所有的256*2個(gè)數(shù)據(jù)中哪個(gè)與得到[k]G–(x1’,y1’)相等,即可獲取當(dāng)前錯(cuò)誤值。
假設(shè)錯(cuò)誤的模型是完全隨機(jī)的,即對(duì)單字節(jié)來講無論d31為何值,d31’可以是0x00-0xFF的任意值;根據(jù)前面分析可以得知,對(duì)固定值d31,(dA’-dA)的值只可能是00,01…,d31,n-1,n-2…,n+0xFF-d31。因此,在錯(cuò)誤發(fā)生次數(shù)足夠多的情況下,利用差值可以逼近出首字節(jié)的值。
上述測(cè)試過程舉例如下:
SM2算法的階n=0xFFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF 7203DF6B 21C6052B 53BBF409 39D54123;
設(shè)dA=0x787968B4FA32C3FD 2417842E 73BBFEFF 2F3C848B 6831D7E0 EC65228B 3937E498;
對(duì)dA的最高字節(jié)進(jìn)行錯(cuò)誤注入,d31被改寫為AB,即
dA’=0xAB7968B4 FA32C3FD 2417842E 73BBFEFF 2F3C848B 6831D7E0 EC65228B 3937E498;
則d31’=-0x33。
為了搜索出d31的密鑰值,首先通過計(jì)算[0x 00*2248*r mod n]G的坐標(biāo)是否等于[k]G–(x1’,y1’)。然后計(jì)算[0x 01*2248*r mod n]G的坐標(biāo)是否等于[k]G–(x1’,y1’),依次計(jì)算到:[0xFF*2248*r mod n]G的坐標(biāo)是否等于[k]G–(x1’,y1’)??紤]到d31’可能是負(fù)數(shù),同樣,搜索:[(n-0x 00*2248)*r mod n]G的坐標(biāo)是否等于[k]G–(x1’,y1’);然后計(jì)算[(n-0x 01*2248)*r mod n]G的坐標(biāo)是否等于[k]G–(x1’,y1’);最后到:[(n-0x FF*2248)*r mod n]G的坐標(biāo)是否等于[k]G–(x1’,y1’)。
依次搜索,這256*2數(shù)據(jù)中,會(huì)發(fā)現(xiàn)[(n-0x 33*2248)*r mod n]G的倍點(diǎn)坐標(biāo)是否等于[k]G–(x1’,y1’)。因此,推導(dǎo)得到則d31’=-0x33。考慮到該值,d31的值應(yīng)該小于0xCC,因?yàn)楫?dāng)d31大于0xCC時(shí)任何錯(cuò)誤值都不能使d31’=-0x33。
再次注入錯(cuò)誤,如果發(fā)生了錯(cuò)誤,同樣判斷d31’的值,并且有d31’值縮小d31字節(jié)的范圍。如果錯(cuò)誤出現(xiàn)了d31’=0x78和d31’=-0x87時(shí),即可確定d31字節(jié)的值為0x78。
其它字節(jié)的分析方法與首字節(jié)相同,對(duì)所有字節(jié)依次采用這種方法,即可獲取基于SM2簽名算法的密鑰。
該方法具有很強(qiáng)的可實(shí)施性。首先,該方案沒有對(duì)簽名過程計(jì)算橢圓曲線多倍點(diǎn)過程進(jìn)行錯(cuò)誤注入,而是對(duì)私鑰運(yùn)算過程進(jìn)行錯(cuò)誤注入,多倍點(diǎn)系數(shù)為隨機(jī)數(shù),而私鑰為固定值,因此對(duì)私鑰的錯(cuò)誤注入更具實(shí)施性;其次,該方案采用的錯(cuò)誤模型也具有很強(qiáng)的操作性。由于在智能卡中數(shù)據(jù)拷貝及運(yùn)算過程中都是以字節(jié)或字為單位,因此在錯(cuò)誤注入時(shí)該單元出錯(cuò)的可能性比較高,并且該方案只需要確認(rèn)字節(jié)的位置即可,錯(cuò)誤注入難度不大。因此該算法的可實(shí)施性很強(qiáng)。同時(shí),該字節(jié)模型也可以擴(kuò)展到字模型,對(duì)于字模型搜索空間增加,但依然具有很強(qiáng)的可操作性。
本發(fā)明實(shí)施例提供了第二種SM2簽名算法過程的差分錯(cuò)誤注入測(cè)試方法,該方法針對(duì)SM2數(shù)字簽名算法的A6步驟假設(shè)在計(jì)算簽名s的過程中,先要計(jì)算1+dA的值,在該過程中對(duì)dA進(jìn)行了錯(cuò)誤注入;錯(cuò)誤的dA用dA’表示,將dA’代入驗(yàn)簽過程,有:(x1’,y1’)=[s’+t*dA]G=[s’+(s’+r)*dA]=[(1+dA)s’+r*dA]G=[(1+dA)(1+dA’)-1(k-r*dA)+r*dA]G=[k+(dA-dA’)(k-r*dA)]G=[k]G+[(dA-dA’)k]G–[(dA-dA’)r]PA;其中,PA是公鑰,[k]G等于(r-e)mod n。與第一種SM2簽名算法過程的差分錯(cuò)誤注入測(cè)試方法分析類似,利用數(shù)據(jù)字節(jié)的正負(fù)特性,可以得到每個(gè)字節(jié)的密鑰值,進(jìn)而可以得到了整個(gè)密鑰的值。
本發(fā)明實(shí)施例還提供了一種SM2簽名算法過程的差分錯(cuò)誤注入測(cè)試方法的防御方法;為了防御側(cè)信道功耗分析技術(shù),一些設(shè)計(jì)對(duì)r*dA mod n進(jìn)行掩碼設(shè)計(jì)。如r*dA=x*r*dA*x-1這種方式,而x是隨機(jī)數(shù);但是,通過前面的分析可以得知,這種防御方法無法防御本文所述的對(duì)dA的攻擊。因此,只有在運(yùn)算中不直接操作dA,才能防御對(duì)dA的錯(cuò)誤注入。同樣,只針對(duì)(1+dA)-1進(jìn)行了掩碼也無法抵御本文的檢測(cè)方式,因?yàn)榇嬖趯?duì)dA的直接操作。
上述檢測(cè)方式主要是在使用dA時(shí)直接注入了錯(cuò)誤。為了防御這種檢測(cè)攻擊方法,需要在簽名運(yùn)算中不要直接操作dA。比如s=((1+dA)-1(k-r*dA))mod n=((1+dA)-1k-(1+dA)-1*r*dA))mod n=((1+dA)-1(k+r)–r)mod n.這里(1+dA)-1需要作為與密鑰的一部分預(yù)計(jì)算存儲(chǔ)在芯片中。如果利用這種流程,將不存在直接使用dA的場(chǎng)景。這樣就可以防止本文所采用的檢測(cè)攻擊手段。
通過上述防御方法,即可實(shí)現(xiàn)對(duì)上述檢測(cè)手段的防御;且考慮到這種實(shí)現(xiàn)方式?jīng)]有明顯增加算法實(shí)現(xiàn)的時(shí)間復(fù)雜度和空間復(fù)雜度,因此該防御方法具有可操作性和易實(shí)施性。
本發(fā)明實(shí)施例可以實(shí)現(xiàn)對(duì)SM2簽名算法的抵抗錯(cuò)誤注入防御方法的檢測(cè),通過該方法可以有效發(fā)現(xiàn)SM2簽名算法實(shí)現(xiàn)過程的漏洞。同時(shí),本發(fā)明指出一系列實(shí)現(xiàn)方案的漏洞,并在其基礎(chǔ)上給了防御錯(cuò)誤注入方案的有效措施,保證了基于SM2簽名算法的安全性。
實(shí)施例四:
參見圖3所示的一種密鑰獲取裝置的結(jié)構(gòu)示意圖,該密鑰用于基于SM2橢圓曲線公鑰密碼算法的數(shù)字簽名算法中,該裝置包括如下部分:
目標(biāo)字節(jié)位置設(shè)置模塊302,用于設(shè)置密鑰的最高字節(jié)位置為目標(biāo)字節(jié)位置,進(jìn)行下述字節(jié)值獲取操作:
偽密鑰生成模塊304,用于采用物理方式更改目標(biāo)字節(jié)位置的數(shù)據(jù),生成與密鑰字節(jié)長(zhǎng)度相同的偽密鑰;其中,該物理方式包括激光照射方式或電泳刺激方式;
數(shù)字簽名模塊306,用于根據(jù)偽密鑰進(jìn)行數(shù)字簽名,記錄數(shù)字簽名過程中生成的第一橢圓曲線點(diǎn)和簽名結(jié)果;
驗(yàn)簽?zāi)K308,用于根據(jù)簽名結(jié)果進(jìn)行數(shù)字簽名的驗(yàn)簽,記錄驗(yàn)簽過程中生成的第二橢圓曲線點(diǎn);
字節(jié)差值搜索模塊310,用于根據(jù)第一橢圓曲線點(diǎn)和第二橢圓曲線點(diǎn)的差值,從預(yù)設(shè)的字節(jié)值范圍內(nèi)搜索密鑰與偽密鑰的目標(biāo)字節(jié)位置的字節(jié)差值;
取值范圍設(shè)置模塊312,用于根據(jù)字節(jié)差值,設(shè)置密鑰的目標(biāo)字節(jié)位置的字節(jié)值的取值范圍;
字節(jié)值確定模塊314,用于根據(jù)取值范圍確定密鑰的目標(biāo)字節(jié)位置的字節(jié)值;
密鑰確定模塊316,用于設(shè)置目標(biāo)字節(jié)位置的下一個(gè)字節(jié)位置為新的目標(biāo)字節(jié)位置,繼續(xù)進(jìn)行上述字節(jié)值獲取操作,直至獲取到密鑰的所有字節(jié)位置的字節(jié)值,將所有字節(jié)位置的字節(jié)值確定為密鑰。
本發(fā)明實(shí)施例提供的一種密鑰獲取裝置,根據(jù)生成的偽密鑰進(jìn)行數(shù)字簽名和驗(yàn)簽,可以獲得數(shù)字簽名過程中生成的第一橢圓曲線點(diǎn)和驗(yàn)簽過程中生成的第二橢圓曲線點(diǎn);根據(jù)該第一橢圓曲線點(diǎn)和第二橢圓曲線點(diǎn)的差值,搜索密鑰與偽密鑰的目標(biāo)字節(jié)位置的字節(jié)差值,并設(shè)置密鑰的目標(biāo)字節(jié)位置的字節(jié)值的取值范圍;根據(jù)該取值范圍可以確定密鑰的目標(biāo)字節(jié)位置的字節(jié)值;當(dāng)獲取到密鑰的所有字節(jié)位置的字節(jié)值后,將所有字節(jié)位置的字節(jié)值確定為密鑰。上述方式大大降低了獲取密鑰的方式限制性,對(duì)于SM2橢圓曲線公鑰密碼算法的密鑰具有較好的普適性和可實(shí)施性;且當(dāng)上述密鑰獲取方法應(yīng)用于測(cè)試基于SM2橢圓曲線公鑰密碼算法的數(shù)字簽名算法的抗差分錯(cuò)誤分析的能力時(shí),可以有效地發(fā)現(xiàn)上述數(shù)字簽名算法的漏洞,進(jìn)而提高了上述數(shù)字簽名算法的安全性。
考慮到上述字節(jié)差值可能為正數(shù)也可能為負(fù)數(shù),上述字節(jié)差值搜索模塊包括:(1)第一初始值設(shè)置單元,用于設(shè)置字節(jié)差值的初始值d=00,進(jìn)行下述字節(jié)差值搜索操作:(2)第一判斷單元,用于判斷字節(jié)差值d的[d*2248*r mod n]G的坐標(biāo)是否等于第一橢圓曲線點(diǎn)和第二橢圓曲線點(diǎn)的差值[k]G-(x1’,y1’);其中,(x1,y1)=[k]G為第一橢圓曲線點(diǎn);(x1’,y1’)為第二橢圓曲線點(diǎn);r=(e+x1)mod n;ZA為關(guān)于用戶A的可辨別標(biāo)識(shí)、部分橢圓曲線系統(tǒng)參數(shù)和用戶A公鑰的雜湊值;M為待簽名的消息;Hv()為消息摘要長(zhǎng)度為v比特的密碼雜湊函數(shù);e為密碼雜湊函數(shù)作用于消息M的輸出值;modn為模n運(yùn)算;n為基點(diǎn)G的階;(3)第一更新單元,用于如果字節(jié)差值d的[d*2248*r mod n]G的坐標(biāo)不等于第一橢圓曲線點(diǎn)和第二橢圓曲線點(diǎn)的差值[k]G-(x1’,y1’),更新d=d+1,繼續(xù)進(jìn)行上述字節(jié)差值搜索操作,直至d=FF;(4)第一記錄單元,用于如果字節(jié)差值d的[d*2248*r mod n]G的坐標(biāo)等于第一橢圓曲線點(diǎn)和第二橢圓曲線點(diǎn)的差值[k]G-(x1’,y1’),記錄字節(jié)差值;
上述字節(jié)差值搜索模塊還包括:(1)第二初始值設(shè)置單元,用于設(shè)置字節(jié)差值的初始值d=-01,進(jìn)行下述字節(jié)差值搜索操作:(2)第二判斷單元,用于判斷字節(jié)差值d的[d*2248*r mod n]G的坐標(biāo)是否等于第一橢圓曲線點(diǎn)和第二橢圓曲線點(diǎn)的差值[k]G-(x1’,y1’);其中,(x1,y1)=[k]G為第一橢圓曲線點(diǎn);(x1’,y1’)為第二橢圓曲線點(diǎn);r=(e+x1)mod n;ZA為關(guān)于用戶A的可辨別標(biāo)識(shí)、部分橢圓曲線系統(tǒng)參數(shù)和用戶A公鑰的雜湊值;M為待簽名的消息;Hv()為消息摘要長(zhǎng)度為v比特的密碼雜湊函數(shù);e為密碼雜湊函數(shù)作用于消息M的輸出值;modn為模n運(yùn)算;n為橢圓曲線基點(diǎn)G的階;(r,s)為發(fā)送的簽名;x||y為x與y的拼接;(3)第二更新單元,用于如果字節(jié)差值d的[d*2248*r mod n]G的坐標(biāo)不等于第一橢圓曲線點(diǎn)和第二橢圓曲線點(diǎn)的差值[k]G-(x1’,y1’),更新d=d-1,繼續(xù)進(jìn)行上述字節(jié)差值搜索操作,直至d=-FF;(4)第二記錄單元,用于如果字節(jié)差值d的[d*2248*r mod n]G的坐標(biāo)等于第一橢圓曲線點(diǎn)和第二橢圓曲線點(diǎn)的差值[k]G-(x1’,y1’),記錄字節(jié)差值。
上述搜索方式可以高效地獲得與第一橢圓曲線點(diǎn)和第二橢圓曲線點(diǎn)的差值相匹配的字節(jié)差。
進(jìn)一步地,上述字節(jié)值確定模塊包括:(1)第三判斷單元,用于判斷取值范圍中最大值和最小值是否相同;(2)繼續(xù)操作單元,用于如果取值范圍中最大值和最小值不相同,繼續(xù)進(jìn)行字節(jié)值獲取操作;(3)字節(jié)值確定單元,用于如果取值范圍中最大值和最小值相同,確定最大值和/或最小值為密鑰的目標(biāo)字節(jié)位置的字節(jié)值。上述方法可以高效準(zhǔn)確地獲取密鑰的字節(jié)值,進(jìn)而獲取完整的密鑰,且具有較強(qiáng)的可實(shí)施性。
實(shí)施例五:
參見圖4所示的一種數(shù)字簽名裝置的結(jié)構(gòu)示意圖,該裝置包括如下部分:
拼接處理模塊402,用于將接收到的待簽名的消息M與預(yù)先存儲(chǔ)的ZA進(jìn)行拼接處理,獲得拼接處理結(jié)果其中,ZA為關(guān)于用戶A的可辨別標(biāo)識(shí)、部分橢圓曲線系統(tǒng)參數(shù)和用戶A公鑰的雜湊值;
進(jìn)行下述生成簽名結(jié)果的操作:
處理模塊404,用于根據(jù)密碼雜湊函數(shù),對(duì)進(jìn)行處理,獲得密碼雜湊函數(shù)作用于消息M的輸出值其中,Hv()為消息摘要長(zhǎng)度為v比特的密碼雜湊函數(shù);
隨機(jī)數(shù)獲取模塊406,用于通過隨機(jī)數(shù)發(fā)生器獲取隨機(jī)數(shù)k;其中,k∈[1,n-1];n為n為橢圓曲線基點(diǎn)G的階;
第一橢圓曲線點(diǎn)獲取模塊408,用于獲取第一橢圓曲線點(diǎn)(x1,y1)=[k]G;
r獲取模塊410,用于獲取r=(e+x1)mod n;
第一判斷模塊412,用于判斷r=0或者r+k=n是否成立;如果是,繼續(xù)進(jìn)行上述生成簽名結(jié)果的操作;
s獲取模塊414,用于如果r=0或者r+k=n不成立,獲取s=((1+dA)-1(k-r*dA))mod n;其中,(1+dA)-1和dA均為預(yù)先存儲(chǔ)的數(shù)據(jù);dA為用戶A的私鑰;
第二判斷模塊416,用于判斷s是否等于0;如果s等于0,繼續(xù)進(jìn)行上述生成簽名結(jié)果的操作;
數(shù)字簽名結(jié)果確定模塊418,用于如果s不等于0,確定數(shù)字簽名結(jié)果(r,s)。
本發(fā)明實(shí)施例提供的一種數(shù)字簽名裝置中,將用戶A的私鑰dA與(1+dA)-1均預(yù)先存儲(chǔ),可以使用戶在進(jìn)行數(shù)字簽名中直接獲取dA與(1+dA)-1數(shù)據(jù),相較于現(xiàn)有技術(shù)中對(duì)(1+dA)-1進(jìn)行實(shí)時(shí)計(jì)算的方式,該方式可以防御在讀取dA時(shí)進(jìn)行密鑰的獲取操作,提高了數(shù)字簽名方法的安全性和可靠性。
本發(fā)明提出了兩種有效的檢測(cè)方法檢測(cè)SM2簽名算法的抗錯(cuò)誤注入防御方法的有效性,這兩種方案都具有方便可操作性,相比以前的檢測(cè)方案都有明顯的提高。本發(fā)明提出了防御兩種檢測(cè)方法的有效方案,并且該方案具有很低成本和方便實(shí)現(xiàn)的特征,不影響SM2簽名算法的實(shí)現(xiàn)效率。
本發(fā)明實(shí)施例所提供的密鑰獲取方法、數(shù)字簽名方法和裝置的計(jì)算機(jī)程序產(chǎn)品,包括存儲(chǔ)了程序代碼的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),所述程序代碼包括的指令可用于執(zhí)行前面方法實(shí)施例中所述的方法,具體實(shí)現(xiàn)可參見方法實(shí)施例,在此不再贅述。
所述功能如果以軟件功能單元的形式實(shí)現(xiàn)并作為獨(dú)立的產(chǎn)品銷售或使用時(shí),可以存儲(chǔ)在一個(gè)計(jì)算機(jī)可讀取存儲(chǔ)介質(zhì)中。基于這樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說對(duì)現(xiàn)有技術(shù)做出貢獻(xiàn)的部分或者該技術(shù)方案的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計(jì)算機(jī)軟件產(chǎn)品存儲(chǔ)在一個(gè)存儲(chǔ)介質(zhì)中,包括若干指令用以使得一臺(tái)計(jì)算機(jī)設(shè)備(可以是個(gè)人計(jì)算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個(gè)實(shí)施例所述方法的全部或部分步驟。而前述的存儲(chǔ)介質(zhì)包括:U盤、移動(dòng)硬盤、只讀存儲(chǔ)器(ROM,Read-Only Memory)、隨機(jī)存取存儲(chǔ)器(RAM,Random Access Memory)、磁碟或者光盤等各種可以存儲(chǔ)程序代碼的介質(zhì)。
最后應(yīng)說明的是:以上所述實(shí)施例,僅為本發(fā)明的具體實(shí)施方式,用以說明本發(fā)明的技術(shù)方案,而非對(duì)其限制,本發(fā)明的保護(hù)范圍并不局限于此,盡管參照前述實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)的說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解:任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),其依然可以對(duì)前述實(shí)施例所記載的技術(shù)方案進(jìn)行修改或可輕易想到變化,或者對(duì)其中部分技術(shù)特征進(jìn)行等同替換;而這些修改、變化或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明實(shí)施例技術(shù)方案的精神和范圍,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。因此,本發(fā)明的保護(hù)范圍應(yīng)所述以權(quán)利要求的保護(hù)范圍為準(zhǔn)。