问题标签 [wincrypt]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
663 浏览

c++ - 具有支持内存存储和证书信任列表的 CertGetCertificateChain

我需要在证书链验证期间将自定义自签名根证书标记为受信任,总的来说,我希望尽可能地依赖系统 API。

我创建了一个临时内存存储。

然后我将自定义根证书放入存储中。

CertGetCertificateChain MSDN 文档说

hAdditionalStore 用于搜索支持证书和证书信任列表 (CTL) 的任何附加存储的句柄。

据我了解,如果我使用根证书创建 CTL 并将其放入商店,CertGetCertificateChain 将信任它。因此,我在分配的缓冲区中创建根证书 CTL 条目,然后将其复制到std::vector ctlEntries

然后我创建 CTL 本身。

上面的所有 API 调用都成功完成,但是当我调用 CertGetCertificateChain 时,它仍然在 TrustStatus.dwErrorStatus 中返回 CERT_TRUST_IS_UNTRUSTED_ROOT。

潜在的解决方法

如果我收到 CERT_TRUST_IS_UNTRUSTED_ROOT 错误,我只需从证书存储中提取 CTL 并检查结果链中的根(由 CertGetCertificateChain 返回)是否在 CTL 中。它有效,但对我来说仍然不能完全接受。我想依靠 CertGetCertificateChain。


解决方案有什么问题?我必须使用哪些特定的证书信任列表 OID?在这种情况下,对根证书是否有任何要求(如特定扩展)?

ps 测试证书是使用此指令创建的https://gist.github.com/fntlnz/cf14feb5a46b2eda428e000157447309

更新日期:2020-01-31

CertModifyCertificatesToTrust 没有帮助。它成功完成,但仍报告该链具有不受信任的根。可能,问题出在不同的领域。

}

0 投票
0 回答
140 浏览

c++ - 使用 AES 加密数据包

我正在尝试加密我通过 Winsock 发送的缓冲区。除了绝对基础知识之外,我对加密一无所知,我使用了 Windows 的 WinCrypt 库,因为它似乎是我可以实现的最基本和最简单的库,但是,我似乎无法让我的代码工作。

第一次尝试加密后文本为空白(可能是因为 Crypt 函数失败),最后一个错误是加密后的 ERROR_MORE_DATA 和解密尝试后的 NTE_BAD_DATA。

我根本无法在网上获得有关这些错误的太多信息,它们对我来说也很新。

ERROR_MORE_DATA 的 MSDN 描述说“有更多数据可用”,并且在 CryptEncrypt 的 MSDN 页面上(这是抛出它的函数)它说我给它的缓冲区不足以容纳所有加密数据,所以我假设,与我的想法相反,加密以某种方式延长了字符串,但我需要在我的代码结构中给出一个设定的大小(至少在我目前的思考过程中),那么我能做些什么呢?

谢谢!

我写了以下代码供大家测试:

0 投票
1 回答
172 浏览

python - 在python中解码windows证书序列号

我正在尝试解码 X.509 证书的序列号,我用 Python 中的 win32crypt 打开(http://timgolden.me.uk/pywin32-docs/PyCERT_CONTEXT.html

内存中的表示如下:

序列号 = b'\x07\x00\x00\x00\x00\x00\xc3o\x0c\xfbK\xf8\xdf\xbe\x07\x00\x00\x00*'

在此处输入图像描述

我只是想不通,使用什么样的编码以及如何解码?!

编辑:(..正确序列号的字节:2a00000007bedff84bfb0c6fc3000000000007)

0 投票
1 回答
135 浏览

c++ - 如何指向/访问证书文件`CertCreateCertificateContext`函数?(wincrypt api)

Windows 编程/C++ 有点新。我正在尝试将 .p7b 根证书文件安装到受信任的根证书存储中。我想使用 Windows Wincrypt 库。具体来说,这些是我从旧论坛获得的建议步骤:

  1. 使用您的证书内容字节调用CertCreateCertificateContext以获得PCCERT_CONTEXT
  2. 调用CertOpenSystemStore设置szSubsystemProtocol为“ROOT”以获得HCERTSTORE
  3. CertAddCertificateContextToStore使用上述HCERTSTORE和 调用PCCERT_CONTEXT

[这里是] CertCreateCertificateContext的 api 文档。不知道如何只指向pbCertEncoded我的实际证书文件。我应该把它指向路径吗?我必须加载证书吗?类型应该是什么?

0 投票
2 回答
586 浏览

c++ - 如何使用 wincrypt.h 在 c++ 中检查 x509 证书的吊销状态?

我正在尝试使用 wincrypt.h 检查 C++ 程序中 X509 证书的吊销状态。可悲的是,我无法找到一个全面的例子。在 c# 中,代码如下:

0 投票
0 回答
256 浏览

c - 如何使用 CryptEncrypt 和 CryptDecrypt?

在我的 C 应用程序中,我使用带有密钥的 CryptEncrypt,该密钥是从借助 CreateHash、DeriveKey 等从文件中读取的字符串中获取的。

我试图用相同的功能解密:

CryptDecrypt 在 getLastError() 中返回 2,148,073,477 错误数据。我该如何解决所有这些问题?

0 投票
1 回答
606 浏览

python - 如何使用 python 将证书安装到受信任的根证书?

我需要编写一个 python 代码,将证书安装到我的机器(windows)或本地用户的受信任根证书中。我尝试了下面的代码。代码运行没有错误,但看起来商店不是 Windows 受信任的根。我还阅读了wincertwin32crypt python 模块的文档,似乎没有任何作用。

编辑:我需要做类似这里提到的事情,但使用 python。

编辑2:我也尝试了以下方法(不确定它是否会完成预期的工作):

但我收到以下错误:

0 投票
1 回答
90 浏览

java - WinCrypt RSA 与 Java org.bouncycastle

所以这里有一个问题。我在 Windows 系统上有一个旧代码,它只需要一个短字符串并使用公共 RSA 密钥对其进行 CryptEncrypt。最小的工作示例在这里(避免任何检查以使其更短。避免释放)

该代码有效并返回一个 base64 编码的字符串。喜欢lTq01sOcgDcgwtDaFFoHH/Qb6xLw0KU+/n/+3t0eEb8l4N69QGcaEWf1qso3a4qn7Y8StlXcfMe8uspNF/KDj6qQOMvCuM+uUl+tkLd5NXiESsjycgjyxAqdCIO71iTSmsYVcsS3fY/gtIbO4UAFnCRPOXoSyqWqpXW7IRtFzL2N3MxgIBlIMErNvNWs5HPA7xAY/XO6UpSMWsQO4ppccdeNLSZDPwOxohKD/BX5oDin81nFn7fvIZgghfH5knF1nezK8IGKl+vtbgrwlUUULp/wJ4POceyIn0HaZoVsaCu6xFJcUJGfBqSvm4GZqkp2MlGxBODku0OSgEfIDEGMTg==

然后我必须在运行 java 的另一端用私钥解密这个字符串。我使用 bouncycastle:

这段代码向我展示了下一个错误:

而且我相信我在 Windows 端遗漏了一些东西,因为如果我在 Java 端使用相同的密钥并使用相同的公钥加密相同的数据,解密将按预期工作。

这里的密钥,我用 openssl 为这个问题(RSA 2048)生成:
私人:

上市

我错了什么?

0 投票
0 回答
854 浏览

c# - 使用 ProtectedData.Unprotect() 函数的 C# 错误

我在 C# 中试验ProtectData.Protect()和函数。ProtectData.Unprotect()我编写了一个程序,将加密数据写入 SQLite 数据库,然后读取数据库并解密数据。每次我运行我的代码时,我都会收到以下错误:

完整的代码很长,但这里是decrypt()函数。我正在传递一个字节数组;我已使用 验证该类型为字节数组myByteData.GetType(),它返回System.Byte[].

0 投票
1 回答
299 浏览

php - 为什么 Windows CryptVerifySignature 在 PHP 创建的签名上失败?

我想在 PHP 中创建一个哈希并在 Linux 服务器上对其进行签名(在 Windows 上使用 XAMPP 进行测试),然后使用公钥在 Windows 上验证哈希。我有以下 PHP 脚本来生成它(然后我右键单击,查看源代码,将签名创建复制/粘贴到 C/C++ Windows 应用程序)。当我运行 Windows 应用程序时,SHA256 哈希与 PHP 中创建的哈希匹配,但验证失败。我尝试不在 Windows 中对签名进行字节交换,但同样的问题。我究竟做错了什么?

这是PHP代码:

这是 Windows C/C++ 代码: