PBOC3.0 SM2 算法各种证书、数字签名的验证

来源:互联网 发布:java int除法向上取整 编辑:程序博客网 时间:2024/05/20 23:55

1、关于SM2

    SM2算法是一种非对称算法,与国际算法里中的RSA相对应。

    SM2推荐的曲线参数如下:

    

    在验证PBOC卡片中的发卡行公钥证书、IC卡公钥证书、签名的静态应用数据、签名的动态数据之前,先来了解一下PBOC规范中对数字签名的验证过程,如下图:


   (该图参考PBOC第17部分)

    此处的a,b,xG,yG即SM2推荐曲线参数中的a,b,Gx,Gy ;而xA,yA分别为公钥的左半部分和右半部分。可以看出,ENTLA、IDA,a,b,xG,yG都是固定值,而xA,yA则因为公钥的不同而变化。


2、借贷记交易流程,准备阶段

    先按借贷记交易流程,发GPO指令,获取AFL,然后读取相关的记录

PDOL=9F66049F02069F03069F1A0295055F2A029A039C019F3704DF6001DF6901[GPO]SendAPDU=80A800002583235600000000000001000000000000000001560000000000015615121160010203040001ReValue=80167C000801020010080A01100707001801010018040600AFL=0801020010080A011007070018010100180406000101=70155713623061571010011182D221122070956101322F0102=704C9F6128202000000000000000000000000000000000000000000000000000000000000000000000000000009F6201005F201A00000000000000000000000000000000000000000000000000000208=7081875F24032211015F25031507245A096230615710100111829F0702FF008E0E000000000000000042031E031F009F0D05D8609CA8009F0E0500100000009F0F05D8689CF8005F280201569F080200308C1B9F02069F03069F1A0295055F2A029A039C019F37049F21039F4E148D1A8A029F02069F03069F1A0295055F2A029A039C019F37049F21030209=704993431362307154E77EB80F6F446B2D2B232DA33879940012B4AE59B6B01B7974549443F2A1631BE870B1D17E36DB4B0102BAECA504863E2EDCF96251BFA2EB8370F710A41D9F4A0182020A=70819C9F46819414623061571010011182FF12300001FC04001140E841B537350C40A54F0DA3A108D1168FCFB9C3AE354D29F6323D50F067F1CCCD5316F8F8E0D777B8AEAFAE8D4098DBF59B640362F659B83DA82D3D7EE0ED815CF4C2638164896895A5B8A662939A920FEAEFEB0A96D2337A3507F5311293C7E683A83DC15D89ED99C0250D7927A8DBD54265A24FB4DDC4A4B28CE5B8C59DE6EF9F4701030207=70045F3401010301=70105F300202209F420201569F49039F37040304=70089F1401009F2301000305=70819190818E12623061FF1230000451040011409B7EE1D2AE302EEEED9B97544A73BEF87A4D0A7B24749A4F065F7FBC5E3A16EF8CA7676DFC7C45D8FFAAC38D13340C70B0FEECEDA7AC8E896DE1A7D1A479B345114EC47C751CC851B36647E9940D9EF725FA0DDC875B3FC466918E5E498162FF981654AC77431C488CD96F129B3412452656A945B78A1C9D5A880EB9278DFE3D0306=701A8F01189F3201039F631030343233333331300000000000000000

Tag8F=18PK_CA=37710FEB7CC3617767874E85509C268E8F931D68773E93A89F39A4247DFE2D280FC5BC838353885B6DAD447C8F90116BD9D314047591989F67F319544D42A48B

说明:

PK_CA=CA公钥

PK_Issuer=发卡行公钥

PK_IC=IC卡公钥


3、验证发卡行公钥证书Tag90

    发卡行公钥证书的格式如下:

    

    (该图参考PBOC第17部分)

    根据“表4”的格式,可以从发卡行公钥证书中得到发卡行公钥、数字签名r||s。


Tag90=12623061FF1230000451040011409B7EE1D2AE302EEEED9B97544A73BEF87A4D0A7B24749A4F065F7FBC5E3A16EF8CA7676DFC7C45D8FFAAC38D13340C70B0FEECEDA7AC8E896DE1A7D1A479B345114EC47C751CC851B36647E9940D9EF725FA0DDC875B3FC466918E5E498162FF981654AC77431C488CD96F129B3412452656A945B78A1C9D5A880EB9278DFE3DPK_Issuer=9B7EE1D2AE302EEEED9B97544A73BEF87A4D0A7B24749A4F065F7FBC5E3A16EF8CA7676DFC7C45D8FFAAC38D13340C70B0FEECEDA7AC8E896DE1A7D1A479B345r||s=114EC47C751CC851B36647E9940D9EF725FA0DDC875B3FC466918E5E498162FF981654AC77431C488CD96F129B3412452656A945B78A1C9D5A880EB9278DFE3D


(该图参考PBOC第17部分)

根据“表1”可知,发卡行公钥证书中的签名是由CA私钥签名的,所以应该用CA公钥解签。

现在我们来根据公式h = SM3 [ZA||MSG]计算哈希值,根据签名的验证过程: 

ZA = SM3 [ENTLA+IDA+a+b+xG+yG+xCA+yCA];

ENTLA=0080

IDA=31323334353637383132333435363738

a=FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC

b=28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93

xG=32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7

yG=BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0

xCA=37710FEB7CC3617767874E85509C268E8F931D68773E93A89F39A4247DFE2D28

yCA=0FC5BC838353885B6DAD447C8F90116BD9D314047591989F67F319544D42A48B


ZA=SM3[ENTLA+IDA+a+b+xG+yG+xCA+yCA]  =SM3[008031323334353637383132333435363738FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E9332C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A037710FEB7CC3617767874E85509C268E8F931D68773E93A89F39A4247DFE2D280FC5BC838353885B6DAD447C8F90116BD9D314047591989F67F319544D42A48B]  =320A0ADACC0A5FBC783FEBE18DA52138B82FB66ECA74ED5A556F53600390B5D7

根据“表1”,可以得到待签名的数据,也就是MSG。

MSG=12623061FF1230000451040011409B7EE1D2AE302EEEED9B97544A73BEF87A4D0A7B24749A4F065F7FBC5E3A16EF8CA7676DFC7C45D8FFAAC38D13340C70B0FEECEDA7AC8E896DE1A7D1A479B345

MSG=12623061FF1230000451040011409B7EE1D2AE302EEEED9B97544A73BEF87A4D0A7B24749A4F065F7FBC5E3A16EF8CA7676DFC7C45D8FFAAC38D13340C70B0FEECEDA7AC8E896DE1A7D1A479B345

h = SM3 [ZA||MSG];

h=7E4EA4C8CE6CC2AC98C32CB55F1AEF8ECC6797C0FE3336D59D33E6CAAEBC39DC

S= r || s

现在,PK_CA、h、S都是已知的,就可以用函数Verify (PK_CA) [ h,S ]来验证签名是否正确了。

(结果是签名验证成功)


4、验证签名的静态应用数据Tag93

    签名的静态应用数据(Tag93)格式如下:

    

    根据上面第2步读取的记录内容,可以得到Tag93的值。

Tag93=1362307154E77EB80F6F446B2D2B232DA33879940012B4AE59B6B01B7974549443F2A1631BE870B1D17E36DB4B0102BAECA504863E2EDCF96251BFA2EB8370F710A41D

    根据“表5”的格式,获取数字签名r||s。

r||s=7154E77EB80F6F446B2D2B232DA33879940012B4AE59B6B01B7974549443F2A1631BE870B1D17E36DB4B0102BAECA504863E2EDCF96251BFA2EB8370F710A41D

    根据上面第3步,可以得到 发卡行公钥。

PK_Issuer=9B7EE1D2AE302EEEED9B97544A73BEF87A4D0A7B24749A4F065F7FBC5E3A16EF8CA7676DFC7C45D8FFAAC38D13340C70B0FEECEDA7AC8E896DE1A7D1A479B345



根据“表2”可知,静态应用数据是由发卡行私钥签名的,所以要用发卡行公钥来解签。

现在我们来根据公式h = SM3 [ZA||MSG]计算哈希值,根据签名的验证过程:

ZA = SM3 [ENTLA+IDA+a+b+xG+yG+xPK_Issuer+yPK_Issuer];

ENTLA=0080

IDA=31323334353637383132333435363738

a=FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC

b=28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93

xG=32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7

yG=BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0

xPK_Issuer=9B7EE1D2AE302EEEED9B97544A73BEF87A4D0A7B24749A4F065F7FBC5E3A16EF

yPK_Issuer=8CA7676DFC7C45D8FFAAC38D13340C70B0FEECEDA7AC8E896DE1A7D1A479B345

ZA=SM3 [ENTLA+IDA+a+b+xG+yG+xPK_Issuer+yPK_Issuer]  =SM3[008031323334353637383132333435363738FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E9332C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A09B7EE1D2AE302EEEED9B97544A73BEF87A4D0A7B24749A4F065F7FBC5E3A16EF8CA7676DFC7C45D8FFAAC38D13340C70B0FEECEDA7AC8E896DE1A7D1A479B345]  =7A96CBFCAEF87D8CDF4C5CC58A2F394154028B9067B563034D14A4DF7A67A6D8

    “表2”中“需认证的静态数据”包括记录0208的内容(除去Tag70和Len)和AIP。

    根据“表2”,可以得到待签名的数据,也就是MSG。

MSG= 1362305F24032211015F25031507245A096230615710100111829F0702FF008E0E000000000000000042031E031F009F0D05D8609CA8009F0E0500100000009F0F05D8689CF8005F280201569F080200308C1B9F02069F03069F1A0295055F2A029A039C019F37049F21039F4E148D1A8A029F02069F03069F1A0295055F2A029A039C019F37049F21037C00


h = SM3 [ZA||MSG];

h= AFB08413485539F74EE7D6C9F5D3199C86185F6579DECA94B65A389FFDF39B10

S= r || s

现在,PK_Issuer、h、S都是已知的,就可以用函数Verify (PK_Issuer ) [ h, S ]来验证签名是否正确了。

(结果是签名验证成功)



5、验证IC卡公钥证书Tag9F46

    IC卡公钥证书格式如下: 

   

    根据上面第2步读取的记录内容,可以得到IC卡公钥证书Tag9F46的值。

Tag9F46=14623061571010011182FF12300001FC04001140E841B537350C40A54F0DA3A108D1168FCFB9C3AE354D29F6323D50F067F1CCCD5316F8F8E0D777B8AEAFAE8D4098DBF59B640362F659B83DA82D3D7EE0ED815CF4C2638164896895A5B8A662939A920FEAEFEB0A96D2337A3507F5311293C7E683A83DC15D89ED99C0250D7927A8DBD54265A24FB4DDC4A4B28CE5B8C59DE6EF
    根据“表8”的格式,可以获取IC卡公钥PK_IC以及数字签名r||s。
PK_IC=E841B537350C40A54F0DA3A108D1168FCFB9C3AE354D29F6323D50F067F1CCCD5316F8F8E0D777B8AEAFAE8D4098DBF59B640362F659B83DA82D3D7EE0ED815Cr||s=F4C2638164896895A5B8A662939A920FEAEFEB0A96D2337A3507F5311293C7E683A83DC15D89ED99C0250D7927A8DBD54265A24FB4DDC4A4B28CE5B8C59DE6EF
     
    根据上面第3步,可以得到 发卡行公钥。

PK_Issuer=9B7EE1D2AE302EEEED9B97544A73BEF87A4D0A7B24749A4F065F7FBC5E3A16EF8CA7676DFC7C45D8FFAAC38D13340C70B0FEECEDA7AC8E896DE1A7D1A479B345



根据“表6”可知,IC卡公钥是由发卡行私钥签名的,所以要用发卡行公钥来解签。

现在我们来根据公式h = SM3 [ZA||MSG]计算哈希值,根据签名的验证过程:

ZA = SM3 [ENTLA+IDA+a+b+xG+yG+xPK_Issuer+yPK_Issuer];

ENTLA=0080

IDA=31323334353637383132333435363738

a=FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC

b=28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93

xG=32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7

yG=BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0

xPK_Issuer=9B7EE1D2AE302EEEED9B97544A73BEF87A4D0A7B24749A4F065F7FBC5E3A16EF

yPK_Issuer=8CA7676DFC7C45D8FFAAC38D13340C70B0FEECEDA7AC8E896DE1A7D1A479B345

ZA=SM3[ENTLA+IDA+a+b+xG+yG+xPK_Issuer+yPK_Issuer]  =SM3[008031323334353637383132333435363738FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E9332C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A09B7EE1D2AE302EEEED9B97544A73BEF87A4D0A7B24749A4F065F7FBC5E3A16EF8CA7676DFC7C45D8FFAAC38D13340C70B0FEECEDA7AC8E896DE1A7D1A479B345]  =7A96CBFCAEF87D8CDF4C5CC58A2F394154028B9067B563034D14A4DF7A67A6D8

“表6”中“参与脱机数据认证的静态数据”包括记录0208的内容(除去Tag70和Len)和AIP。

根据“表2”,可以得到待签名的数据,也就是MSG。

MSG= 14623061571010011182FF12300001FC04001140E841B537350C40A54F0DA3A108D1168FCFB9C3AE354D29F6323D50F067F1CCCD5316F8F8E0D777B8AEAFAE8D4098DBF59B640362F659B83DA82D3D7EE0ED815C5F24032211015F25031507245A096230615710100111829F0702FF008E0E000000000000000042031E031F009F0D05D8609CA8009F0E0500100000009F0F05D8689CF8005F280201569F080200308C1B9F02069F03069F1A0295055F2A029A039C019F37049F21039F4E148D1A8A029F02069F03069F1A0295055F2A029A039C019F37049F21037C00

h = SM3 [ZA||MSG];

h= 7FC10B13983FBB801209EB41B62CA38A214313D2C307330A03A16A4F0EBC4A2E

S= r || s

现在,PK_Issuer、h、S都是已知的,就可以用函数Verify( PK_Issuer )[h,S]来验证签名是否正确了。

(结果是签名验证成功)


6、验证签名的动态应用数据Tag9F4B(借贷记交易流程)

    标准借贷记交易中,9F4B通过内容认证指令产生。

SendAPDU=008800000401020304 
ReValue=80451503020068F72C221E2938BE6FD0317BD98C66C2C99713792EDEE66CA25FF97FC905F0F8C608D951777A060C9A498A207BA3B3F611CEAF1E48A6F809C6EC417EAB17851107

    根据返回的数据,可知9F4B的内容如下:

9F4B=1503020068F72C221E2938BE6FD0317BD98C66C2C99713792EDEE66CA25FF97FC905F0F8C608D951777A060C9A498A207BA3B3F611CEAF1E48A6F809C6EC417EAB17851107

    签名的动态应用数据9F4B的格式如下:


    根据“表11”的格式,可以获取数字签名r||s。

r||s=F72C221E2938BE6FD0317BD98C66C2C99713792EDEE66CA25FF97FC905F0F8C608D951777A060C9A498A207BA3B3F611CEAF1E48A6F809C6EC417EAB17851107

    根据上面第5步,可以得到IC卡行公钥。

PK_IC=E841B537350C40A54F0DA3A108D1168FCFB9C3AE354D29F6323D50F067F1CCCD5316F8F8E0D777B8AEAFAE8D4098DBF59B640362F659B83DA82D3D7EE0ED815C



现在我们来根据公式h = SM3 [ZA||MSG]计算哈希值,根据签名的验证过程:

ZA = SM3 [ENTLA+IDA+a+b+xG+yG+xIC+yIC];

ENTLA=0080

IDA=31323334353637383132333435363738

a=FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC

b=28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93

xG=32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7

yG=BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0

xIC= E841B537350C40A54F0DA3A108D1168FCFB9C3AE354D29F6323D50F067F1CCCD

yIC= 5316F8F8E0D777B8AEAFAE8D4098DBF59B640362F659B83DA82D3D7EE0ED815C


ZA=SM3 [ENTLA+IDA+a+b+xG+yG+xIC+yIC]  =SM3[008031323334353637383132333435363738FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E9332C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0E841B537350C40A54F0DA3A108D1168FCFB9C3AE354D29F6323D50F067F1CCCD5316F8F8E0D777B8AEAFAE8D4098DBF59B640362F659B83DA82D3D7EE0ED815C]  =52957BB5894D5AC693F35CBC91D59D12D29041AEFAC408954E303FB77CC3544F

根据“表9”,可以得到待签名的数据,也就是MSG。

MSG=150302006801020304

h = SM3 [ZA||MSG];

h= 133652D963731ABB5513E527B266287F129A0CA89E5D3D23602EE060AF4AA149

S= r || s

现在,PK_IC、h、S都是已知的,就可以用函数Verify( PK_IC  )[h,S]来验证签名是否正确了。

(结果是签名验证成功)




0 0
原创粉丝点击