C# CNG AES->C AES

C# CNG AES->C AES,c#,c++,aes,C#,C++,Aes,我想用C语言编写一个程序,可以打开1.xKDB文件。我下载了源代码并尝试移植密码数据库读取功能。数据库内容是加密的。通过以下方式获得加密密钥: 用户输入密码; 计算密码的SHA256散列,并将其拆分为两个128,但不包括一半; 使用来自数据库头的密钥对哈希的每一半应用几轮AES; 两半连接在一起; 结果用来自数据库头的盐腌制; 计算步骤4结果的SHA256哈希。这就是加密密钥。 我被困在第三步。KeePass用于AES。简化了一半哈希的源代码,另一半哈希应用了相同的源代码: BCRYPT_ALG

我想用C语言编写一个程序,可以打开1.xKDB文件。我下载了源代码并尝试移植密码数据库读取功能。数据库内容是加密的。通过以下方式获得加密密钥:

用户输入密码; 计算密码的SHA256散列,并将其拆分为两个128,但不包括一半; 使用来自数据库头的密钥对哈希的每一半应用几轮AES; 两半连接在一起; 结果用来自数据库头的盐腌制; 计算步骤4结果的SHA256哈希。这就是加密密钥。 我被困在第三步。KeePass用于AES。简化了一半哈希的源代码,另一半哈希应用了相同的源代码:

BCRYPT_ALG_HANDLE hAes = NULL;
BCRYPT_KEY_HANDLE hKey = NULL;
BYTE pbKey32[32] = <encryption key>;
BYTE pbData16[16] = <half of hash from step 2>;

BCryptOpenAlgorithmProvider(&hAes, BCRYPT_AES_ALGORITHM, NULL, 0);

DWORD dwKeyObjLen = 0;
ULONG uResult = 0;
BCryptGetProperty(hAes, BCRYPT_OBJECT_LENGTH, (PUCHAR)&dwKeyObjLen, sizeof(DWORD), &uResult, 0);

BCryptSetProperty(hAes, BCRYPT_CHAINING_MODE, (PUCHAR)BCRYPT_CHAIN_MODE_ECB, static_cast<ULONG>((wcslen(BCRYPT_CHAIN_MODE_ECB) + 1) * sizeof(wchar_t)), 0);

BCRYPT_KEY_DATA_BLOB_32 keyBlob;
ZeroMemory(&keyBlob, sizeof(BCRYPT_KEY_DATA_BLOB_32));
keyBlob.dwMagic = BCRYPT_KEY_DATA_BLOB_MAGIC;
keyBlob.dwVersion = BCRYPT_KEY_DATA_BLOB_VERSION1;
keyBlob.cbKeyData = 32;
memcpy(keyBlob.pbData, pbKey32, 32);
pKeyObj = new UCHAR[dwKeyObjLen];

BCryptImportKey(hAes, NULL, BCRYPT_KEY_DATA_BLOB, &hKey, pKeyObj.get(), dwKeyObjLen, (PUCHAR)&keyBlob, sizeof(BCRYPT_KEY_DATA_BLOB_32), 0);

for (int i = 0; i < rounds; ++i)
{
    BCryptEncrypt(hKey, pbData16, 16, NULL, NULL, 0, pbData16, 16, &uResult, 0);
}
然后,在原始代码和我的代码中应用一轮AES后,比较缓冲区。我的代码产生与原始代码不同的结果。我怎么修理它


顺便说一下,无论我是否指定了IV,我的代码每次都会产生不同的结果,所以我相信IV总是被生成和使用的。如果我试图将aes.IV设置为null,它会抛出异常,表示我无法将其设置为null。

初始化ICryptoTransform时,似乎如下所示:

ICryptoTransform ct = aes.CreateEncryptor(key, new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 });
这就是诀窍。 唯一让我担心的是产生的内存流是32字节而不是16字节。但如果我放弃最后16个,它就会产生我所需要的

ICryptoTransform ct = aes.CreateEncryptor(key, new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 });