这几天精简公司SDK库的大小,需要去掉SDK库对openssl的依赖,使用Windows系统自带的库。
有几点注意事项:
(1)当时使用openssl用到的公钥,不能直接用CryptImportKey导入,数据格式如下:
有几点注意事项:
(1)当时使用openssl用到的公钥,不能直接用CryptImportKey导入,数据格式如下:
数据头[BLOBHEADER + RSAPUBKEY] + data
// 系统定义
typedef struct _PUBLICKEYSTRUC {
BYTE bType;
BYTE bVersion;
WORD reserved;
ALG_ID aiKeyAlg;
} BLOBHEADER, PUBLICKEYSTRUC;
// 系统定义
typedef struct _RSAPUBKEY {
DWORD magic; // Has to be RSA1
DWORD bitlen; // # of bits in modulus
DWORD pubexp; // public exponent
// Modulus data follows
} RSAPUBKEY;
//下边是自己定义要定义的公钥信息结构体
typedef struct RSA_PUBKEY_INFO_{
BLOBHEADER blobHeader;
RSAPUBKEY rsaPubKey;
BYTE data[128];
}Rsa_pubKeyInfo;
(2)如何通过openssl读取需要的公钥数据头信息,以下仅为代码片段,仅供参考:
int nKeyLen=RSA_size(pRSA);
*pdwDataLen=(nKeyLen+sizeof(BLOBHEADER)+sizeof(RSAPUBKEY));
// now craete pbData
pbTemp=pbData;
pBlobHeader=(BLOBHEADER *)pbData;
pBlobHeader->bType=PUBLICKEYBLOB;
pBlobHeader->bVersion=CUR_BLOB_VERSION; //0x02;
pBlobHeader->reserved=0;
pBlobHeader->aiKeyAlg=pKeyCtx->pRSACtx->AlgID;
pbTemp+=sizeof(BLOBHEADER);
pRSAPubKey=(RSAPUBKEY *)pbTemp;
//0x31415352(ASCII),"RSA1",PUBLICKEYBLOB
//0x32415352(ASCII),"RSA2",PRIVATEKEYBLOB
pRSAPubKey->magic=0x31415352; // "RSA1" PUBLICKEYBLOB
pRSAPubKey->bitlen=nKeyLen*8;
pRSAPubKey->pubexp=(DWORD)BN_get_word(pRSA->e); // CSP just use DWORD e
pbTemp+=sizeof(RSAPUBKEY); // now get n
nPubKeyLen=BN_bn2bin(pRSA->n,pbTemp);
if(nPubKeyLen!=nKeyLen){
goto err;
}
(3)openssl里用到的公钥值data,需要做一下数据反转。
void convertData(BYTE* pbData, int nDataLen)
{
BYTE bDataTmp = 0;
for(int i=0; i<nDataLen/2; i++)
{
bDataTmp = pbData[i];
pbData[i] = pbData[nDataLen-i-1];
pbData[nDataLen-i-1] = bDataTmp;
}
return;
}