3

文字列「TEST」が与えられた場合、それを文字の配列に変換したい

 char goal[] = "TEST";

文字列を char* にコピーする方法は次のとおりです。

 char *test=new char[k.size()+1];
 test[k.size()]=0;
 memcpy(test,k.c_str(),k.size());

上記の方法は実際に機能するか、機能しているように見えます。

私が持っているとしましょう:

   char goal[] = "TEST";

次に、次のように GDB を使用してコードをデバッグします。

 (gdb) b function
 (gdb) p goal
 $1 = "TEST"

ただし、上記のコードを使用して文字列を char* にコピーすると、デバッガーは次のように出力します。

 (gdb) b function
 (gdb) p test
 $2 = 0x1001000d0 "TEST"

印刷しても変化なし。どちらも「TEST」を出力します(coutなどを使用)。ただし、これによりコード内のすべてが変更されます。

#include <openssl/engine.h>
#include <openssl/evp.h>
#include <openssl/hmac.h>

function(string A, string B) 
{
    // The following two lines yield to correct solution: AFF791FA574D564C83F6456CC198CBD316949DC9
    char key[] = "Password";
    char data[] = "Message";

    /* Alternative yields to:  2b2c26033b2dcfc22051941c31bd3cf54f96816d
        string k = "Password";
        char *key=new char[k.size()+1];
        key[k.size()]=0;
        memcpy(key,k.c_str(),k.size());

        char *data=new char[d.size()+1];
        data[d.size()]=0;
        memcpy(data,d.c_str(),d.size());
     */

    unsigned char* result;
    unsigned int len = 20;

    result = (unsigned char*)malloc(sizeof(char) * len);

    HMAC_CTX ctx;
    ENGINE_load_builtin_engines();
    ENGINE_register_all_complete();
    HMAC_CTX_init(&ctx);
    // Using sha1 hash engine here.
    // You may use other hash engines. e.g EVP_md5(), EVP_sha224, EVP_sha512, etc
    HMAC_Init_ex(&ctx, key, strlen(key), EVP_sha1(), NULL);
    HMAC_Update(&ctx, (unsigned char*)&data, strlen(data));
    HMAC_Final(&ctx, result, &len);
    HMAC_CTX_cleanup(&ctx);

    // cout << key << " - " << data << endl;
    cout << "HMAC digest: " << endl;

    for (unsigned int i = 0; i != len; i++)
        printf("%02x", (unsigned int)result[i]);
}
4

1 に答える 1

4

問題は次のとおりです。

HMAC_Update(&ctx, (unsigned char*)&data, strlen(data));
                                  ^^^^^

配列として宣言するdataと、ほとんどの場合、そのアドレスは、 addressof ( ) 演算子&dataを使用しなかった場合に減衰するポインターと同じポインター (数値) 値を持ちます。&2 つのポインターの型のみが異なります (char *char (*)[8])。

(これは単なる実装の詳細であり、C および C++ 標準のどちらもこれを要求していませんが、一般的にはそのように実装されています。)

dataただし、ポインターとして宣言すると、さらに大幅に異なりdataます。これは正しくありません。ポインターが指す文字列ではなく、ポインター自体に格納されているアドレスをハッシュしています。&data&data

全体として、それをドロップし&ます。

于 2013-06-09T09:36:48.047 に答える