Snooper中的sm9使用说明

 

 

 

 

本手册中涉及的Snooper版本为0.0.6.2


   

国密SM9算法说明.... 3

一、简介:.... 3

二、辅助计算.... 4

1.如何打开此功能?... 4

1.1打开snooper.exe,选择“Calculate”. 4

1.2 以签名为例,打开签名窗口。... 6

2.其他界面... 10

2.1加密解密界面... 10

2.2密钥封装... 11

2.3密钥交换... 12

三、脚本计算.... 20

 


 

国密SM9算法说明

一、简介:

SM9是我国采用的,基于标识(IBC)的密码系统,IBCIdentity-Based Cryptograph),由传统的PKI基础上发展而来,主要简化在具体安全应用在大量数字证书的交换问题,使安全应用更加易于部署和使用。由国家密码管理局2016年3月28日发布,相关标准为“GM/T 0044-2016 SM9标识密码算法

 

sm9中有一个概念叫主密钥,处于标识密码密钥分层结构最顶层的密钥,包括主私钥和主公钥,其中主公钥公开,主私钥由KGC秘密保存。KGC用主私钥和用户的标识生成用户的私钥。在标识密码中,主私钥一般由KGC通过随机数发生器产生,主公钥由主私钥结合系统参数产生。

 

密钥生成中心key generation centerKGC

 

其中主私钥需要严格保密,在下面的内容中,主私钥是一个随机数。

 

SM9功能包括签名、验签,加密、解密、密钥封装、密钥交换等4个主要功能。

 

Snooper 0.0.6.2版本中也加入了sm9全套的功能,下面对如何使用进行简单介绍。

二、辅助计算

1.如何打开此功能?

1.1打开snooper.exe,选择“Calculate

1.2 以签名为例,打开签名窗口。

 

在签名窗口中,我们会看到几个输入、输出窗口,还有几个按钮,每个按钮都使用数字指明了哪个功能需要什么输入,产生几个输出。

 

先以生成密钥为例,随机生成一个主私钥(输出到1),再由主私钥生成主公钥(输出到2),再按34的内容计算签名私钥(输出到5

 

34中输入适当的参数,点击生成密钥按钮,效果如下

 

如果主私钥是指定的,则将其填入1中,点击计算密钥按钮

 

下面我们以规范中的标准数据为例。

 

 

签名主钥和用户签密钥产生过中的相关值

ks0130E7 8459D785 45CB54C5 87E02CF4 80CE0B66 340F319F 348A1D5B 1F2DC5F4

Ppub-s = [ks]P2 = (xPpub-s  , yPpub-s)

xPpub-s(9F64080B 3084F733 E48AFF4B 41B56501 1CE0711C 5E392CFB 0AB1B679 1B94C408,

29DBA116 152D1F78 6CE843ED 24A3B573 414D2177 386A92DD 8F14D656 96EA5E32)

yPpub-s(69850938 ABEA0112 B57329F4 47E3A0CB AD3E2FDB 1A77F335 E89E1408 D0EF1C25, 41E00A53 DDA532DA 1A7CE027 B7A46F74 1006E85F 5CDFF073 0E75C05F B4E3216D)

hid0x01

A IDAAlice

 

 

 

 

 

dsA = [t2]P1 = (xdsA, ydsA)

xdsAA5702F05 CF131530 5E2D6EB6 4B0DEB92 3DB1A0BC F0CAFF90 523AC875 4AA69820

 

ydsA78559A84 4411F982 5C109F5E E3F52D72 0DD01785 392A727B B1556952 B2B013D3

 

 


 

 

 

点击计算

 

 

 

签名步中的相关值

MChinese IBS standard

M 16 示:4368696E 65736520 49425320 7374616E 64617264

 

 

6中填入明文,点击签名,生成hs,或填入h, s,进行验签。

 

 

由于sm9签名中有随机数参与,所以每次签名的值都会有变化,如果固定好随机数,则签名的结果也会固定

 

 

2.其他界面

2.1加密解密界面

2.2密钥封装

 

2.3密钥交换

 

由于密钥交换使用比较复杂,所以下面演示一下流程

 

2.3.1填入数据

 

此时生成了主私钥、主公钥,解密私钥A,由于A,B需要拥有同样的主公钥,主私钥,所以B需要点击计算密钥。

2.3.2计算B的密钥

 

 

2.3.3生成双方临时密钥

 

 

2.3.4密钥交换

最后点击交换初始化,或交换响应

 

 

三、脚本计算

Snooper最大的优势在于脚本,拥有大量可靠的、实用的函数,下面以加密、解密为例,介绍一下Snooper脚本。

 

 

打开脚本

 

 

将下面的脚本填入新打开的窗口中

 

x       = new_sm9_gen_encrypt_master_key()

pri     = mid( $x, 0, 32 )

pub     = mid( $x, 32 )

 

enc_pri = new_sm9_gen_encrypt_pri_key( ansi_string( "Bob" ), 03, $pri )

 

// 加密主私钥ke01EDEE 3778F441 F8DEA3D9 FA0ACC4E 07EE36C9 3F9A0861 8AF4AD85 CEDE1C22

// 加密主公钥Ppub-e = [ke]P1= (xPpub-e , yPpub-e)

// 坐标xPpub-e787ED7B8 A51F3AB8 4E0A6600 3F32DA5C 720B17EC A7137D39 ABC66E3C 80A892FF

// 坐标yPpub-e769DE617 91E5ADC4 B9FF85A3 1354900B 20287127 9A8C49DC 3F220F64 4C57A7B1

// 加密私钥生成函数识别符hid0x03

// 实体B 的标识IDB: Bob

// IDB 的16 进制表示:426F62

 

pri     = 0001EDEE 3778F441 F8DEA3D9 FA0ACC4E 07EE36C9 3F9A0861 8AF4AD85 CEDE1C22

pub     = new_sm9_get_encrypt_master_key( $pri )

if $pub != 787ED7B8A51F3AB84E0A66003F32DA5C720B17ECA7137D39ABC66E3C80A892FF769DE61791E5ADC4B9FF85A31354900B202871279A8C49DC3F220F644C57A7B1

    ?

    pause

endif

 

idb     = ansi_string( "Bob" )

hid     = 03

 

// 计算deB=[t2]P2=(xdeB, ydeB)

// 21

// 坐标xdeB(94736ACD 2C8C8796 CC4785E9 38301A13 9A059D35 37B64141 40B2D31E ECF41683,

//          115BAE85 F5D8BC6C 3DBD9E53 42979ACC CF3C2F4F 28420B1C B4F8C0B5 9A19B158)

// 坐标ydeB(7AA5E475 70DA7600 CD760A0C F7BEAF71 C447F384 4753FE74 FA7BA92C A7D3B55F,

//          27538A62 E7F7BFB5 1DCE0870 4796D94C 9D56734F 119EA447 32B50E31 CDEB75C1)

 

deb     = new_sm9_gen_encrypt_pri_key( $idb, $hid, $pri )

if $deb != 94736ACD2C8C8796CC4785E938301A139A059D3537B6414140B2D31EECF41683115BAE85F5D8BC6C3DBD9E5342979ACCCF3C2F4F28420B1CB4F8C0B59A19B1587AA5E47570DA7600CD760A0CF7BEAF71C447F3844753FE74FA7BA92CA7D3B55F27538A62E7F7BFB51DCE08704796D94C9D56734F119EA44732B50E31CDEB75C1

    ?

    pause

endif

 

m       = ansi_string( "Chinese IBE standard" )

 

cipher  = new_sm9_encrypt_block( $m, $idb, $hid, $pub )

plain   = new_sm9_decrypt_block( $cipher, $idb, $hid, $deb )

 

if $plain != $m

    ?

    pause

endif

 

cipher  = new_sm9_encrypt_stream( $m, $idb, $hid, $pub )

plain   = new_sm9_decrypt_stream( $cipher, $idb, $hid, $deb )

 

if $plain != $m

    ?

    pause

endif

 

? "success"

 

 

 

F10逐行执行

 

或按F5执行到结束

 

 

本次执行的结果如下

 

 

//x = 796C5FD971F5095D42A65F8C7EBE0A1B1EB3252355F1036D76B40A6261400FEC3E67A62E9E1203B067548A392BBF7639E4C0F1CE8DA5EA8569D2DA214BAF1A8240CF77D19A17EC88C5FAF3F662AC991474D399E45D0B58B6076D6E66E9EDD254

//pri = 796C5FD971F5095D42A65F8C7EBE0A1B1EB3252355F1036D76B40A6261400FEC

//pub = 3E67A62E9E1203B067548A392BBF7639E4C0F1CE8DA5EA8569D2DA214BAF1A8240CF77D19A17EC88C5FAF3F662AC991474D399E45D0B58B6076D6E66E9EDD254

//enc_pri = 638DD29796D8015BDEB09A8171C55DFBC2F514116C4CD985CD40BBDDCDEE4F6F0484F7A794E6F936B79FDE09718B14A0AA0A28AA4120BBB934A70315469A164317D3011DA4A43881ED5DEE85CEFAB9CA0424B2D114ED1F7600450E4B68C536B98255C3E6A7702DF19E027DD69699BA06F6B018B33B364063EBD299A88C87BCE0

//pri = 0001EDEE3778F441F8DEA3D9FA0ACC4E07EE36C93F9A08618AF4AD85CEDE1C22

//pub = 787ED7B8A51F3AB84E0A66003F32DA5C720B17ECA7137D39ABC66E3C80A892FF769DE61791E5ADC4B9FF85A31354900B202871279A8C49DC3F220F644C57A7B1

//idb = 426F62

//hid = 03

//deb = 94736ACD2C8C8796CC4785E938301A139A059D3537B6414140B2D31EECF41683115BAE85F5D8BC6C3DBD9E5342979ACCCF3C2F4F28420B1CB4F8C0B59A19B1587AA5E47570DA7600CD760A0CF7BEAF71C447F3844753FE74FA7BA92CA7D3B55F27538A62E7F7BFB51DCE08704796D94C9D56734F119EA44732B50E31CDEB75C1

//m = 4368696E65736520494245207374616E64617264

//cipher = 79E5F3AB15CD126634B3134AE668628663954B17D47796CFD451413D01F343DCAB18BCB27595BF8D25C586871F6D33B952CFA718DD22EB5C3F2278A6DB6058AA6C1AF8EE337A88A63A8687B10D2C06C083DA6308C78568E0E624321CEB80B357A68C1B0BD2D5FFC10B400A0ABBD4EF077D82EE7A93406BF5EAEC847097DB292B

//plain = 4368696E65736520494245207374616E64617264

//cipher = A4C9F55304DD3C6545F05E2DA02BE6507BB3A17947B845A8109D1EC97B2F36714E7B6762F1C83F28ACE27D5B5333EAA2DAC35BA312EE8BDEAA18CCA4263882F11DEDD87705E3C9C15ABB30A675A0A0DF8BA85205F9ED7344B43600CBF6B16AC6FB2DE292F960088A7145730C65944FFC0F1D41BE

//plain = 4368696E65736520494245207374616E64617264

 

//[]=============[]

//[]  success    []

//[]=============[]