在SM2 ECC算法中,有針對簽名加密的數據結構,下面對這些結構進行分析算法
#define ECCref_MAX_BITS 512
#define ECCref_MAX_LEN ((ECCref_MAX_BITS+7) / 8)數據結構
#define ECC_OFFSET 32加密
公鑰數據結構定義
typedef struct ECCrefPublicKey_st
{
unsigned int bits; //密鑰位長,數據長度爲4字節
unsigned char x[ECCref_MAX_LEN]; //公鑰X座標, 32字節
unsigned char y[ECCref_MAX_LEN]; //公鑰Y座標, 32字節
} ECCrefPublicKey;spa
私鑰數據結構定義blog
typedef struct ECCrefPrivateKey_st
{
unsigned int bits; //密鑰位長,數據長度爲4字節
unsigned char K[ECCref_MAX_LEN]; // 私鑰,32字節
} ECCrefPrivateKey;ip
memcpy(pucPublicKey->x+ECC_OFFSET, sm2key.x,32);
memcpy(pucPublicKey->y+ECC_OFFSET, sm2key.y,32);
memcpy(pucPrivateKey->K+ECC_OFFSET ,sm2key.d ,32);ci
用私鑰k能夠產生對應的公鑰x y,私鑰k由隨機數產生hash
ECC加密數據結構定義it
#define ECCCipher_MAX_C_LEN 4096
typedef struct ECCCipher_st
{
unsigned char x[ECCref_MAX_LEN];
unsigned char y[ECCref_MAX_LEN];
unsigned char M[32];
unsigned int L;
unsigned char C[ECCCipher_MAX_C_LEN];
} ECCCipher;table
起始地址:X+32 |
起始地址Y+32 |
加密的數據C |
SM3 hash值M |
長度爲32 長度爲32 長度爲L 長度爲32
因此加密的結果爲96+L