我正在使用 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,如果是,该怎么做?