2017-04-21 3 views
0

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; 
} 

この方法で改善しましたか?

+0

答えていただきありがとうございます。関数を呼び出すmain関数の例をアップロードしました。復号化のレスポンスを文字列として表示するには問題があります。 –

+1

'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

+1

あなたは '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

答えて

1

私はそれをどのように解決したか答えを出したいと思っていました。私の例の問題は、私がHEXADECIMAL STRINGを使って解読関数を使用しようとしていて、ASCII STRINGで暗号化機能によって配信される。 461D019896EFA3

それは、このような文字列で復号化する必要があります:代わりに、このような文字列を解読しようとしているのです

@(%_その後#$

を、!復号化は、ASCII値でのお届けとなります彼らは16進数に渡され、最終的に文字列にする必要があります

ここでは私のために働いた例です。

string Decrypt_string(char *Key, string HEX_Message, int size) 
{ 
    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; 
} 
関連する問題