问题标签 [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.
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() 来查看证书是否已经存在,并且只有当它不存在时才这样做:
重新添加证书......所以我的问题是,为什么不能保留私钥?我错过了什么吗?
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 参数,但我找不到任何正确的编码方法。任何人都可以帮助我吗?很多天以来,我一直把头撞在城堡的墙上,但无济于事....请帮忙:(
c++ - 使用 Crypto Api 在客户端和服务器之间进行加密和解密的正确方法是什么?
经过许多头痛和建议停止的人,我终于设法让我的服务器/客户端应用程序使用此 API 并创建所需的密钥,即会话和交换。
当我将公钥发送给客户端时,它会成功导入密钥,并且还会使用该密钥加密消息,但是当我将其传递回服务器时;它使用会话密钥解密消息,但消息作为垃圾返回(嗯..需要私钥!)。现在这可能是由于我通过 rpc 将加密消息传回的方式,但有些东西告诉我它是另一回事。理想情况下,我需要一个清晰明了的解释,说明我应该使用所有这些键做什么,因为我目前获得的信息非常混乱。
我是否将交换公钥传递给客户端,以便它可以加密消息并返回解密。
或者:
我真的应该用服务器公钥加密客户端会话密钥然后返回吗?(这对我来说听起来不对,但我全神贯注!!!)
请留下评论以转移到另一个 API,或从 MSDN 复制馅饼(我已经阅读了所有内容)。我正在使用 Crypto API,只需要清楚地解释服务器应该将哪些密钥传递给客户端,然后客户端应该做什么并传回,以便我最终可以继续......
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模式
我无法弄清楚他们为什么返回不同的数据。任何帮助将不胜感激。
.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 - 如果我错了,请纠正我)。
谢谢!
暗里
security - PFXImportCertStore-问题-cryptoapi
我使用 . 导入了第三方 CA 颁发的 PFX 证书PFXImportCertStore
。成功导入后,同一个调用默认PCERT_KEY_PROV_INFO_PROP_ID
设置为以下值,PFXImportCertStore
为什么被
dwKeySpec
识别为AT_KEYEXCHANGE
键类型而不是AT_SIGNATURE
?为什么
pwszProvName
设置为 Microsoft Base Cryptographic Provider v1.0?首先颁发的证书仅用于数字签名。但密钥使用字段表明该证书可用于数字签名、不可否认性、密钥加密、数据加密(f0)。增强的密钥用法表明,客户端身份验证和安全电子邮件?CA 是否已正确颁发证书?证书正面显示以下信息(以下屏幕截图),这让我怀疑此证书不是为数字歌唱而颁发的?我的想法是否正确?
4.由于这些问题,我无法使用CryptSignMessage
. 内部调用无法获取用于签名的私钥的上下文。关于如何解决这个问题的任何建议?我可以使用我生成的自签名 PFX 证书进行签名。您是否认为我可以将私钥导出到新容器并将其属性设置为AT_SIGNATURE
,并将 csp 提供程序类型设置为PROV_RSA_AES
,因为我需要 SHA256。
我正在使用 XP sp3。
谢谢
windows-ce - Win CE 中的文件系统过滤器和 CryptoAPI 问题
过去两周我一直在研究文件系统过滤器,我遇到了一个有趣的问题。我基本上在一个应用程序中构建了编码/解码实现,该应用程序首先在 Platform Builder 的操作系统启动上运行,以验证它是否工作并用于调试目的。这个应用程序运行良好,能够毫无问题地获取上下文、生成密钥、加密/解密。
当我尝试在 filesys dll 加载上做同样的事情时(据我所知,这是加载文件系统过滤器的点),我的文件系统过滤器似乎没有可用的 CSP 服务。CryptAcquireContext 因 NTE_BAD_KEYSET 而失败,或者当我尝试使用默认提供程序时,它因 NTE_PROV_TYPE_NOT_DEF 而失败。
沮丧的是,我编写了一些代码来枚举当时所有可用的提供程序,结果发现在加载 filesys 时没有任何提供程序,想知道是否有人有任何经验或想法可以提供帮助。我已经正式用完了想法。
干杯伯纳德
cryptography - 如何使用 CryptoAPI 从 p7b 证书中提取公钥
我有一个 p7b 证书存储。我打开它
我做了证书链验证,没关系,直到我必须从叶证书中提取公钥。我打电话
但它返回 ASN1 bad tag 错误。
所以我尝试以下代码:
它工作正常,但我仍然不知道如何提取公钥。
有什么建议么?
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_VERSION
in-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) 继承值如下
谢谢
java - 如何在小程序中使用 MSCAPI 来加载密钥库
我有一个小程序,允许用户使用他们的个人证书签署文档。小程序已签名,但当它尝试加载其密钥库时,我收到与 sunMSCAPI 相关的访问被拒绝错误。这是由以下代码行引起的:
根据我对小程序签名的了解,在我需要跳过的签名过程之后没有其他步骤(编辑策略文件等)。我尝试将所有小程序功能包装在:
但这没有帮助。我已经在各个论坛上找到了一些评论,认为 sunMSCAPI 仅在 JDK 6 中可用......我已经得到了。我的想法不多了,任何帮助将不胜感激。
对于潜在的帮助,这里是拒绝访问错误的堆栈跟踪: