1

Crypto++ を使用して AES で文字列を暗号化しています。正常に動作しますが、キーであるバイト値を返す関数を作成したいと思います。

byte AESBest::gen_key()
{
    AutoSeededRandomPool prng;

    // warning: address of local variable ‘key’ returned [enabled by default]
    byte key[AES::MAX_KEYLENGTH];

    prng.GenerateBlock(key, sizeof(key));

    //Error: invalid conversion from ‘byte {aka unsigned char}’ to ‘const byte* {aka const unsigned char*}’ [-fpermissive] }
    return key;
}

良い。不明な点があり、鍵を返却できません。日食を設定byte key[AES::MAX_KEYLENGTH]すると、返されると思われる警告が表示されます。しかし、最後にキーを返すと、無効な変換に関する奇妙なエラーが発生します。

なぜこれが起こるのですか?

どうすればこの問題を解決できますか?


編集:まあ。今、私はこれらの2つの機能を持っています。しかし、最初のものはうまく機能し、aes キーの 64 文字を返します。(gen_all)

2 つ目 - 理由はわかりません - 4 つだけが返されます。なんで?(gen_part)

string AESBest::gen_all()
{
    AutoSeededRandomPool prng;
    byte key[AES::MAX_KEYLENGTH];
    prng.GenerateBlock(key, sizeof(key));

    string encoded;
    encoded.clear();
    StringSource(key, sizeof(key), true,
        new HexEncoder(
            new StringSink(encoded)
        )
    );
    return encoded;
}

と:

string AESBest::gen_part()
{
    AutoSeededRandomPool prng;
    std::vector<byte> key(AES::MAX_KEYLENGTH);
    prng.GenerateBlock(key.data(), key.size());

    string encoded;
    encoded.clear();
    StringSource(key.data(), sizeof(key.size()), true,
        new HexEncoder(
            new StringSink(encoded)
        )
    );

    return encoded;
}

2番目のバグはどこにありますか?

編集:気にしないでください!バグは にあったsizeofため、key.size() NO sizeof(key.size())

4

2 に答える 2

3

C++ では生の配列を返すことはできません (また、それらを関数の引数として値で渡すこともできません)。代わりに、次を使用しますstd::vector<byte>

std::vector<byte> key(AES::MAX_KEYLENGTH);
prng.GenerateBlock(key.data(), key.size());
return key;

それに応じて関数の戻り値の型を変更する必要があります。key.data()またはを使用&key[0]して、基になるデータ配列へのポインターを取得します。

于 2011-10-31T13:24:01.460 に答える
2
  • 警告の理由: ローカル配列へのポインターを返しています。関数の終了後にローカル変数が削除されるため、間違っています。

  • エラーの理由: コンパイラは値を返すことを期待してbyteいましたが、ポインターを返しています。

これを試して:

void AESBest::gen_key(byte *key, int size)
{
  AutoSeededRandomPool prng;
  prng.GenerateBlock(key, size);
}

以下のように呼び出します。

byte key[AES::MAX_KEYLENGTH];
gen_key(key, AES::MAX_KEYLENGTH);
于 2011-10-31T13:25:07.603 に答える