如何在Crypto++中返回字节值

How can I return a byte value in Crypto++?

本文关键字:返回 字节 Crypto++      更新时间:2023-10-16

我使用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个函数。但是第一个操作很好,返回aes密钥的64个字符。(所有(

第二个-我不知道为什么-只返回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((NO sizeof(key.size((

您不能在C++中返回原始数组(也不能按值将它们作为函数参数传递(。相反,使用std::vector<byte>:

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

您必须相应地修改函数返回类型。使用key.data()&key[0]获取指向底层数据数组的指针。

  • 警告原因:您正在返回一个指向本地数组的指针。它是错误,因为本地变量将在退出后删除作用

  • 错误原因:编译器希望您返回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);