
《SM2密碼算法使用規範》規定了數字證書SM2算法的公/私鑰及加密簽名格式。
1.SM2公鑰格式用ASN.1描述如下:
SM2PublicKey::=BIT STRING
SM2公鑰是SM2曲線上的一個點,由橫、縱坐標兩個分量來表示,記為(x,y),簡記為Q,每個分量長度為256位。SM2PublicKey內容格式為:04‖X‖Y。其中,X和Y分別表示公鑰的x分量和y分量,其長度各為256位。
2.SM2私鑰格式用ASN描述如下:
SM2PrivateKey::=INTEGER
SM2私鑰是一個大於或等於1且小於n-1的整數(n為SM2算法的階),簡記為k,長度為256位。
3.SM2加密數據格式用ASN1描述如下:
SM2Cipher::=SEQUENCE {
XCoordinate INTEGER,--x分量
YCoordinate INTEGER,--y分量
HASH OCTET STRING SIZE(32),--摘要值
CigherText OCTET STRING --密文
}
假設使用SM2公鑰Q(SM2PublicKey類型)對明文m(字符串類型)進行加密計算。則XCoordinate和YCoordinate為隨機產生的公鑰的x分量和y分量。HASH為使用SM3算法對明文數據運算得到的摘要值,其長度為256位,HASH=SM3(x‖m‖y),其中x和y為Q的x分量和y分量。CipherText是與明文等長的密文。
假設使用SM2私鑰d(SM2Privatekey類型)對密文c(SM2Cipher類型)進行解密計算,則解密後將取得明文m,其長度等於密文(c→Cipher Text)的長度。
4.SM2簽名數據格式用ASN描述如下:
SM2Signature::=SEQUENCE {
R INTEGER, --簽名值的第一部分
S INTEGER, --簽名值的第二部分
}
其中,R和S的長度各為256位。
假設使用簽名方私鑰d(SM2PrivateKey類型)對待簽名數據M(字符串類型)進行簽名計算。具體計算步驟如下:
①預處理1:使用簽名方的用戶身份標識ID(字符串類型)和簽名方公鑰Q(SM2PublicKey類型),顺利获得運算得到Z值(字符串類型)。
Z=SM3(ENTL‖ID‖a‖b‖XG‖yG‖xA‖yA)
其中,ENTL為2位元組表示的ID的比特長度。ID為用戶身份標識,無特殊約定情況下,長度為16位元組,默認值從左至右依次為:
0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38。a和b為系統曲線參數。xG和yG為基點,xA和yA為簽名方公鑰。
②預處理2:使用預處理1結果Z值(字符串類型)和待簽名數據M(字符串類型),顺利获得SM3運算得到摘要值H(字符串類型)。
H=SM3(Z‖M)
③簽名:使用預處理2結果H(字符串類型)和簽名方私鑰d(SM2PrivateKey類型),顺利获得簽名計算得到簽名結果sign(SM2Signature類型)。
簽名驗證時,使用預處理2結果H(字符串類型)、簽名結果sign(SM2Signature類型)和簽名方公鑰Q(SM2PublicKey類型),顺利获得驗簽計算確定簽名結果是否顺利获得驗證。
在SM2密鑰對傳遞時,需加密保護它。
5.SM2密鑰對的保護數據格式用ASN.1描述如下:
SM2EnvelopedKey::=SEQUENCE {
symAlgID Algorithmldentifier, --對稱密鑰算法標識
symEncryptedKey SM2Ciphe --對稱密鑰密文
Sm2PublicKey SM2PublicKey, --SM2公鑰
Sm2EncryptedPrivateKey BIT STRING --SM2私鑰密文
}
其中,具體的保護方法為:
①產生一個對稱密鑰。
②按對稱密鑰算法標識指定的算法加密SM2私鑰,得到私鑰密文。若對稱算法為分組算法,則其運算模式為ECB。
③使用外部SM2公鑰加密對稱密鑰得到對稱密鑰密文。
④把私鑰密文、對稱密鑰密文封裝到密鑰對保護數據中。
