在窗口中将 AES CBC 与 NCrypt 一起使用
Use AES CBC with NCrypt in windows
我正在尝试使用 NCrypt.dll 来加密一些数据,C++,我在处理密钥和算法时遇到问题。
我想将 AES 与 CBC 链接方法一起使用,但无法让 NCryptEncrypt 函数工作(我一直抛出无效的缓冲区大小)。
我已经使用 NCRYPT_AES_ALGORITHM 标志创建并存储了一个密钥(在密钥存储提供程序中),但不知道如何将算法设置为使用 CBC 方法。
secSt = NCryptCreatePersistedKey(phProvider, &keyHndl, NCRYPT_AES_ALGORITHM, keyname, 0, 0);
我已经尝试了一些属性设置但没有成功,所以我想知道这是否可能与 NCrypt 一起使用?
我知道 Bcrypt 加密功能允许这样做,并试图将我的NCRYPT_KEY_HANDLE转换为BCRYPT_KEY_HANDLE但没有成功(所以我认为这是不可能的)。
您可以使用NCryptSetProperty
和 BCrypt 常量BCRYPT_CHAIN_MODE_CBC
来应用链接模式 CBC。
请注意,NCryptEncrypt
似乎不支持对称密钥的填充(请参阅 NCryptEncrypt 中的参数dwFlags
说明)。所以我不得不应用一些穷人的明文填充来获得 16 字节的倍数。如果没有填充,我还得到状态代码0xc0000206 (STATUS_INVALID_BUFFER_SIZE)。
// Clear text for testing
static const char* clearText = "The quick brown fox jumps over the lazy dog. 1234567890. ";
static const int clearTextLen = 64;
int main()
{
LPCWSTR keyName = L"NCryptTest";
SECURITY_STATUS status;
NCRYPT_PROV_HANDLE hProvider;
NCRYPT_KEY_HANDLE hKey;
// Open storage provider
status = NCryptOpenStorageProvider(&hProvider, NULL, 0);
// Get stored key
status = NCryptOpenKey(hProvider, &hKey, keyName, 0, 0);
if (status == NTE_BAD_KEYSET)
{
// Create key if it doesn't exist
status = NCryptCreatePersistedKey(hProvider, &hKey, BCRYPT_AES_ALGORITHM, keyName, 0, 0);
status = NCryptFinalizeKey(hKey, 0);
}
// Set the chaining mode CBC
LPCWSTR chainMode = BCRYPT_CHAIN_MODE_CBC;
status = NCryptSetProperty(hKey, NCRYPT_CHAINING_MODE_PROPERTY, (PBYTE)chainMode, wcslen(chainMode) * 2 + 2, 0);
// Encrypt the text
DWORD outlen = -1;
unsigned char* cipherData = new unsigned char[clearTextLen];
status = NCryptEncrypt(hKey, (PBYTE)clearText, clearTextLen, NULL, cipherData, clearTextLen, &outlen, 0);
// Cleanup
delete[] cipherData;
NCryptFreeObject(hKey);
NCryptFreeObject(hProvider);
return 0;
}
相关文章:
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将C++中的库和头与MinGW一起使用
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 为什么我不能将 rand() 与数组的大小一起使用?
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 将fold表达式与std::一起用于两个元组
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 将 std::allocate_shared 与多态资源分配器一起使用
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 将 exprtk 与自定义类的对象一起使用
- 将 std::set 与基于键的比较器一起使用
- 将 C++ 类与 Rcpp 一起使用,从 C 或 R 修改它
- 如何将 Eigen::Ref 与 pybind11 一起使用?
- 如何将AERT_Allocate与 std:vector 一起使用
- 如何使我的 sizeof sum 结构与空参数包一起工作
- 在窗口中将 AES CBC 与 NCrypt 一起使用