⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rsaenc.cpp

📁 使用openssl库
💻 CPP
字号:
#include <openssl/rsa.h>
#include <windows.h>
#include "RSAEnc.h"

void reversedata(BYTE* pb, DWORD len)
{
	BYTE temp  = 0;
	for(DWORD i=0; i<len/2; ++i)
	{
		temp = pb[i];
		pb[i] = pb[len-1-i];
		pb[len-1-i] = temp;

	}

}

long __stdcall RSAData(
					   IN unsigned char* pbPubKey,
					   IN long ulPubKeyLen,
					   IN OUT unsigned char*	pbData,
					   IN long ulDataLen)
{

	if(pbPubKey == NULL)
		return 1;

	if(pbData == NULL)
		return 2;

	if(ulPubKeyLen == 1024)
	{
		if(ulDataLen != 128)
			return 3;
	}
	else if(ulPubKeyLen == 2048)
	{
		if(ulDataLen != 256)
			return 4;
	}
	else if(ulPubKeyLen ==512)
	{
		if(ulDataLen != 64)
			return 5;
	}
	else
		return 6;

	

	unsigned char *pbModulus = new unsigned char[ulDataLen];
	unsigned char *pbPlainText = new unsigned char[ulDataLen];
	unsigned char *pbCipherText = new unsigned char[ulDataLen];
	//unsigned char *pbOut = new unsigned char[ulDataLen];

	memset(pbModulus, 0, ulDataLen);
	memset(pbPlainText, 0, ulDataLen);
	memset(pbCipherText, 0, ulDataLen);
	//memset(pbOut, 0, ulDataLen);

	memcpy(pbModulus, pbPubKey, ulDataLen);
	unsigned char pbExponet[3] = {0x01,0x00,0x01};
	
	long iRet = 0;

	memcpy(pbPlainText, pbData, ulDataLen);

	RSA* pubRsa=NULL;
	pubRsa=RSA_new();


	pubRsa->n=BN_bin2bn(pbModulus, ulDataLen, NULL);
	pubRsa->e=BN_bin2bn(pbExponet, 3, NULL);

	iRet = RSA_public_encrypt(RSA_size(pubRsa), pbPlainText, pbCipherText, pubRsa,RSA_NO_PADDING);
	if(iRet != ulDataLen)
	{
		if(pbModulus != NULL)
		{
			delete [] pbModulus;
			pbModulus = NULL;
		}

		if(pbPlainText != NULL)
		{
			delete [] pbPlainText;
			pbPlainText = NULL;
		}

		if(pbCipherText != NULL)
		{
			delete [] pbCipherText;
			pbCipherText = NULL;
		}

	
		return 8;
	}
	
/*	for(int i=0; i<(ulDataLen/4); i++)
	{
		memcpy(pbOut+124-(i*4), pbCipherText+(i*4),4);
	}
*/
	memcpy(pbData, pbCipherText, ulDataLen);


	if(pbModulus != NULL)
	{
		delete [] pbModulus;
		pbModulus = NULL;
	}

	if(pbPlainText != NULL)
	{
		delete [] pbPlainText;
		pbPlainText = NULL;
	}

	if(pbCipherText != NULL)
	{
		delete [] pbCipherText;
		pbCipherText = NULL;
	}

	
	return 0;
}


//long __declspec(dllexport) __stdcall RSAEncryptData(IN unsigned char*	pbPubKey,	
//													IN OUT unsigned char*	pbData)
long __stdcall RSAPubEncryptData(IN unsigned char*	pbPubKey,	
													IN OUT unsigned char*	pbData)
{

	if(pbPubKey == NULL)
		return 1;

	if(pbData == NULL)
		return 2;

	unsigned char pbModulus[128] = {0};

//	BYTE pbModulus[128] = {0xB9, 0xB4, 0xB7, 0x72, 0x09, 0x7C,
//0xC1, 0x58, 0x12, 0xCC, 0x14, 0xF9, 0xEC, 0x0A,
//0xFA, 0xC2, 0xE9, 0x50, 0x0B, 0xC6, 0xF8, 0x99,
//0x37, 0x99, 0xDD, 0xC9, 0x91, 0x1F, 0xFC, 0x30,
//0x46, 0x14, 0xCE, 0x5C, 0x2E, 0xAA, 0xD8, 0x0D,
//0x17, 0x08, 0x7A, 0xB2, 0xBE, 0x41, 0xD9, 0xE5,
//0x71, 0x06, 0xF8, 0x4D, 0xD1, 0x4F, 0x5F, 0x9B,
//0x50, 0x8F, 0x32, 0x70, 0xCF, 0x79, 0x3D, 0x3B,
//0xAC, 0xD9, 0x06, 0x42, 0xB9, 0x4B, 0x22, 0xFF,
//0x84, 0xC1, 0xD9, 0xB4, 0x05, 0xF6, 0xC6, 0x1E,
//0x2D, 0x93, 0x6F, 0x8F, 0x4B, 0x29, 0x3A, 0xDF,
//0xE7, 0x1F, 0xE4, 0x06, 0x80, 0xC9, 0x4A, 0x49,
//0x90, 0xCC, 0xBE, 0x4A, 0x08, 0x5D, 0x2B, 0x52,
//0x6A, 0x5E, 0x3A, 0x0B, 0x13, 0xF9, 0xC4, 0xC0,
//0x3C, 0x2B, 0xAB, 0x68, 0x3F, 0x84, 0xB1, 0xBE,
//0xF6, 0x6F, 0xC5, 0x57, 0xEC, 0x92, 0xB0, 0x5D,
//0x35, 0xAB};
	
	pbModulus[0] = 0;
	memcpy(pbModulus, pbPubKey, 128);

	reversedata(pbModulus, 128);

	unsigned char pbExponet[3] = {0x01,0x00,0x01};
	unsigned char pbPlainText[130] = {0};
	unsigned char pbOut[128] = {0};
	unsigned char pbCipherText[128] = {0};
	int iRet = 0;

//	for(int i=0; i<128; ++i)
//		pbPlainText[i] = 0x11;

//	pbPlainText[0] = 0;
//	memcpy(pbPlainText+1, pbData, 127);
	memcpy(pbPlainText, pbData, 128);

	RSA* pubRsa=NULL;
	pubRsa=RSA_new();


	pubRsa->n=BN_bin2bn(pbModulus, 128, NULL);
	pubRsa->e=BN_bin2bn(pbExponet, 3, NULL);

	iRet = RSA_public_encrypt(RSA_size(pubRsa), pbPlainText, pbCipherText, pubRsa,RSA_NO_PADDING);
	if(iRet != 128)
		return 3;
	
	for(int i=0; i<32; i++)
	{
		memcpy(pbOut+124-(i*4), pbCipherText+(i*4),4);
	}

	memcpy(pbData, pbOut, 128);
	
//	printf("%d\n",iRet);
//	for(i=0; i<iRet; ++i)
//	{
//		if(i%16 == 0)
//			printf("\n");
//
//		printf("%02x ",pbOut[i]);
//	}
	
	return 0;
}


//long __declspec(dllexport) __stdcall RSADecryptData(IN unsigned char*	pbPriKey,	
//													IN OUT unsigned char*	pbData)
long  __stdcall RSAPriDecryptData(IN unsigned char*	pbPriKey,	
													IN OUT unsigned char*	pbData)
{
	if(pbPriKey == NULL)
		return 1;

	if(pbData == NULL)
		return 2;

	unsigned char pbModulus[128] = {0};
	unsigned char pbD[128] = {0};
	unsigned char pbbuffer[262] = {0};

	memcpy(pbbuffer, pbPriKey, 262);
	memcpy(pbD, pbbuffer+6, 128);
	memcpy(pbModulus, pbbuffer+134, 128);

	reversedata(pbModulus, 128);
	reversedata(pbD, 128);

	unsigned char pbExponet[3] = {0x01,0x00,0x01};
	unsigned char pbPlainText[130] = {0};
	unsigned char pbOut[128] = {0};
	unsigned char pbCipherText[130] = {0};
	int iRet = 0;

	for(int i=0; i<32; i++)
	{
		memcpy(pbOut+124-(i*4), pbData+(i*4),4);
	}

	RSA* pubRsa=NULL;
	pubRsa=RSA_new();

	pubRsa->n=BN_bin2bn(pbModulus, 128, NULL);
	pubRsa->e=BN_bin2bn(pbExponet, 3, NULL);
	pubRsa->d =BN_bin2bn(pbD, 128, NULL);

	memcpy(pbCipherText, pbOut, 128);

	iRet = RSA_private_decrypt(RSA_size(pubRsa),  pbCipherText, pbPlainText, pubRsa,RSA_NO_PADDING);
	if(iRet != 128)
		return 3;

	memcpy(pbData, pbPlainText+1, 127);

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -