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

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

当前,我一开始使用PRNG生成一个随 secret 钥,但是当我尝试使用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;
}

最佳答案



听起来好像您正在尝试将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填充该块。如果 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/

10-09 06:23