使用Windows系统自带的库去掉SDK库对openssl的依赖

这几天精简公司SDK库的大小,需要去掉SDK库对openssl的依赖,使用Windows系统自带的库。

有几点注意事项:
(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;
	}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值