- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想用 C# 编写一个可以打开 KeePass 的程序1.x kdb 文件。我下载了源代码并尝试移植密码数据库读取功能。数据库内容已加密。加密 key 通过以下方式获得:
我卡在了第 3 步。KeePass 使用 CNG对于 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);
}
因此,据我所知,它使用具有 ECB 链接模式的 AES 算法,并将 NULL
和 0
作为 BCryptEncrypt 的第 5 个和第 6 个参数传递。函数意味着它不会使用初始化 vector 。
现在,我如何在 C# 中执行相同的操作?我编写了以下函数来进行一轮转换(基于 MSDN 示例):
public static byte[] KeyTransform(byte[] buffer, byte[] key)
{
Aes aes = Aes.Create();
aes.Key = key;
aes.BlockSize = 128;
aes.KeySize = key.Length * 8;
aes.Mode = CipherMode.ECB;
//aes.IV = new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
ICryptoTransform ct = aes.CreateEncryptor();
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, ct, CryptoStreamMode.Write))
{
using (BinaryWriter bw = new BinaryWriter(cs))
{
bw.Write(buffer);
}
cs.Flush();
}
return ms.ToArray();
}
}
然后我在原始代码和我的代码中应用一轮 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 个字节,它会产生我需要的东西。
关于c# - CNG AES -> C# AES,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18679696/
我正在编写一个供我正在从事的项目内部使用的小型库,我是一名业余 Javascript 开发人员,所以请注意我的错误。 我写了一个小的 html 文件以及下面的 javascript,
我试图弄清楚 ECDiffieHellman 在 .Net 下是如何工作的。 我想知道,为什么 ECDiffieHellman 有两个看起来非常相似的实现。 Cng 代表 Cryptography N
我想用 C# 编写一个可以打开 KeePass 的程序1.x kdb 文件。我下载了源代码并尝试移植密码数据库读取功能。数据库内容已加密。加密 key 通过以下方式获得: 用户输入密码; 计算密码的
我有一组用于对称加密/解密的预定义明文 key 。这些 key 用于与连接到 PC 的硬件设备进行加密通信。我想使用 CNG key 存储提供程序来安全地存储这些 key 。加密和解密必须在 CNG
我正在尝试围绕 CNG 的 AES 实现 AES-OFB 包装器以进行对称加密。 我遇到了一个我无法理解的问题...我创建了一个 AES 算法句柄 (BCRYPT_AES_ALGORITHM) 并导入
我有兴趣尝试从数字签名中读取字段。我有调用 CryptQueryObject 的代码,然后是 CryptMsgGetParam 来获取一些字段,最后是 CertFindCertificateInSto
我正在使用 Microsoft CNG Cryptography API 并尝试创建自签名证书。 我们有使用 CertCreateSelfSignCertificate 的现有代码方法,结合NCryp
我是 CNG 新手。我正在玩 msdn 站点的基本程序。我修改了输入纯字符串并使用提供 aes cbc 加密输出的其他网站测试了输出。不幸的是只有上半场匹配,下半场不匹配。如果有人能指出错误所在,那就
我想导入一个使用 CngKey.Export(CngKeyBlobFormat.EccPrivateBlob) 导出的 key ,为 key 命名,并将其保存在 keystore 中。这应该很简单,但
多年来,我一直在尝试寻找如何通过任何方式从文件中导入 ECC key 。我曾尝试从 Windows 证书存储、.p12 文件和 PKCS#8 OpenSSL key 文件访问 ECC 证书,但均未成功
所以我想知道哈希算法的各种实现之间是否存在重大差异,以SHA系列算法为例。它们每个都有 3 个实现,1 个在托管代码中,2 个围绕不同的 native 加密 API 进行包装,但是使用它们之间有什么主
我使用以下 CNG API 序列成功生成了 RSA key : BCryptOpenAlgorithmProvider(.., BCRYPT_RSA_ALGORITHM, ...); BCryptGe
将现有的框架应用程序移植到核心,我们早已将 System.Security.Cryptography.SHA256 和 System.Security.Cryptography.SHA256Manag
我想在 Windows 上运行的 C++ 应用程序中实现数据加密和解密。我花了相当多的时间在网上浏览,我想我可能应该使用 Windows Cryptography API: Next Generati
我正在使用 Crypto API 的 CryptAcquireContext 函数 ( https://docs.microsoft.com/en-us/windows/desktop/api/Win
https://learn.microsoft.com/en-us/sql/relational-databases/security/encryption/extensible-key-manage
我需要使用 Windows 的 Cryptography API: Next Generation 验证消息的签名.我有消息、它的签名和 PEM 格式的公钥,以及展示所需行为的原型(prototype
我需要使用 Windows 加密 API 方法验证签名的 JAR 文件。我对加密和签名问题只有基本的了解。我也不熟悉那些加密 API(WinCrypt、Bcrypt、Ncrypt)。验证文件哈希不是问
我需要使用 Windows 的 Cryptography API: Next Generation 验证消息的签名.我有消息、它的签名和 PEM 格式的公钥,以及展示所需行为的原型(prototype
我需要使用 Windows 加密 API 方法验证签名的 JAR 文件。我对加密和签名问题只有基本的了解。我也不熟悉那些加密 API(WinCrypt、Bcrypt、Ncrypt)。验证文件哈希不是问
我是一名优秀的程序员,十分优秀!