-1

我正在使用 wincrypt 使用 AES 加密服务器端的数据。我想解密来自客户端服务器的数据。我知道 AES 使用 IV 来增加随机化。在 python 中,我们可以指定 IV,因此在其他应用程序中加密和解密数据不是问题,因为我们有能力创建相同的 IV 和密钥。我没有找到太多关于这个主题以及在 wincrypt 中指定 IV 的方法,因此,它使得在其他应用程序中解密某些内容变得更加困难。以下是服务器相关功能:

DWORD SomeObj::AcquireContextAndDeriveKey() {
    if (CryptAcquireContext(&this->hCryptProv, NULL, NULL/*Default*/, 
PROV_RSA_AES, CRYPT_VERIFYCONTEXT))
    {
        HCRYPTHASH m_hHashPassword;
        if (CryptCreateHash(this->hCryptProv, CALG_SHA1, 0, 0, 
&m_hHashPassword))
        {
            // Hash for the password. 
            string password = "123456"; // just for this sample
            char hash[255] = { 0 };
            DWORD lenhash = sizeof(hash);
            if (CryptHashData(m_hHashPassword, (BYTE *)password.c_str(), 
(DWORD)strlen(password.c_str()), 0))
            {
                // Session key from the hash
                if (CryptDeriveKey(this->hCryptProv, CALG_AES_256, 
m_hHashPassword, CRYPT_CREATE_SALT, &this->hKey))
                {
                    return ERROR_SUCCESS;
                }
            }
        }
        CleanUp();
    }
    return SERVER_ERROR;
}


DWORD SomeObj::Encrypt(string * To_Enc) {
    DWORD text_len = (To_Enc->length());
    vector<string::value_type> TempBuff(128, 0);
    unsigned nIndex = 0;
    for (auto it = To_Enc->cbegin(); it != To_Enc->cend(); ++it)
    {
        TempBuff[nIndex++] = *it;
    }
    if (!CryptEncrypt(this->hKey,
        NULL,  // hHash = no hash
        1,  // Final
        0,     // dwFlags
        reinterpret_cast<PBYTE>(&TempBuff[0]), //*pbData
        &text_len,  //*pdwDataLen
        TempBuff.size())) {   //dwBufLen
            return SERVER_ERROR;
        }
    To_Enc->assign(&TempBuff[0], text_len);
    return SERVER_SUCCESS;
}

我的问题是,如何在服务器中加密数据,在客户端解密,是否有必要为该目标指定 IV,如果是,该怎么做?

4

1 回答 1

1

处理 IV 的一般方法是在加密数据前加上它的前缀,IV 不需要保密。这样,接收者将拥有正确的 iv。

请为 IV 使用加密安全的伪随机数生成器 (CSPRNG)。

注意:从密码导出加密密钥时,请使用密钥导出函数,例如 PBKDF2、Rfc2898DeriveBytes、Argon2 或 CPU 利用率约为 100 毫秒的类似函数。关键是让攻击者花费大量时间通过蛮力寻找密码。

于 2018-03-21T16:03:53.097 回答