gpt4 book ai didi

c++ - 将空 vector 聚合或池化为最大的空 vector ?

转载 作者:太空宇宙 更新时间:2023-11-04 13:26:55 24 4
gpt4 key购买 nike

我有一个仅包含 C++ header 的模板类,它使用空 vector (0 的字符串)。字符串的长度由模板参数决定(它是一个 HKDF 实现,长度取决于底层哈希摘要的大小)。

template < class HASH >
class HKDF
{
...
private:
typedef byte NullVector[HASH::DIGESTSIZE];
static const NullVector m_vec;
};

可以聚合各种NullVector,所有实例化的类都可以使用最大摘要大小的NullVector。例如,MD5 的摘要大小为 16 字节,而 SHA-512 的摘要大小为 64 字节。因此工具链可以生成一个 64 字节的 vector ,然后所有类,如 MD5、SHA-1、Whirlpool 和 SHA-512 都可以使用它。

这类似于字符串池,但我不希望编译器或链接器进行这种观察或看到这种模式(但我可能是错的)。所以我想给工具一个提示。

是否可以告诉编译器或链接器聚合或池化 NullVectors,并且只输出最终二进制文件中最大的?如果是,怎么办?

我经常使用 MSVC、GCC、ICC 和 Clang。我对为 GCC 兼容的编译器做这件事特别感兴趣,因为它涵盖了大多数用例。因此,如果需要,我很乐意使用特定于 GCC 的扩展。


这里有一些更多的背景故事...迭代哈希,如 MD5、SHA1 到 SHA512 和 Whirlpool 具有固定的 block 大小。对于这些散列,共享一个 64 字节的 0 数组应该没问题。我从未见过 block 大小大于 64 字节的迭代哈希,但我需要注意这一点。

递归哈希,如 SHA-3,本身 没有 block 大小。我什至不确定如何让经典的 HMAC 和 HKDF 为 SHA3 和其他递归哈希工作。

不过,您可以使用迭代和递归哈希来做同样的事情。您显然可以消化消息。但作为一个更复杂的示例,由于扩展攻击,HMAC 必须将 ipadopad 添加到迭代哈希中,但您可以生成键控摘要或 auth 标签。对于递归哈希,您只需将 key 与消息连接起来即可生成 key 摘要或身份验证标签。不需要带有递归哈希的内部或外部填充。

最佳答案

这是一个可能的解决方案,可以让您更接近,但您仍然必须决定最大尺寸应该是多少:

编辑:由于 c++03 标签而更新。以前的代码需要 c++11。

#include <cassert>
#include <cstdlib>

struct NullContainer
{
static const size_t LARGEST_SIZE = 1024 ;
typedef unsigned char LargeNullVector[LARGEST_SIZE] ;
static const LargeNullVector m_vec ;
} ;

const NullContainer::LargeNullVector NullContainer::m_vec = {0} ;

template < class HASH >
class HKDF : public NullContainer
{
} ;

int main()
{
assert( &HKDF<int>::m_vec == &HKDF<char>::m_vec ) ;
return 0;
}

当然,你可能想使用private inheritance在这种情况下。

关于c++ - 将空 vector 聚合或池化为最大的空 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33002122/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com