问题标签 [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 投票
2 回答
6183 浏览

c++ - CNG:何时使用 BCrypt* 与 NCrypt* 系列函数

在 Microsoft CNG API(密码学 API:下一代)中,有两组似乎做同样事情的函数。

以下函数开始BCrypt并执行密钥导入/导出、加密/解密、签名/验证和 Diffe-Helman 密钥交换

但是存在以 开头的相同功能集NCrypt

这两组函数有什么区别,分别应该在什么时候使用?

0 投票
2 回答
249 浏览

c# - 从密码短语构建私有 CngKey(ECDH_P384)

上下文:VS 2015 winforms,Windows 7,使用 SecurityDriven Inferno 库。

我正在编写一个离线应用程序,它生成要作为电子邮件附件发送的加密文件(因此不在客户端-服务器上下文中使用)。这些文件首先使用 Inferno(ETM_Transform) 加密,然后与另一个文件(有时用于重置密码)一起发送,处理 DHM 密钥交换。

每个用户的公钥存储在应用程序创建和持久化的数据表中,允许在密钥交换过程中快速访问。然而,对于私钥,我的问题是用户(包括我自己)更愿意从密码短语中重新创建他们的私钥,从而无需隐藏密钥,从而提高安全性和可移植性。所以我需要从存储的公钥和散列密码短语中构建一个密钥。

这是一种合理的方法,还是对于这种特定情况有更好的方法?

这是一个抛出异常的非常简短的代码示例:“不支持请求的操作”。我应该如何继续将数据导入密钥?

0 投票
1 回答
345 浏览

winapi - CNG 密钥的 DACL 中访问掩码的映射

(注意:IMO 的问题主要是关于 WinAPI 和 DACL,而不是关于 CNG,所以请继续阅读!)

我目前正在尝试修改 Microsoft 的 Cryptographic Provider Development Kit 的示例 CNG 密钥存储提供程序,使其不会密钥存储在单个文件中。但是,我遇到了可以分配给私钥的安全描述符的问题。

在 Windows Server 管理控制台的证书管理单元中,可以管理证书的私钥,即可以更改密钥的所有者、DACL 和 SACL,这会导致以安全描述符作为参数的 NCryptSetProperty 调用。对于 DACL,管理单元只允许/拒绝“完全控制”或“读取”,这会导致在 ACE 的访问掩码中设置 GENERIC_ALL 或 GENERIC_READ 位。

据我所知,这些通用位需要映射到特定于应用程序的权限 - 否则 AccessCheck 将不起作用。但是我真的需要手动完成吗???

CreatePrivateObjectSecurity+SetPrivateObjectSecurity 并不总是有效,因为 CreatePrivateObjectSecurity 对输入安全描述符中的所有者和组非常挑剔。此外,当应用映射时,访问掩码中的通用位会被清除,这会导致管理单元显示错误的设置(正如我所说,管理单元在显示当前权限时只考虑 GA 和 GR 位)。

似乎我在这里遗漏了一些东西......

0 投票
1 回答
1460 浏览

c++ - Use AES CBC with NCrypt in windows

I'm trying to use the NCrypt.dll to encrypt some data, in C++, and I'm having trouble handling keys and algorithms.

I would like to use AES with the CBC chainging method but, can't get the NCryptEncrypt function to work (I keep getting an invalid buffer size thrown).

I have created and stored a key (in the key storage provider) using the NCRYPT_AES_ALGORITHM flag but, have no idea how to set the algorithm to use the CBC method.

I've tried a few property settings and had no success so, I would like to know if this is even possible with NCrypt?

I know the Bcrypt encrypt function allows this and tried to convert my NCRYPT_KEY_HANDLE to a BCRYPT_KEY_HANDLE without success (so I reckon this is not possible).

0 投票
0 回答
1481 浏览

.net - 使用 CNG(HSM 中的私钥)在 .NET 中创建 X.509 证书

我们有一个自签名 CA 证书,其私钥存储在 HSM 解决方案中。我们需要创建一个由 CA 证书通过 .NET 代码签名的短期 X.509 证书。短期 X.509 证书将用于通过 TLS/HTTPS 对基于 REST 的服务进行客户端证书身份验证。

HSM 解决方案使用密钥存储提供程序 (KSP) 与 Microsoft 证书存储的集成,因此必须使用下一代加密 (CNG) 库来获取私钥。

通过 X509CertificateExtensions.GetCngPrivateKey() 我们能够访问代表私钥的 CngKey 对象。

但是,我们不能将 CngKey 与 BouncyCastle 一起使用

失败并引发以下异常

编辑:认为失败的原因是 DotNetUtilities.GetRsaKeyPair 尝试通过 rsa.ExportParameters(true) 导出私钥。HSM 不允许这样做,它会引发异常。似乎需要一种不同的方式来引用私钥

编辑#2:向 Bouncy Castle 提出了功能请求,并且有关于如何将其作为框架的一部分实现的响应。

0 投票
1 回答
1462 浏览

c++ - 如何编写 KSP 以连接到 KERB_CERTIFICATE_LOGON

大家好,我编写了一个自定义凭据提供程序,在使用用户名/密码作为凭据时可以正常工作,密码是通过蓝牙传输的。毕竟这并不难,因为文档会告诉您要实现哪些接口。

现在我想更改凭据以使用证书。我看到我应该为此使用 KERB_CERTIFICATE_LOGON 结构。深入研究该主题后,我发现我应该实现一个自定义密钥存储提供程序,如microsoft 的这篇文章中所述。这就是我迷失的地方。也许我愚蠢地搜索正确的文档,但我只是找不到我必须实现哪些接口才能拥有可以在 KERB_CERTIFICATE_LOGON 结构的 CspData 字段中引用的 KSP。我只是找到了一堆方法,然后快速搜索 NCRYPT_CERTIFICATE_PROPERTY(在上面的链接文章中提到)在谷歌中发现了惊人的两个结果。

我发现这个 SO-question可以帮助我在拥有 credentialprovider 和 KSP 时连接它,但它没有解释如何编写 KSP。:-(

谁能指导我在哪里可以找到信息或显示在类似场景中使用的 KSP 的简短示例(只是方法声明,以及如何在对 KERB_CERTIFICATE_LOGON 的调用中使用生成的 KSP)?

0 投票
1 回答
781 浏览

windows - NCRYPT_KEY_HANDLE 指向的证书结构

我已经编写了一个凭据提供程序和一个密钥存储提供程序来通过证书登录到 Windows。由于这点中的文档非常模糊,我使用了来自 Microsoft 的不同示例来使事情正常进行。

我想我快到了,但登录行为不可预测。有时我会连接到 kerberos 服务器(它抱怨证书),有时进程会失败并显示 0x80090029 没有任何信息,有时 Windows 会崩溃。由于这些崩溃都与访问冲突或空指针有关,并且碰巧发生在不同的地方(kerberos.dll,Windows.UI.Logon.dll,...),我认为这与我的密钥结构有关在我的 OpenKey 实现中将给定的 NCRYT_KEY_HANDLE 指向。

CNG-Kit 中的 KeyStorageProviderSample 有一个示例,但依赖于存储在 %AppData% 中的 RSA 密钥。我没有可用的私钥,因为它存储在安全硬件中,我只有公共部分(即公共证书),我从另一台设备读取并通过以下代码导入:

密钥结构以这种方式初始化:

在某个地方一定有导致各种内存错误的错误。但由于我对 windows 编程和 c/c++ 还是很陌生,所以我无法找到重点,也找不到任何关于 windows 期望 NCRYTP_KEY_HANDLE 的数据结构的文档。有人知道这个结构吗?

0 投票
2 回答
2025 浏览

c++ - CNG 中的 AES-CBC 加密输出与在线工具不匹配

我是 CNG 的新手。我正在玩 msdn 网站上的基本程序。我已经修改了输入纯字符串并使用其他提供 aes cbc 加密输出的网站测试了输出。不幸的是只有上半场比赛,下半场没有比赛。如果有人能指出错误所在,那就太好了,

msdn 的原始代码在这里

这是我的代码生成的输出(如下)。请注意,除了修改输入的纯字符串之外,我的代码没有任何区别。 在此处输入图像描述

这是在线网站的输出(http://aes.online-domain-tools.com/另一个站点) 在此处输入图像描述

上半场以“B0 C4 29 18”结束..之后第二半场不匹配。

这是代码片段

0 投票
1 回答
2131 浏览

c# - CngKeyBlobFormat 实际支持的格式是什么?

Microsoft 页面提供有关CngKey.Import可以使用的格式的“最少”信息。以下属性实际上代表了哪些实际格式?CngKeyBlobFormat

  • EccPrivateBlob
  • EccPublicBlob
  • GenericPrivateBlob
  • GenericPublicBlob
  • OpaqueTransportBlob
  • Pkcs8PrivateBlob

只有 PKCS#8 私钥格式稍微暗示了密钥的格式,但它没有指定是否需要包装私钥,或者是否只接受内部 PKCS#8 结构。

当然,关于这些格式的信息越多越好。

0 投票
1 回答
1985 浏览

c# - 导入 RSA CngKey 并存储在 MicrosoftSoftwareKeyStorageProvider 中

我有一个导出的 RSAParameters 私钥,我想将它导入另一台机器。我可以将密钥保存到本地机器或用户容器中,但我一直在尝试导入现有密钥。

下面的代码将生成一个新的密钥对,我知道我可以直接在容器中生成一个新密钥 - 但我希望能够生成一个密钥并将相同的密钥导入到少数不同的计算机中。

如何获取 RSAParameters 或 XML 字符串(任一)并将其导入本地用户(或机器)容器?

CngKey.Import() 需要一个 byte[],这看起来很有希望,但我还没有找到任何方法来创建CngKey.Import() 需要的 byte[]。

这给了我一个字节[],但无论我使用什么 CngKeyBlobFormat,我都会遇到异常。我被困住了。

更新

我找到了一种获取 byte[] 的方法

这段代码看起来应该让我导入字节[]

...但再一次,没有骰子。我尝试什么 CngKeyBlobFormat 并不重要,它们都给了我例外,我无法将密钥导入本地密钥存储提供程序。

我需要什么神奇的设置和参数组合才能完成这项工作?