Как я могу вернуть значение байта в Crypto ++? - PullRequest
1 голос
/ 31 октября 2011

Я использую 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] eclipse покажи мне предупреждение, которое, похоже, вернулось.Но когда в конце возвращается ключ, возникает странная ошибка о недопустимом преобразовании.

Почему так происходит?

Как я могу решить эту проблему?


РЕДАКТИРОВАТЬ : Хорошо.Теперь у меня есть эти 2 функции.Но первый работает хорошо, возвращая 64 символа ключа aes.(gen_all)

Второй - я не знаю, почему - верните только 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;
}

Где ошибка во втором?

РЕДАКТИРОВАТЬ: не важно!Ошибка была в sizeof, поэтому key.size () НЕТ sizeof (key.size ())

Ответы [ 2 ]

3 голосов
/ 31 октября 2011

Вы не можете возвращать необработанные массивы в C ++ (и вы не можете передавать их как аргументы функции по значению).Вместо этого используйте std::vector<byte>:

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

Вам нужно будет соответственно изменить тип возвращаемого значения функции.Используйте key.data() или &key[0], чтобы получить указатель на базовый массив данных.

2 голосов
/ 31 октября 2011
  • Причина предупреждения: вы возвращаете указатель на локальный массив.Это неправильно, потому что локальная переменная будет удалена после выхода из функции.

  • Причина ошибки: Компилятор ожидал, что вы вернете значение 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);
...