SM9导入用户私钥(保护结构)
主要是分为两种:
第一种:用户签名密钥密钥封装保护结构数据结构
SM9 用户签名密钥密钥封装保护结构数据结构
typedef struct Struct_SM9SIGNENCAPSULATEDKEYBLOB {
ULONG Version;
ULONG ulSymmAlgID;
ULONG ulBits;
BYTE cbEncryptedPriKey[SM9_MODULUS_BITS_LEN * 2];
SM9SIGMASTPUBLICKEYBLOB signMastPubKey;
SM9ENCMASTPUBLICKEYBLOB tmpEncMastPubKey;
BYTE ucUserID[256];
ULONG ulUserIDLen;
SM9KEYPACKAGEBLOB keyPackageBlob;
} SM9SIGNENCAPSULATEDKEYBLOB;
非常明显这种呢主要是密钥封装类型,如果想要导入密钥,需要先解封密钥,再进行对称算法解密
具体步骤:
- 使用用户签名私钥来解封,解封长度ulBits / 8,用户ucUserID ulUserIDLen,解封 keyPackageBlob
解算出的结果就是下边对称算法的key
- 对称算法 ulSymmAlgID 密文 cbEncryptedPriKey,注意这边的算法是ecb模式,所以呢不需要iv值
第二种:用户签名密钥数字信封保护结构数据结构
SM9 用户签名密钥数字信封保护结构数据结构
typedef struct Struct_SM9SIGNENVELOPEDKEYBLOB {
ULONG Version;
ULONG ulSymmAlgID;
ULONG ulBits;
BYTE cbEncryptedPriKey[SM9_MODULUS_BITS_LEN * 2];
SM9SIGMASTPUBLICKEYBLOB signMastPubKey;
SM9ENCMASTPUBLICKEYBLOB tmpEncMastPubKey;
BYTE ucUserID[256];
ULONG ulUserIDLen;
SM9CIPHERBLOB cipherBlob;
} SM9SIGNENVELOPEDKEYBLOB;
具体步骤:
- 使用用户签名私钥来解密,解密长度ulBits / 8,用户ucUserID ulUserIDLen,解密密文 cipherBlob
解算出的结果就是下边对称算法的key
- 对称算法 ulSymmAlgID 密文 cbEncryptedPriKey,注意这边的算法是ecb模式,所以呢不需要iv值
注意:其中的SM9SIGMASTPUBLICKEYBLOB,如果有需要可以当主密钥也导入内存中