📄 rsaenc.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 + -