字符串到 SecByteBlock 的转换问题

String to SecByteBlock Conversion Issues

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

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

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

我认为问题出在字符串和 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。它专为这些类型的 expand-then 提取操作而设计。

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 sizes the memory block to DES_EDE3::KEYLENGTH and backfills the block with 0's as needed. 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)));