【问题标题】:Identifier "unlock" is undefined标识符“解锁”未定义
【发布时间】:2015-06-22 18:34:40
【问题描述】:

在此示例代码中

http://botan.randombit.net/manual/fpe.html

我尝试在 Visual C++ 托管包装器中使用一种方法,但在“解锁”时不断出现编译错误 这是什么? (可能是 mutex::unlock)我该如何解决这个错误?

std::vector<byte> sha1(const std::string& acct_name)
   {
   SHA_160 hash;
   hash.update(acct_name);
   return unlock(hash.final());
   }

错误 16 错误 C3861:“解锁”:找不到标识符

编辑:我的 Stdafx.h 文件现在看起来像这样,但它仍然没有编译(即使在包含 secmem.h 之后)

#pragma once

#include <botan/botan.h>
#include <botan/fpe_fe1.h>
#include <botan/sha160.h>
#include <botan/secmem.h>
#include <stdexcept>
#include <vector>

编辑:附加信息 - 我使用的 Botan 库版本是 1.10.9 版(最新稳定版)。我使用 python 脚本编译并且在调试模式下没有排除任何模块(用所有东西构建它)。

【问题讨论】:

  • 看起来 unlocksecure_vector 转换为 std::vector。在线文档说明该方法在secman.h 声明。
  • @wendelbsilva 在包含您提到的标题后仍然没有运气。
  • 包含后是否仍然出现相同的错误?如果是,您是否介意添加您正在使用的 Botan 库版本。
  • 顺便说一句,我刚刚注意到SHA_160 类有另一个final 方法,您可以在其中将vector&lt;byte&gt; 作为参数传递以获取输出。使用此方法,您将不需要unlock 函数。
  • 尝试重新构建您的解决方案,有时更改预编译的头文件并重新编译当前源文件不会获得更改

标签: c++ visual-c++ botan


【解决方案1】:

我刚查了一下,看起来像 Botan v. 1.10.9 没有 unlock。你有两个选择。

1.10.9 版本还有另一个final 方法,您可以在其中传递byte 的向量作为参考以获取返回值。

类似:

byte out[hash.output_length()];
hash.final(out);

另一种选择是将SecureVector 转换为std::vector

SecureVector<byte> temp = hash.final();
std::vector<byte> ret(temp.begin(), temp.end());

根据我的申请,我会选择其中一个。

.

以防万一有人提出这个问题并使用 Botan 1.11。

SecureVector 转换为std::vector 的方法unlock 在标题secman.h 中。 此外,SHA_160 类还有另一个final 方法,您可以在其中将std::vector&lt;byte&gt; 作为参数传递以获取输出。使用此方法,您将不需要解锁功能。

【讨论】:

  • 谢谢。任何想法为什么在他们的示例中(上面的原始墨水到 FPE 示例)他们将此 sha1 方法的结果传递给 SymmetricKey。结果是 std::vector 类型,但我没有看到 SymmetricKey 的构造函数采用该类型的参数。
  • 1.10.9 的 SymmetricKey 构造函数不接受 std::vector。虽然,它接受一个字节数组(解决方案的第一个选项)。他们为什么转换?我不知道,但我假设他们想在只接受 SymmetricKey 作为参数的函数中使用 key。这是我的猜测。
  • 好的,既然我想传递结果来创建一个 SymmetricKey,那么我将使用你的第一个解决方案。然而 Intellisense 强调了这一行的哈希值 byte out[hash.output_length()];因为它说表达式必须有一个常量值。
  • 在c++中,数组声明中的变量需要在编译时保持不变。这意味着byte out[size] 将不起作用(sry)。您可以使用new 手动分配所需的大小(但这很糟糕)。或者,如果您使用的是 c++ 11,您可以创建一个向量 std::vector&lt;byte&gt; out(hash.output_length()) 并在最终函数中使用它,例如:hash.final(out.data);
  • 这个 sha1 方法现在对我有用,但我不知道如何将结果传递给 SymmetricKey。他们发布的示例不起作用。如果您有任何想法,请告诉我。我上周在 Botan 的邮件列表中发帖,但还没有回复。
【解决方案2】:

教程使用这个

using namespace Botan;

可能是命名空间问题。要么将 Botan 命名空间声明为“使用”,要么使用 Botan::unlock 而不是解锁。

我推荐第二个,即使它看起来更长。值得!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多