问题标签 [cng]

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 回答
1378 浏览

c++ - CNG Microsoft 智能卡密钥存储提供程序 AcquireContext

我正在尝试使用以下方式获取 Microsoft 智能卡密钥存储提供程序:

但是,这失败并出现错误:NTE_KEYSET_NOT_DEF (0x80090019)

如果我使用:

有用。但据我所知,Base Smart Card 提供商是 CNG 推出之前的提供商。

那么,将 CNG KSP 用于智能卡的正确提供商名称是什么?

谢谢你的帮助!

0 投票
1 回答
2207 浏览

c# - 将证书密钥加载到 CngKey 类中以用于 DiffieHellman(ECDiffieHellmanCng 类)

这与 .NET / C# 有关。假设在 PFX 或 PKCS#12 文件中有证书 + 私钥(P521 ECC 之一)。我们已通过安装(双击 PFX 或运行certutil -f -p myPfxPassword -importPFX MY SomeEcCert.pfx)将此证书及其私钥加载到 Windows 证书存储中。我注意到如果证书兼容(例如 p521 曲线),它会自动安装为 CNG 证书/密钥。

现在,如何将私钥加载到 CngKey 中,以便在ECDiffieHellmanCng类中使用它?我还想加载 X509 (CNG) 证书以读取它的序列号、发行者、通用名称等以进行一些簿记。

0 投票
3 回答
452 浏览

c# - Windows Phone ANID 到 C# 上的 ANID2 转换?

Windows Phone 7 有一个名为 ANID 的匿名用户 ID 属性。Windows Phone 8 已将其替换为 ANID2。不同之处在于 ANID2 取决于应用的发布者 ID。

可以将 ANID 转换为 ANID2 ,如 MSDN 上的以下代码示例所示。您只需要原始 WP7 ANID 和发布者 ID (guid)。问题是该示例是用 C++ 编写的。我一直在尝试将其移植到 C# 但没有成功。

算法本身很简单:

问题是我无法获得结果匹配。我通过创建两个应用程序(WP7 和 WP8),在相同的设备上运行它们,然后使用发布者 GUID 从 WP7 应用程序转换 ANID 来确保 C++ 正常工作。在 C++ 上,转换后的 ANID2 和设备中的 ANID2 匹配。在 C# 上,转换后的 ANID2 是另一回事。

C# 代码很简单:

C++ 版本使用一种叫做 CNG(密码学 API:下一代)的东西。这是其中的一些代码:

之后,“pUniqueId”使用一些自定义构建函数转换为 Base64。

任何帮助表示赞赏。

更新: Visual Studio 报告 anidBytes (C#) 和 pAnidId (C++)(这是转换为字节的 ANID 字符串)的长度均为 44。这是 C# 调试器报告字节数组的方式:

C# 字节数组

这是 C++ 调试器: C++ 版本

我不知道 C++,所以我不确定这两个是否相同。它们是,但是 C++ 在每个字符之后都有这些 '\0' 字符,我不确定这是否可以。我认为是,因为两种情况下的长度都报告为 44。

另一个字节数组比较是publisherGuid (C#) vs pPublisherId (C++)(publisher id as GUID)。我认为他们再次匹配。C#:

C#字节数组

C++:

C++ 字节数组

如果我在值被加密后查看输出,我可以看到不同之处:

在 C# 上,我从这段代码中得到输出:

字节数组如下所示:

C# 加密结果

在 C++ 代码中,如果我检查 pUniqueId(BCryptFinishHash 的结果),我会看到:

C++ 哈希结果

在这两种情况下,长度似乎相同,但结果却不同。

在 C# 上,如果我将编码类型从 UTF8 更改为 Unicode,则 anidBytes 字节数组将更改为:

统一码

所以它与 C++ 调试器显示的相同。结果也发生了变化,但它仍然与 C++ 不同。这是新的 C# 结果:

C# unicode 结果

这是 C++ 的正确结果:

结果正确

0 投票
0 回答
422 浏览

debugging - 调试智能卡微型驱动程序

我目前正在研究 CNG 智能卡微型驱动程序。

为了测试一些我想makecert用来将私钥导入智能卡的功能。

不幸的是,对于我所做的每一次更改,我都必须将其复制minidriver.dll到 system32 目录。但是一旦我makecert第一次调用,minidriver.dll 就会被使用,除非我重新启动我的电脑,否则我无法覆盖它(老实说这需要太多时间..)

有没有办法在不重新启动的情况下覆盖它?

我的第二次尝试是使用 Visual Studio 并makecert从 Visual Studio 开始对其进行调试。但是会提示:断点当前不会被命中。没有为此文档加载任何符号。

有没有办法在 Visual Studio 中调试 minidriver.dll 使用makecert.exe

谢谢你的帮助。

0 投票
2 回答
1029 浏览

c++ - 让 CNG 加密 API 在 Windows XP 上工作?

有没有办法让Microsoft Cryptography API: Next Generation在 Windows XP 上工作?

0 投票
2 回答
5717 浏览

c# - 如何为 ECDiffieHellmanCng 导出私钥

我正在尝试从ECDiffieHellmanCng对象的新实例中导出密钥,以便稍后使用相同的密钥创建它的实例。但是在尝试导出它时出现错误。

当我使用消息“请求的操作不受支持”调用Export方法时,我收到 CryptographicException 。在代码中放置一些断点后,看起来它甚至在执行该方法之前就抛出了异常。查看 Export 方法的定义,它装饰有SecuritySafeCriticalAttribute,所以我怀疑这个属性实际上是在抛出异常。是什么导致了这个异常?如何保存密钥,以便以后创建相同 ECDiffieHellmanCng 对象的实例?

0 投票
0 回答
484 浏览

winapi - CNG(下一代密码学)提供程序在 Win7 中的常规用户帐户下不起作用

我使用来自 CSPDK 的 CNG 提供程序的示例来实现我自己的 CNG Hash Provider。但是当我使用 PKCS7(签名消息)WinApi 函数 CNG 提供程序时出现的情况不起作用。CryptMsgOpenToEncode 函数报告 0xC0000005 错误,当根本没有提供程序时也会出现。在管理员帐户下一切正常。如果我直接使用 CNG Hash Provider 的 MicroSoft 示例,它会报告相同的错误。此外,如果我尝试在没有管理员权限的用户帐户下安装提供程序,我会从 BCryptRegisterProvider 函数中收到 0xC0000022 错误。如果启用了 UAC(用户访问控制),则提供程序也不起作用。

安装 CNG 提供程序(可以在管理员下完成)以使其在用户帐户下工作的正确方法是什么?

0 投票
1 回答
1620 浏览

linux - 了解 BCryptSignHash 输出签名

我已经使用带有 ECDSA 算法的BCryptSignHash在 Windows 中签署了一个哈希值。输出签名缓冲区的长度为 64 字节。我还使用BCryptGenerateKeyPair函数(BCRYPT_ECDSA_P256_ALGORITHM 算法)生成了公钥和私钥 blob,并使用该函数对哈希进行了签名。

我必须在 linux 中使用这个密钥对来验证这个签名。我能够使用链接“ http://msdn.microsoft.com/en-us/library/windows/desktop/aa375520%28v=vs.85%29.aspx ”破译生成的公私钥对" 并且能够在 linux 中使用它。

理想情况下,生成的 64 字节签名应该是签名对 (r,s) ( http://en.wikipedia.org/wiki/Elliptic_Curve_DSA )。

有没有办法理解生成的 64 字节签名,以便我可以将签名 blob 内容映射到 linux 中的 (r,s) 对并验证它?

或者有没有更简单的方法来验证linux中生成的签名?

谢谢, F

0 投票
1 回答
3202 浏览

.net - Importing ECC-based certificate from the Windows Certificate Store into CngKey

How can I get the public/private keys from an ECC-based X509Certificate2's into CngKey's for use with ECDsaCng and ECDiffieHellmanCng?

I'm currently using RSA 2048 bit key pairs to sign/encrypt stuff. I'm doing this by pulling the certificates from the X509Store where they are securely stored with private keys marked as non-exportable. I would like to convert the current implementation to use ECDSA and ECDH so that I can use smaller key sizes for equivalent security.

I've successfully generated ECC certs using openssl:

  1. openssl ecparam -out private.pem -name prime256v1 -genkey
  2. openssl req -new -key private.pem -x509 -nodes -days 365 -out public.cer
  3. openssl pkcs12 -export -in public.cer -inkey private.pem -out export.pfx

I've successfully installed the above generated certs in to the cert store. I can retrieve them by thumbprint, but the crypto providers for the private and public keys throw "Algorithm not supported" exceptions. Instead, I understand I'm supposed to use ECDsaCng and ECDiffieHellmanCng to sign/encrypt. But these deal in CngKey's.

Bouncy Castle isn't an option because it requires the private keys to be exportable.

CLR Security will return me a CngKey pair via GetCngPrivateKey but it cannot be used with ECDsa because the key returned by CLRSecurity is an ECDH key. Furthermore CLR Security doesn't give me a way to get just the public key from an X509Certificate2 for signature verification (where I don't even have or need the private key of the signer).

Any ideas? I'm at my wits end... Any help would be much appreciated.

0 投票
0 回答
493 浏览

ssl - 使用 CNG 在 SSL (TLS) 中添加新的密码套件

据我所知,自 Windows Vista CNG(下一代密码学)以来,个人用户可以添加新的自己的密码算法,从而制作自己的编码消息(根据信息,例如,来自http://technet.microsoft.com/ en-us/library/cc730763(v=ws.10).aspx )。

但是 CNG SDK 没有评论我们是否也可以在 SSL 中添加新的密码套件。是否有可能,IE(Internet Explorer)可以通过“https”使用新算法进行安全连接?在 CNG 中可以使用哪些方法?我需要帮助才能在 ssl(tls) 中添加新的芯片套件,为 ssl(tls) 创建新的提供程序等等。

谢谢你的帮助。