【问题标题】:String to SecByteBlock Conversion Issues字符串到 SecByteBlock 的转换问题
【发布时间】:2016-03-18 10:16:36
【问题描述】:

我在为 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;
}

【问题讨论】:

  • newkey 的类型和生命周期是什么? - 你没有在上面的代码中声明它。为什么你认为这不起作用?
  • 什么是“SecByteBlock”?什么是“新钥匙”?缺少太多细节。
  • newKey 是 GENERATOR 对象中的私有 SecBlockByte。我不知道你说的一生是什么意思?它似乎不起作用,因为在 DES_EDE3 的相同输入上,当密钥被假​​定更改时,输出保持不变。我相信 SecBlockByte 是 Crypto++ 中定义的变量类型?

标签: c++ cryptography crypto++


【解决方案1】:

我尝试使用 DES_EDE3 的字符串输出更改密钥,它似乎使用相同的密钥

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

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


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)));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 2019-05-12
    • 1970-01-01
    相关资源
    最近更新 更多