Open SSLライブラリでAES解読を使用してC++でchar配列を解読するには、何か助けが必要です。私はすでに暗号化モードを行って正常に動作しますが、復号化は機能しません。C++でAESを解読する例
これは、暗号化機能である:
string Encrypt(char *Key, char *Msg, int size)
{
static char* Res;
static const char* const lut = "ABCDEF";
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);
}
これは、メソッドを呼び出す主な機能の例で、問題がされ私はどのように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;
}
この方法で改善しましたか?
答えていただきありがとうございます。関数を呼び出すmain関数の例をアップロードしました。復号化のレスポンスを文字列として表示するには問題があります。 –
'Decrypt(key、enc_message、sizeof(enc_message));'が間違っている可能性があります。暗号テキストのサイズは 'Encrypt'関数によって返されます。あなたのメッセージに基づいて16バイトまたは32バイトでなければなりません。 EVPの対称暗号化と復号化| OpenSSL wikiの「C++プログラム」(https://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption#C.2B.2B_Programs)を参照してください。 [Botan](https://github.com/randombit/botan)や[Crypto ++](https://github.com/weidai11/cryptopp)のようなC++ライブラリも利用できます。 – jww
あなたは 'AES_encrypt'や友達を使うべきではありません。これはソフトウェアのみの実装なので、AES-NIなどのハードウェアサポートは受けられません。あなたは 'EVP_ *'関数を使っていなければなりません。 OpenSSL wikiの[EVP Symmetric Encryption and Decryption](http://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption)を参照してください。実際には、機密性と信頼性の両方を提供するため、おそらく認証された暗号化を使用するべきです。 OpenSSL wikiの[EVP Authenticated Encryption and Decryption](http://wiki.openssl.org/index.php/EVP_Authenticated_Encryption_and_Decryption)を参照してください。 – jww