问题标签 [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 回答
302 浏览

openssl - RSA SHA512 签名由 Windows CNG(下一代加密)NCryptSignHash 与 openssl RSA_sign 生成的签名不匹配

我们正在尝试使用 CNG 生成 RSA SHA512 签名,我们编写了代码并生成了与 OpenSSL 不匹配的哈希值。

用于签名的私钥是我们使用 OpenSSL 命令生成的 DER 格式,如下所示。

使用以下代码使用 Windows CNG 生成签名:

Windows CNG 生成的签名:

NCryptSignHashSignature : [256][6B1CA169DA91DA0CEC2485E571B3EEA1595A94C3B15CA46DF3348E515E28516E3F7E7D9FBC7BC554D294DA994681301FF786058E453EFAA1B713B6D69C6A9C284289B6605B4FB1FD1F95A03632C2A4303D375DB60B6041F93E1E6BC9A2D4F9E1B46756D5CFE1D2054C602913ED905427B76BD9279E08716F7D1FF91897E08577046B3E9AF34A65C8D80C38FAF055CFFB26F1FB49E03070278B56555673729F80514F3A5BB8382C143EB1FA20F0519FD86435CB9333615378F05F0EE17C6824F0C2CA50A3AA65C4BBDBE50652CB0500A7438ECBBA77B9B6D1BB1BA1A86597CA630B4BD7AA132BC661ED66D8B64A06C96822E0FE87080AFDF2FB00CB79583AD95D]

使用以下代码通过 Openssl 生成签名:

Signature with OpenSSL: 045F86E2D7AFE8001A42A1B113F60F7B96513DB829034DF6BAA27D5E7A13AF52896FBD4DE870D0C3F6734AE8AB061BA6959500BF1473F8726E0CB2819A3FC14318AE3CEFED15AA43C82339290A88EBAE363507FE835A02110D5CE8ABF9594F9195AA8033DCD78C10AA589C9BC523A138655E8485C87A8AB4FAE77ED5DA4268C1BC373A9B1C88572AEB3FD020BBF891FAFE223F3DE5FF89E56B7A916663D76303FAD7C69F2014ACF0FB6418305426FB6CAFF6C332126DF138D7FF9220B0B384BD3A053AA123A521D0AACC5D474AD2A2D06416F38647BC0B4F6AE25AA7BBAC3F7DF6BAFFB9EE8EB4E8E00D4C67252E2C2CAFEDB2F344424B9034371FDDA6C8D152

我们还尝试使用 OpenSSL 生成签名并使用 NCryptVerifySignature windows CNG API 对其进行验证,但验证失败。

0 投票
1 回答
19 浏览

unicode - CertGetNameString 引发堆损坏

CertGetNameString() 随机抛出堆损坏错误,使用函数 CertGetNameStringW() 做同样的事情

LPCWSTR pszName = (LPCWSTR)malloc(cbSize * sizeof(TCHAR));
if (CertGetNameString(pCurrentCertContext, dwType, dwFlags, nullptr, pszName, cbSize)) {}

0 投票
0 回答
39 浏览

winapi - 您如何使用 WinCrypt 在客户端/服务器之间使用 RSA 交换对称密钥?

看着 WinCrypt 样本,我完全迷失了,我认为它会自动做很多事情,但我不明白。我可以在本地很好地使用它,但我想做的是在两个不同的网络系统上生成一个 RSA 私钥/公钥对。从那里他们中的一个需要将他们的公钥导出到我发送到另一个系统的缓冲区。接收系统将使用它来使用 RSA 加密来加密将使用并发送回其他系统的对称密钥。然后双方将拥有将​​使用 AES 来回加密发送的数据的对称密钥。

但是我不知道如何告诉它使用接收到的远程公钥进行加密(我不想替换我生成的私钥/公钥上的公钥)。

有人可以帮忙列出步骤(附评论)吗?

谢谢。

0 投票
1 回答
55 浏览

winapi - 为什么来自 MS CryptoAPI 的 CryptDecrpyt() 不能正确解密远程系统上的前 16 个字节?

我试图想出如何使用 MS CryptoAPI 创建会话密钥并传输到远程,以便他们可以加密通过专用网络发送的数据(所以不用担心中间人,只是数据包嗅探器)。还需要支持Windows XP。我想我已经弄清楚了大部分,并建立了一个类来做我需要的事情。但是,当我将 2604 字节的明文加密为 2608 字节的密文,然后在导入会话密钥的同一台机器(“机器 A”)上对其进行解密时,它工作正常,但是在另一台机器上(实际创建会话密钥的机器) , "Machine B") 解密该数据不能正确解密前 16 个字节(第一个块)。

我所做的是让机器 A 将公钥发送到机器 B,机器 B 创建一个随机会话密钥,然后将其导出并将其发送到机器 A,机器 A 导入该密钥。

这是我曾经这样做的课程:

头文件:

源文件:

0 投票
0 回答
70 浏览

windows - 如何将 Qt 证书和私钥(支持 RSA 和 EC)添加到 Windows 存储并将其用于 Windows Web 服务器

我需要在 C++ 程序中实现一个 API,该程序接收 PEM 证书 + 私钥并在内置 Windows Web 服务器上配置 SSL 端口以使用该证书和密钥。

从命令行,这可以通过将 PEM 信息转换为 PFX 文件,然后使用类似的东西安装它来完成:certutil -p <password> -importpfx certAndKey.pfx然后做 a netsh http add sslcert ipport=0.0.0.0:443 certhash=<hash> appid=<appid>,但现在我需要从 C++ 做同样的事情,它应该适用于 RSA 和 EC键。

我有从 PEM 证书和私钥到 QSslCertificate 和 QSslKey 的代码。我还能够使用 CertAddCertificateContextToStore 将 QSslCertificate 存储到 Windows 存储中,但我一直不知道如何获取附加到该证书的 QSslKey 私钥 - 特别是当密钥是 EC 密钥时。到目前为止,我无法找到任何示例来说明如何执行此操作,并且我自己使用 CryptDecodeObjectEx 和 CryptImportKey 的尝试失败了(因为我可能使用了错误的常量/结构/blob)。

那么,有人可以提供一些示例代码来说明如何:

  • 从 QSslKey 获取存储在某些 Microsoft 密钥库中的 RSA 和 EC 密钥的密钥
  • 告诉 Windows 这个密钥实际上是使用 CertAddCertificateContextToStore(或其他函数)添加的证书的私钥
  • 如果需要使用另一个 API 来添加附加了私钥的证书,也包括那个

提前感谢任何可以在这里提供帮助的人,因为我淹没在所有这些 API 调用中,这些 API 调用针对各种类型的证书具有不同的常量和结构/blob...

0 投票
0 回答
44 浏览

x509certificate - 使用编码的证书和编码的私钥创建 pccert_context

我正在尝试为 Web 服务的 Java 客户端添加证书支持。java 客户端负责收集所需的信息并将格式化的信息传递给进行 http\https 调用的 c++ 库。我们目前正在使用 JNI 来调用 c++ 库。c++ 库需要一个 PCCERT_CONTEXT 参数作为证书传递。

我阅读了 Java 中的证书并获得了它的编码版本,如下所示:

我将此编码证书传递给 JNI 层,在 JNI 中我执行以下操作来构造 PCCERT_CONTEXT:

当我将此 certContext 传递给 c++ 库(内部使用 winHttp)时,我收到错误 ERROR_WINHTTP_CLIENT_CERT_NO_PRIVATE_KEY (12185),这表明 PCCERT_CONTEXT 没有设置私钥。

我可以按如下方式在 Java 中获取编码的私钥:

并将 encodedPrivateKey 传递给 JNI 层,但是如何使用这个 enodedPrivateKey 在 PCCERT_CONTEXT 对象中设置私钥?

有没有办法用私钥创建 PCCERT_CONTEXT ?有一个更好的方法吗 ?我是证书新手,所以任何建议都会有所帮助。

谢谢