gpt4 book ai didi

c++ - 在 C++ 示例中解密 AES

转载 作者:行者123 更新时间:2023-11-28 05:10:46 25 4
gpt4 key购买 nike

我需要一些帮助来使用带有 Open SSL 库的 AES 解密在 C++ 中解密 char 数组。我已经完成了加密模式并且工作正常,但解密不起作用。

这是加密函数:

string Encrypt(char *Key, char *Msg, int size)
{
static char* Res;
static const char* const lut = "0123456789ABCDEF";
string output;
AES_KEY enc_key;

Res = (char *)malloc(size);

AES_set_encrypt_key((unsigned char *)Key, 128, &enc_key);

for(int vuelta = 0; vuelta <= size; vuelta += 16)
{
AES_ecb_encrypt((unsigned char *)Msg + vuelta, (unsigned char *)Res + vuelta, &enc_key, AES_ENCRYPT);
}

output.reserve(2 * size);

for (size_t i = 0; i < size; ++i)
{
const unsigned char c = Res[i];
output.push_back(lut[c >> 4]);
output.push_back(lut[c & 15]);
}

free(Res);

return output;
}

这是解密函数(不工作):

char * Decrypt( char *Key, char *Msg, int size)
{
static char* Res;
AES_KEY dec_key;

Res = ( char * ) malloc( size );

AES_set_decrypt_key(( unsigned char * ) Key, 128, &dec_key);

for(int vuelta= 0; vuelta<=size; vuelta+=16)
{
AES_ecb_encrypt(( unsigned char * ) Msg+vuelta, ( unsigned char * ) Res+vuelta, &dec_key, AES_DECRYPT);
}

return (Res);
}

这是调用方法的 Main 函数的一个示例,问题是我不知道如何在 Decrypt 函数中打印“Res”变量,它总是显示随机的 ASCII 值,我喜欢在中显示结果像 Encrypt 函数这样的字符串:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

#include "openSSL/aes.h"

using namespace std;

int main(int argc, char const *argv[])
{
char key[16];
char message[128];
char enc_message[128];

string s_key = "THIS_IS_THE_KEY_";
string s_message = "Hello World !!!";

memset(key, 0, sizeof(key));
strcpy(key, s_key.c_str());

memset(message, 0, sizeof(message));
strcpy(message, s_message.c_str());

string response = Encrypt(key, message, sizeof(message));

cout<<"This is the Encrypted Message: "<<response<<endl;

memset(enc_message, 0, sizeof(enc_message));
strcpy(enc_message, response.c_str());

Decrypt(key, enc_message, sizeof(enc_message));

return 0;
}

这个方法有什么改进吗?

最佳答案

我想给出我如何解决它的答案:我的示例的问题是我试图将解密函数与十六进制字符串一起使用,它应该使用具有交付值的 ASCII 字符串来完成通过加密函数。

也就是说,不是像这样尝试解密字符串:461D019896EFA3

必须用这样的字符串解密:@(%_!#$

之后,解密将以 ASCII 值传送。它们必须传递给十六进制,最后传递给字符串。

这是对我有用的例子:

string Decrypt_string(char *Key, string HEX_Message, int size)
{
static const char* const lut = "0123456789ABCDEF";
int i = 0;
char* Res;
AES_KEY dec_key;
string auxString, output, newString;

for(i = 0; i < size; i += 2)
{
string byte = HEX_Message.substr(i, 2);
char chr = (char) (int)strtol(byte.c_str(), NULL, 16);
auxString.push_back(chr);
}

const char *Msg = auxString.c_str();
Res = (char *)malloc(size);

AES_set_decrypt_key((unsigned char *)Key, 128, &dec_key);

for(i = 0; i <= size; i += 16)
{
AES_ecb_encrypt((unsigned char *)Msg + i, (unsigned char *)Res + i, &dec_key, AES_DECRYPT);
}

output.reserve(2 * size);

for (size_t i = 0; i < size; ++i)
{
const unsigned char c = Res[i];
output.push_back(lut[c >> 4]);
output.push_back(lut[c & 15]);
}

int len = output.length();

for(int i = 0; i < len; i += 2)
{
string byte = output.substr(i, 2);
char chr = (char) (int)strtol(byte.c_str(), NULL, 16);
newString.push_back(chr);
}

free(Res);

return newString;
}

关于c++ - 在 C++ 示例中解密 AES,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43551444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com