问题标签 [cryptoapi]

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

windows - 使用 MS CryptoAPI 保存/恢复证书会使附加的私钥无效

我编写了一个程序,该程序应该使用 windows Crypto API 保存和恢复用户证书。我的印象是它工作正常,但现在用户抱怨证书恢复后附加到证书的私钥无效。

我正在使用以下方法保存证书:

然后后来:

我知道 CERT_STORE_SAVE_AS_STORE 标志应该意味着整个证书应该被序列化,包括私钥。虽然我注意到 MSDN 说:

“CERT_KEY_CONTEXT_PROP_ID 属性和相关的 CERT_KEY_PROV_HANDLE_PROP_ID 和 CERT_KEY_SPEC_PROP_ID 值不会保存到序列化存储中。”

..我承认,我不太明白。

当我恢复证书时,我使用 CertFindCertificateInStore() 来查看证书是否已经存在,并且只有当它不存在时才这样做:

重新添加证书......所以我的问题是,为什么不能保留私钥?我错过了什么吗?

0 投票
2 回答
3522 浏览

java - 如何在 Java 中使用 BouncyCastle 正确编码 DH 参数?

我试图在 Java 中以编程方式重现“openssl dhparam -out dh1024.pem 1024”命令的输出。代码片段如下: -

所以基本上我将 P、G 和 L 参数的值连接到一个字节数组“pgl”中,然后使用 BC 的 PEMWriter 类将其保存在一个文件中。但是当我尝试通过 openssl 使用它时,我收到以下错误:-

无法从 /etc/openvpn/easy-rsa/keys/dh1024.pem 加载 DH 参数:错误:0D07207B:asn1 编码例程:ASN1_get_object:header too long: error:0D068066:asn1 encoding routines:ASN1_CHECK_TLEN:bad object header: error: 0D07803A:asn1 编码例程:ASN1_ITEM_EX_D2I:嵌套 asn1 错误:错误:0906700D:PEM 例程:PEM_ASN1_read_bio:ASN1 lib

....这让我相信我错误地编码了 DH 参数,但我找不到任何正确的编码方法。任何人都可以帮助我吗?很多天以来,我一直把头撞在城堡的墙上,但无济于事....请帮忙:(

0 投票
1 回答
839 浏览

c++ - 使用 Crypto Api 在客户端和服务器之间进行加密和解密的正确方法是什么?

经过许多头痛和建议停止的人,我终于设法让我的服务器/客户端应用程序使用此 API 并创建所需的密钥,即会话和交换。

当我将公钥发送给客户端时,它会成功导入密钥,并且还会使用该密钥加密消息,但是当我将其传递回服务器时;它使用会话密钥解密消息,但消息作为垃圾返回(嗯..需要私钥!)。现在这可能是由于我通过 rpc 将加密消息传回的方式,但有些东西告诉我它是另一回事。理想情况下,我需要一个清晰明了的解释,说明我应该使用所有这些键做什么,因为我目前获得的信息非常混乱。

我是否将交换公钥传递给客户端,以便它可以加密消息并返回解密。

或者

我真的应该用服务器公钥加密客户端会话密钥然后返回吗?(这对我来说听起来不对,但我全神贯注!!!)

请留下评论以转移到另一个 API,或从 MSDN 复制馅饼(我已经阅读了所有内容)。我正在使用 Crypto API,只需要清楚地解释服务器应该将哪些密钥传递给客户端,然后客户端应该做什么并传回,以便我最终可以继续......

0 投票
0 回答
1275 浏览

encryption - 问题将解密从 Windows CryptoAPI 移植到 linux libmcrypt

我正在尝试将我的程序从 Windows 移植到 Linux。windows 程序使用 Window CryptoAPI 而 linux 使用 libmcrypt。

这是 Windows 代码:

当程序运行时,它返回:

Q&D linux 版本长这样:

当程序运行时,它返回:

我检查了两个程序是否使用相同的数据。

  • CryptDeriveKey 创建一个密钥07,f1,e2,ea,d4,c8,79,74,03,a6(根据 CryptExportKey),与 Linux 中生成的 md5 的前 10 个字节相同(我将其缩短以匹配请求的 80 位密钥)。
  • 两者都没有在算法上使用盐(或者至少没有这样报告)
  • 他们都使用 {0,0,0,0,0,0,0,0} 的 8 字节 IV
  • 他们都使用 RC2 算法
  • 他们都使用CBC模式

我无法弄清楚他们为什么返回不同的数据。任何帮助将不胜感激。

0 投票
2 回答
3239 浏览

.net - 使用 System.Security.Cryptography 将 Win32 Crypto API 调用转换为 C#

我被分配了删除我们产品的一个 dll 并将其替换为纯 C# 的任务。旧 DLL 是一个 .NET 2.0 托管 C++ (C++\CLI),它封装了对 Win32 本机 Crypto API 的调用。新的 DLL 应该公开一个具有相同名称和方法的新对象,但应该使用 C# (.NET 4.0) 编写。当然,新的 DLL 应该以与旧 DLL 相同的方式加密(和解密) - 否则,所有保存在持久存储(如数据库或文件中)中的加密密码 - 将无法解析!

这是本机 (Win32) API 调用的(伪)代码(注意输入总是 Unicode 编码):

现在,我正在尝试使用 C#(System.Security.Cryptography 命名空间)和 .NET API 公开的新 Crypto 对象编写相同的过程:

在这里,我遇到了一个烦人的问题- 使用这两种方法的加密数组(结果加密缓冲区)不一样!每个数组的前 8 个字节(64 位)相同,但接下来的字节不同。这会导致使用两种方法对短字符串(最多 3 个字符)进行相同的加密,但较长的字符串会导致不同的加密数据。

如何强制这两种方法等效?那就是-以相同的方式加密和解密以使输出相同?我在这里想念什么?.NET 和本机 (Win32) API 之间的默认值\行为是否有变化?(我认为 Win32 Crypto API 中的默认 3DES 密码模式是 EBC,而使用 C# 的默认密码模式是 CBC - 如果我错了,请纠正我)。

谢谢!

暗里

0 投票
1 回答
1821 浏览

security - PFXImportCertStore-问题-cryptoapi

我使用 . 导入了第三方 CA 颁发的 PFX 证书PFXImportCertStore。成功导入后,同一个调用默认PCERT_KEY_PROV_INFO_PROP_ID设置为以下值,PFXImportCertStore

在此处输入图像描述

  1. 为什么被dwKeySpec识别为AT_KEYEXCHANGE键类型而不是AT_SIGNATURE

  2. 为什么pwszProvName设置为 Microsoft Base Cryptographic Provider v1.0?

  3. 首先颁发的证书仅用于数字签名。但密钥使用字段表明该证书可用于数字签名、不可否认性、密钥加密、数据加密(f0)。增强的密钥用法表明,客户端身份验证和安全电子邮件?CA 是否已正确颁发证书?证书正面显示以下信息(以下屏幕截图),这让我怀疑此证书不是为数字歌唱而颁发的?我的想法是否正确?

在此处输入图像描述

4.由于这些问题,我无法使用CryptSignMessage. 内部调用无法获取用于签名的私钥的上下文。关于如何解决这个问题的任何建议?我可以使用我生成的自签名 PFX 证书进行签名。您是否认为我可以将私钥导出到新容器并将其属性设置为AT_SIGNATURE,并将 csp 提供程序类型设置为PROV_RSA_AES,因为我需要 SHA256。

我正在使用 XP sp3。

谢谢

0 投票
0 回答
240 浏览

windows-ce - Win CE 中的文件系统过滤器和 CryptoAPI 问题

过去两周我一直在研究文件系统过滤器,我遇到了一个有趣的问题。我基本上在一个应用程序中构建了编码/解码实现,该应用程序首先在 Platform Builder 的操作系统启动上运行,以验证它是否工作并用于调试目的。这个应用程序运行良好,能够毫无问题地获取上下文、生成密钥、加密/解密。

当我尝试在 filesys dll 加载上做同样的事情时(据我所知,这是加载文件系统过滤器的点),我的文件系统过滤器似乎没有可用的 CSP 服务。CryptAcquireContext 因 NTE_BAD_KEYSET 而失败,或者当我尝试使用默认提供程序时,它因 NTE_PROV_TYPE_NOT_DEF 而失败。

沮丧的是,我编写了一些代码来枚举当时所有可用的提供程序,结果发现在加载 filesys 时没有任何提供程序,想知道是否有人有任何经验或想法可以提供帮助。我已经正式用完了想法。

干杯伯纳德

0 投票
1 回答
1840 浏览

cryptography - 如何使用 CryptoAPI 从 p7b 证书中提取公钥

我有一个 p7b 证书存储。我打开它

我做了证书链验证,没关系,直到我必须从叶证书中提取公钥。我打电话

但它返回 ASN1 bad tag 错误。

所以我尝试以下代码:

它工作正常,但我仍然不知道如何提取公钥。

有什么建议么?

0 投票
2 回答
1881 浏览

c++ - VS2010 - CryptoAPI 中的结构变化 - v7.0A 与 v6.0A - WinCrypt.h

C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\WinCrypt.h中,定义CERT_CHAIN_ENGINE_CONFIG

我在 XP sp3 机器上使用 Visual Studio 2010,在这种情况下,我希望上述结构中的以下两个成员变灰。但这并没有发生,

NTDDI_VERSIONin-turn 定义sdkddkver.h如下,并_WIN32_WINNT以某种方式采用NTDDI_WIN7在我的情况下不正确的值,因为我的是 XP SP3 机器。

有问题的结构的上述两个成员CERT_CHAIN_ENGINE_CONFIG不存在 C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\WinCrypt.h但我的 2010 Visual Studio 项目自动从头文件和 lib 文件中提取C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\WinCrypt.h由于结构冲突,我得到parameter is incorrect

请告诉我如何解决这个问题?

我是否必须安装 Visual Studio 2010 sp1?

在网上找到了一个参考,它说初始化结构将解决问题,但它不会,因为有问题的两个参数不会变灰,并且会在构建时被采用。

更新1:

我的项目设置:

在此处输入图像描述 $(VCInstalDir) - >C:\Program Files\Microsoft Visual Studio 10.0\VC

$(WindowsSdkDir) ->C:\Program Files\Microsoft SDKs\Windows\v7.0A

$(FrameworkSdkDir) ->C:\Program Files\Microsoft SDKs\Windows\v7.0A

库文件设置,

更新 2: 我的预处理器定义是

%(PreprocessorDefinitions) 继承值如下

谢谢

0 投票
1 回答
2721 浏览

java - 如何在小程序中使用 MSCAPI 来加载密钥库

我有一个小程序,允许用户使用他们的个人证书签署文档。小程序已签名,但当它尝试加载其密钥库时,我收到与 sunMSCAPI 相关的访问被拒绝错误。这是由以下代码行引起的:

根据我对小程序签名的了解,在我需要跳过的签名过程之后没有其他步骤(编辑策略文件等)。我尝试将所有小程序功能包装在:

但这没有帮助。我已经在各个论坛上找到了一些评论,认为 sunMSCAPI 仅在 JDK 6 中可用......我已经得到了。我的想法不多了,任何帮助将不胜感激。

对于潜在的帮助,这里是拒绝访问错误的堆栈跟踪: