c++ - 字符串到 SecByteBlock 的转换问题

标签 c++ cryptography crypto++

我在为 crypto++ 中的 3 key 三重 DES 分配新 key 时遇到问题。

我已经生成了一个字符串形式的新 key ,但需要将其分配给 SecByteBlock 以便在 Crypto++ 中使用。

目前我在开始时使用 PRNG 生成一个随 secret 钥,但是当我尝试使用 DES_EDE3 输出的字符串更改 key 时,它似乎使用相同的 key 。

我认为问题在于字符串和 SecByteBlock 之间的转换,或者分配给 SecByteBlock,如下所示。

如有任何帮助,我们将不胜感激!

SecByteBlock GENERATOR::setKey(string keyString){

    SecByteBlock replacementKey(24);

    replacementKey= SecByteBlock(reinterpret_cast<const byte*>(keyString.data()), keyString.size());
    return newKey = replacementKey;
}

最佳答案

I attempt to change the key using string output from DES_EDE3, it appears to use the same key

听起来您几乎像是在尝试将 3-DES 用作使用密码键入的 PRF。如果是这样,请使用 HKDF .它专为这些类型的先扩展后提取操作而设计。

HKDF 在 Crypto++ 5.6.3 及更高版本中可用。如果下层客户端需要它,请将 header 复制到您需要的位置。


SecByteBlock GENERATOR::setKey(string keyString){

    SecByteBlock replacementKey(24);

    replacementKey= SecByteBlock(reinterpret_cast<const byte*>(keyString.data()), keyString.size());
    return newKey = replacementKey;
}

尽管您将 replacementKey 的大小设置为 24,但它可以通过赋值 replacementKey= SecByteBlock(...) 调整大小。

您可能想尝试以下方法:

SecByteBlock GENERATOR::setKey(const string& keyString)
{    
    SecByteBlock key((const byte*)keyString.data(), keyString.size());

    if(key,size() < DES_EDE3::KEYLENGTH)
        key.CleanGrow(DES_EDE3::KEYLENGTH);
    else
        key.resize(DES_EDE3::KEYLENGTH);

    return key;
}

CleanGrow将内存块的大小设置为 DES_EDE3::KEYLENGTH 并根据需要用 0 回填该 block 。 resize如果它太大,将截断为 DES_EDE3::KEYLENGTH

你也可以这样做:

SecByteBlock key(DES_EDE3::KEYLENGTH);
size_t s = STDMIN(key.size(), keyString.size());

memcpy(key.data(), keyString.data(), s);
if(s < DES_EDE3::KEYLENGTH)
    memset(key.data()+s, 0, DES_EDE3::KEYLENGTH-s);

-----

要结合前两者,您可以这样考虑:

SecByteBlock GENERATOR::setKey(const string& keyString)
{
    // Block is unintialized
    SecByteBlock key(DES_EDE3::KEYLENGTH);

    HKDF<SHA256> kdf;
    kdf.Derivekey(key.data(), key.size(), (const byte*)keyString.data(), keyString.size(), NULL, 0);

    return key;
}

-----

您可以使用如下代码输出SecByteBlock:

SecByteBlock b = GENERATOR::setKey(...);
...

cout << "Derived key: "
ArraySource as(b.data(), b.size(), true, new HexEncoder(new FileSink(cout)));
cout << endl;

以下使用 Base64 对其进行编码:

ArraySource as(b.data(), b.size(), true, new Base64Encoder(new FileSink(cout)));

关于c++ - 字符串到 SecByteBlock 的转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34241527/

相关文章:

c++ - 用于移动应用(iOS、Android)的 Crypto++ 库的子集

c++ - 如何在 C++ 中制作一个无需复制即可返回静态或自动存储对象的函数?

c++ - 返回类(class)成员时遇到麻烦

c++ - 用 Arduino 测量频率

c++ - 我可以在 C++ 中使用哪一行代码来禁用节能器?

c++ - std::string 到 SecByteBlock 的转换

java - Bouncy CaSTLe 我无法获得所有证书

algorithm - 我应该使用哪种公钥算法来加密一小部分字节?

java - Java 安全模块 KeyGenerator 线程安全吗?如果不是那么如何解决?

c++ - 如何解决第三方库中的警告 C4505?