C++与java、php通用解密,openssl

RSA验证:

                char *pData = "123456";
		static unsigned char ptext_ex[218] = {0};
		static unsigned char ctext_ex[218] = {0};
		
		int plen = 0;
		int clen = 0;
		EVP_MD_CTX ctxl; 
		EVP_MD_CTX_init(&ctxl);//初始化
		EVP_SignInit(&ctxl,EVP_sha1());//将需要使用的摘要算法存入ctxl中
		EVP_SignUpdate(&ctxl,(unsigned char *)pData,strlen(pData));//存入证书的编码值
		EVP_DigestFinal(&ctxl,ptext_ex,(unsigned int*)&plen);//求取编码的长度为m_len摘要值存入m中

		BIO *key = NULL;
		RSA *r = NULL;
		key = BIO_new(BIO_s_file());
		BIO_read_filename(key, "d:\\privateKey.txt");
		r = PEM_read_bio_RSAPrivateKey(key, NULL, NULL, NULL);
		BIO_free_all(key);

		RSA_sign(EVP_sha1()->type,(unsigned char*)ptext_ex,plen,ctext_ex,(unsigned int*)&clen,r);

		int iLen = 0;
		char p[130] = {0};
		std::string str = base64Encode(ctext_ex, clen);
		Base64Decode((unsigned char*)p, &iLen,(unsigned char*)str.c_str(), str.length());

		BIO *keyp = NULL;
		RSA *rp = NULL;
		keyp = BIO_new(BIO_s_file());
		BIO_read_filename(keyp, "d:\\rsa_public_key.pem");
		rp = PEM_read_bio_RSA_PUBKEY(keyp, NULL, NULL, NULL);
		BIO_free_all(keyp);

		int rc = RSA_verify(EVP_sha1()->type,(unsigned char*)ptext_ex,plen,ctext_ex, clen,rp);



RSA解密:

	key = BIO_new(BIO_s_file());
	BIO_read_filename(key, pKeyPath);
	r = PEM_read_bio_RSA_PUBKEY(key, NULL, NULL, NULL);
	BIO_free_all(key);

	while (iLen < iSrclen)
	{
		memset(cTmp, 0, sizeof(cTmp));
		memset(out, 0, sizeof(out));
		memcpy(cTmp, pIn, 128);
		pIn += 128;
		iLen += 128;

		iTmpLen = RSA_public_decrypt(128, (CT_UCHAR*)cTmp, (CT_UCHAR*)out, r, RSA_PKCS1_PADDING);
		iOutLen += iTmpLen;
		strncpy(pOut, out, iDstlen);
		pOut += iTmpLen;
	}


DES解密:

int docontinue = 1;
	char *pData = baseInfo; /* 明文 */
	int data_len = iBaseLen;
	int data_rest;
	unsigned char ch;
	unsigned char *src = NULL; /* 补齐后的明文 */
	unsigned char *dst = NULL; /* 解密后的明文 */
	int len;
	unsigned char tmp[8];
	unsigned char in[8];
	unsigned char out[512] = {0};
	char *k = appKey; /* 原始密钥 */
	DES_cblock ivec;
	int key_len;
#define LEN_OF_KEY 24
	unsigned char key[LEN_OF_KEY]; /* 补齐后的密钥 */
	unsigned char block_key[9];
	DES_key_schedule ks,ks2,ks3;
	/* 构造补齐后的密钥 */
	key_len = strlen(k);
	memcpy(key, k, key_len);
	memcpy(ivec,"dbe79c9c",9);
	memset(key + key_len, 0x00, LEN_OF_KEY - key_len);
	/* 分析补齐明文所需空间及补齐填充数据 */
	data_rest = data_len % 8;
	len = data_len + (8 - data_rest);
	ch = 8 - data_rest;
	src = (unsigned char *)malloc(len);
	dst = (unsigned char *)malloc(len);
	if (NULL == src || NULL == dst)
	{
		docontinue = 0;
	}
	if (docontinue)
	{
		int count;
		int i;
		/* 构造补齐后的加密内容 */
		memset(src, 0, len);
		memcpy(src, pData, data_len);
		memset(src + data_len, ch, 8 - data_rest);
		/* 密钥置换 */
		memset(block_key, 0, sizeof(block_key));
		memcpy(block_key, key + 0, 8);
		DES_set_key_unchecked((const_DES_cblock*)block_key, &ks);
		memcpy(block_key, key + 8, 8);
		DES_set_key_unchecked((const_DES_cblock*)block_key, &ks2);
		memcpy(block_key, key + 16, 8);
		DES_set_key_unchecked((const_DES_cblock*)block_key, &ks3);

		/* 循环加密/解密,每8字节一次 */
		count = len / 8;
		for (i = 0; i < count; i++)
		{
			memset(tmp, 0, 8);
			memset(in, 0, 8);
			memset(out, 0, 8);
			memcpy(tmp, src + 8 * i, 8);
			/* 解密 */
//			DES_ecb3_encrypt((const_DES_cblock*)tmp, (DES_cblock*)out, &ks, &ks2, &ks3, DES_DECRYPT);
			DES_ede3_cbc_encrypt((unsigned char*)baseInfo, out,240,&ks, &ks2, &ks3,(DES_cblock*)key, DES_DECRYPT);
			/* 将解密的内容拷贝到解密后的明文 */
			memcpy(dst + 8 * i, out, 8);
		}
	} 
	sprintf(dstOut, "%s", dst);


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值