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

encryption - 使用 CNG 和 BCRYPT_KDF_SP80056A_CONCAT KDF 的问题

我正在处理实现 CNG ECDH,然后我尝试使用 BCRYPT_KDF_SP80056A_CONCAT KDF 派生对称 AES256 密钥 (BCryptDeriveKey())。我遇到了问题(我总是返回 0xc000000d 状态返回。)

我已经成功生成了一个共享密钥,并且我创建了缓冲区 desc“BCryptBufferDesc”,其中包含一个“BCryptBuffer”数组,其中包含 1 个 AlgorithmID、1 个 PartyU 和 1 个 PartyV“其他信息”。我想我已经正确定义和填充了所有结构。我只是为 PartyU 和 PartyV 字节选择一些“值”(我尝试了 1 字节和 16 字节,但我得到了相同的结果)。NIST 文档没有详细说明其他信息应该是什么。

我已经按照 Microsoft 网站来创建这些结构,使用它们的字符串、定义等。我尝试使用标准 L"HASH" kdf,它可以工作,我在两个“边”上都得到了相同的派生密钥,但使用了连接KDF 我总是得到相同的 0xC000000D 状态..

有没有其他人能够成功使用 BCRYPT_KDF_SP80056A_CONCAT CNG KDF?如果你这样做了,你有什么提示吗?

0 投票
3 回答
11590 浏览

c# - 使用存储 C#.Net CNG 中的密钥的 ECDSA 签名文件

我正在尝试使用 CNG API 和 Microsoft Certificate Store 中的证书使用 ECDSA 签署文件。我已经阅读了很多文档并且几乎完成了,但是我对从证书中导入私钥感到困惑。我用 RSA 做了同样的事情,但它似乎做得非常不同。这是我到目前为止的代码:

我得到了错误

System.NotSupportedException:不支持证书密钥算法。

我的证书是 ECDSA_P256 sha384ECDSA,具有以下扩展名:

看起来好像证书是问题,但我不确定它是否可能是代码。


这是我的公钥证书:

0 投票
1 回答
232 浏览

windows - BCryptGetFipsAlgorithmMode 使用哪些数据来确定 FIP 状态?

我很难找出决定BCryptGetFipsAlgorithmMode()返回 TRUE 或 FALSE 的因素。它是否只返回以下状态:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\FIPSAlgorithmPolicy\Enabled

或者是别的什么?

0 投票
1 回答
330 浏览

encryption - 有没有办法查看 Microsoft CNG 中生成的 ECDH 共享密钥?

我正在尝试在 MS CNG 和另一台设备之间执行 ECDH 密钥交换。为了调试,我想看看 CNG 中生成了什么共享秘密,以便我可以将它与我的其他设备生成的秘密进行比较。有人知道这样做的方法吗?

0 投票
1 回答
5248 浏览

c# - 如何在 C# 中使用密钥大小小于内置最小 256 位的 ECDSA

我有一个非常有限的渠道来发送消息和签名,并且已被指示(在https://crypto.stackexchange.com/questions/3075/asymmetric-algorithm-to-generate-compact-unique-messages-that -can-be-validated/ ) ECDSA 提供了最紧凑的非对称算法。

我很容易做到这一点:

但是我希望能够牺牲一些强度并使用小于 BCL 提供的最小 256 位密钥大小,并且我还没有找到可以满足我需要的实现。

我已经尝试过 BouncyCastle,而且它似乎开箱即用也有同样的限制。

我有哪些选择?是否有另一种实现可以解除实现限制?

0 投票
1 回答
868 浏览

cryptography - Microsoft PlayReady DRM P160 椭圆曲线参数

我正在尝试为自定义 Microsoft P160 PlayReady 曲线创建正确的 DER 编码 ECC 参数以输入 HSM。我找到了一些指定 P160 曲线定义的来源,因为它是非标准和自定义的。下面是一个来源的链接。特别是,PlayReady 曲线值在William Stein 所著的 Elementary Number Theory,A Computational Approach 一书的第 6.4.2 节中进行了讨论。

下面是来自另一个来源的关于 P160 PlayReady 曲线参数的尝试。

对于 ECC,Microsoft 使用 Zp 上的椭圆曲线,其中 p 是 160 位素数(如下所示)。该曲线由位于曲线 y^2=x^3+ax+b 上的点组成,其中操作是在域 Zp 上完成的,a 和 b 是下面给出的系数。所有值都表示为打包二进制值:换句话说,Zp 上的单个值被简单地编码为 20 个字节,以小端顺序存储。因此,椭圆曲线上的一个点是一个 40 字节的块,它由两个 20 字节的小端值(x 坐标后跟 y 坐标)组成。以下是 MS-DRM 中使用的椭圆曲线的参数:

p(模数): 89abcdef012345672718281831415926141424f7
系数 a: 37a5abccd277bce87632ff3d4780c009ebe41497
coefficient b : 0dd8dabf725e2f3228e85f1ad78fdedf9328239e
generator x : 8723947fd6a3a1e53510c07dba38daf0109fa120
*generator y : 445744911075522d8c3c5856d4ed7acda379936f
Order of curve : 89abcdef012345672716b26eec14904428c2a675

These constants are fixed, and used by all parties in the MS-DRM system. 当您看到这个以十六进制表示的数字时,模数的“书呆子吸引力”很高:它包括以十六进制计数,以及基本常数 e、pi 和 sqrt(2) 的数字。

基于此信息,我使用 BouncyCastle 作为我的基本 ASN.1 库为 P160 曲线创建了以下 DER 编码曲线参数的十六进制编码。请注意,这些曲线参数中没有指定种子值。

308195020101302006072a8648ce3d010102150089abcdef012345672718281831415926141424f7302c041437a5abccd277bce87632ff3d4780c009ebe4149704140dd8dabf725e2f3228e85f1ad78fdedf9328239e0429048723947fd6a3a1e53510c07dba38daf0109fa120445744911075522d8c3c5856d4ed7acda379936f02150089abcdef012345672716b26eec14904428c2a675

尽管这些曲线参数在数学上被 HSM 和 OpenSSL 接受,但产生的 P160 曲线点对 PlayReady 来说是不可接受的。我能够使用相同的过程来生成 PlayReady 可接受的有效 P256 曲线点,所以我不相信我的方法有缺陷。有人对 PlayReady P160 曲线参数有任何经验吗?

0 投票
3 回答
3310 浏览

cryptography - NCryptOpenKey()

NCryptOpenKey()我正在尝试通过调用并使用证书的指纹作为密钥名称参数来创建 CNG(下一代 Windows 加密 API)密钥句柄:

使用这个 keyName 找不到密钥,但是当我在 certmgr.msc 中查找它时,我可以看到带有该指纹的证书(“‎<code>e0 f5 df 72 7f 81 92 fa ae 8a 4b f1 d5 53 c1 be 40 18 90 直流")。这里可能是什么问题?

编辑:我基本上想要做的(正如我在堆栈溢出人员的帮助下发现的那样;))是从存储在 Windows 证书存储中的证书创建一个 NCRYPT_KEY_HANDLE 。

0 投票
2 回答
2099 浏览

c# - CNG 从文件导入 ECC Pub/Priv Key

多年来,我一直在尝试寻找如何通过任何方式从文件中导入 ECC 密钥。我尝试从 Windows 证书存储、.p12 文件和 PKCS#8 OpenSSL 密钥文件访问 ECC 证书,但均未成功。

我尝试过的许多事情之一是:

但是没有给出描述性错误消息,只有最后一行有invalid parameters或者在上面的代码的情况下An error occurred during encode or decode operation.

我正在使用来自 MSDN 的示例程序进行 ECDH,并将其更改为使用 AES 的 GCM 模式。在我尝试使用预生成的 ECC 密钥而不是 Microsoft 示例在运行时默认创建的密钥之前,所有这些都可以正常工作。我随机尝试了所有的CngKeyBlobFormats 但老实说,我不能很好地调试它,因为我不知道这些特定格式在原始数据中是什么样子的。

我的密钥采用以下格式,但我愿意使用任何可行的格式(.p12、Microsoft Store、PKCS#8 等)

密钥文件

资源

MSDN API 和示例:ECDiffieHellmanCng 类

MSDN API:CngKey 类

MSDN 博客:AES GCM 模式

OpenSSL - 创建 ECC 密钥

0 投票
3 回答
6183 浏览

powershell - 如何从powershell授予私钥权限

我正在尝试找到一种从 powershell 脚本授予私钥权限的方法。证书存储在 CNG 中。欢迎所有想法。

0 投票
0 回答
1113 浏览

certificate - 如何使用 CLR 安全性创建自签名证书以与 EnvelopedCms 一起使用?

我正在尝试使用 CLR-Security 库 Security.Cryptography.dll(他们的主页:http ://clrsecurity.codeplex.com )创建自签名证书

我可以创建证书,甚至可以使用它进行加密,但解密失败并出现以下错误“指定的提供程序类型无效”。

这是证书创建代码:

这是加密方法:

这是解密方法:

当我对使用 makecert.exe 创建的证书使用完全相同的代码时,它运行良好。我使用的 makecert 命令行是:makecert.exe -sr LocalMachine -ss My -n CN=[SomeDN] -sk [SomeRandomGUID] -sky exchange

在创建 CngKey 或证书时是否需要指定一些额外的参数?或者也许在加密期间传递一些额外的信息?

提前感谢您的帮助!