文字列「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]);
}