【问题标题】:How can I return a byte value in Crypto++?如何在 Crypto++ 中返回字节值?
【发布时间】:2011-10-31 13:20:11
【问题描述】:

我正在使用 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 时,会显示似乎返回的警告。 但是最后返回键的时候,出现了一个奇怪的无效转换错误。

为什么会这样?

我该如何解决这个问题?


编辑:嗯。现在我有这两个功能。但是第一个效果很好,返回了 aes 键的 64 个字符。 (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;
}

第二个的bug在哪里?

编辑:没关系!错误在sizeof,所以 key.size() NO sizeof(key.size())

【问题讨论】:

  • 您需要a good C++ book。而且您非常迫切地需要它。
  • 你需要更好地阅读我的问题并了解 Crypto++,因为类型字节是这个库的原生类型。
  • @user840718 : 我没有直接看到任何理由假设@sbi 的意思是暗示他的言论与任何特定关键字的出现有关(比如,也许,byte
  • @user840718:我已阅读您的问题。您尝试返回一个局部变量,该变量是一个数组,其中函数被定义为返回一个字节,您以错误的方式键入了两个编译器消息之一,并且您无法解释这些消息,尽管事实上两者都很明显说出问题所在。在我教 C++ 时,我看到很多学生犯了这样的小错误。这与 Crypto++ 无关,只是您似乎对 C++ 了解不够,无法正确使用此 API。因此我的评论。
  • 好吧,我应该说不好。谢谢。

标签: c++ return aes crypto++


【解决方案1】:

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

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

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

【讨论】:

  • 好的,但是我需要按键对字符串进行编码和解码。我需要使用 e.SetKey(key, sizeof(key));为此,我需要该密钥必须是一个字节。有可能吗?
  • 你错了;你需要key 成为byte指针。正如我刚才所说,说SetKey(key.data(), key.size()) 来获取数据指针和数组大小。
  • 我已经编辑了关于您的代码的问题。你能快速看一下吗?谢谢。
  • 不是sizeof(key.size())。只需key.size()。请真的拿起一本好书——之后你会觉得它更强大!
【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 2023-03-17
    • 2012-04-04
    相关资源
    最近更新 更多