问题标签 [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.
c# - 一位用户无法从 xml 字符串导入 DSA 密钥。权限?安装损坏?糟糕的KSP?
一位用户最近在使用我的软件时报告了一个奇怪的错误。我使用 DSA 签名来验证许可证。当软件导入公钥以验证签名时,DSA 提供程序的FromXmlString方法会引发CryptographicException,其描述为“密钥在指定状态下无效。 ”
从 System.Security.Cryptography.Utils.CreateProvHandle 调用的 _OpenCSP 方法似乎返回 NTE_BAD_KEY_STATE (0x8009000b)。这是第一次有人向我报告此错误,并且该代码已多年未更改。
造成这种情况的可能原因是什么?屏蔽权限错误?损坏的 CAPI 安装?被.net 信任/权限设置阻止?由密钥存储提供程序存储的垃圾,还是 KSP 向 cryptoapi 返回意外的东西?
我已经用谷歌搜索了错误代码/描述/等,但没有找到任何可能导致这种情况的真正答案......
失败的代码的隔离版本在这里:http: //forum.huagati.com/getattachment.ashx?fileid=78
...并在受影响用户的机器上返回:
更新:在同一台机器上的 .net fx 2.0 下运行时,相同的代码工作正常,但在 .net fx 4.0 下失败。
更新 2: DSA 提供程序似乎会查找存储在 %APPDATA%\Microsoft\Crypto\DSS\[SID] 下的密钥,即使使用现有密钥进行初始化也是如此。会不会和这个机制有冲突?任何人都知道更多关于密钥存储是如何运作的,以及为什么从字符串加载公钥时它会被命中?
c# - 无法在 .NET 中重现基于 ATL 的数据解密:前 4 个字节错误
这是 C++ 代码:
它成功地将字节数组解码为类似“ABC-DEF-2\ZXCVBNMHOHUH,2020100”的字符串。
这是我正在尝试编写的相应 .NET 代码:
它的输出字符串是“몶뛛跬DEF-2\ZXCVBNMHOHUH,2020100”。因此,前四个字符被错误解码。更改盐会使这些字符不同。
由于C++ 代码中没有盐,我什至想不出尝试的价值。但所有简单的也不起作用。
有人可以帮忙吗?
windows-server-2003 - CryptoAPI - 在不同版本的 Windows 之间导出/导入密钥
在 Win 2003 32 位上,我通过调用 (dwFlags=0)成功导出了PRIVATEKEYBLOB
一个。CryptExportKey
然后我尝试在具有 64 位可执行文件的 Win Server 2008 64 位上导入密钥 blob,调用CryptImportKey
失败并显示NTE_BAD_DATA
.
在这两种情况下,加密提供者都是通过调用来初始化的
CryptAcquireContext(&hProv, szContainer, NULL, PROV_RSA_AES, CRYPT_MACHINE_KEYSET)
导出/导入的密码匹配。公钥基于CryptDeriveKey
密码的 md5 哈希值,这些密码在纯文本表示中是相同的。我不确定两个系统中的公钥是否最终相等。
不同类型的系统(Win 2003 32 位与 Win 2008 64 位)是否是预期的失败原因,有没有办法让它工作?
c++ - Windows XP 与 Vista/7 上的 MS Crypto API 行为
我试图了解如何在 XP、Vista 和 Windows 7 上获取从 PEM 格式(示例包含在下面的代码中)导入的公钥。示例代码将在 XP 和 Windows Vista/7 上导入密钥,但不会一样的方法。
在 Windows XP 上,密码提供程序的名称中需要字符串“(Prototype)”,并允许对 CryptImportPublicKeyInfo 的调用通过。
在 Windows 7 上,显然存在“(原型)”提供程序,但不支持对 CryptImportPublicKeyInfo 的调用,这令人困惑。
这些操作系统之间的正确实现可能是什么样的?是否有必要检测 XP 并使用"(Prototype)"请求名称,而对于其他操作系统则没有它?是否有可能在某些 XP 系统上仍然会失败?
或者,有没有办法检测这种令人困惑的行为并选择支持必要调用的加密提供者?
Windows 7 上的输出:
Windows XP 上的输出:
产生该输出的 C++ 源代码:(需要 crypt32.lib)
java - 加载密钥库时如何防止弹出窗口
嗨,作为这个问题的必然结果,我想问您是否知道如何防止弹出对话框以询问密码或要求插入证书。
我们目前正在构建一个系统,我们必须使用 Windows 密钥库来获取存储在包含读取器和证书的 USB 令牌上的证书。与原始问题不同,我们在加载密钥库时不会遇到问题,而是在访问它时遇到问题。如果密钥库中只有一个证书没问题,我们会在适当的时间弹出适当的密码,仅此而已。但是,如果在系统中插入第二个 USB 密钥并随后删除该条目,则该条目仍保留在密钥库中,并且从那时起,每次我们尝试访问密钥库中的信息时,都会弹出一个插入密钥的弹出窗口。对于密钥当前未连接到计算机的存储中的每个证书,都会发生这种情况。
我们与之交互的系统需要这些证书,因此我们必须执行多个加密操作,并且每次都出现这些弹出窗口,这至少可以说是相当烦人的。
windows - 如何将机器证书导入与 Windows 服务关联的个人证书存储?
我在这里从 MSDN 论坛转发我的问题。
此问题与将证书导入与 Windows 服务关联的个人证书存储区有关。
我的机器的名称是il-mark-lap(机器可以通过这个名称 ping 通)。
过程:
1.有一个自签名的权威证书,我们称之为NCCA。它的私钥存在于另一台机器上,让我们通过dev-profiler引用它。
2. il-mark-lap机器证书在dev-profiler上创建并导入到il-mark-lap上的LocalComputer\My证书存储。请注意,授权证书 ( NCCA ) 必须移动到LocalComputer\Root证书存储,但由于我不知道如何移动,我使用导出-删除-导入序列。
3.将il-mark-lap机器证书从LocalComputer\My证书存储复制到MSMQ\My证书存储(消息队列服务个人证书存储)。同样,我不知道如何复制,所以我使用导出-导入顺序。
其中 ImportPfxIntoSrvCertStore 是我用 C++ 编写的程序,用于将给定的 PFX 导入给定服务的个人证书存储区,在我的例子中是 MSMQ。
省略所有的错误处理,相关的 C++ 代码是这样的:
忽略CSafeXXXHandle
和CSafeMapViewOfFile
类,它们是简单的句柄/缓冲区持有者,在析构函数中释放相应的句柄/缓冲区(“资源获取即初始化”设计模式)。
无论如何,PFXImportCertStore
API 失败并显示消息An error occurred during encoding or decode operation。如果我调用PFXIsPFXBlob
API,它会返回 FALSE。
这是代码开头的 Locals 调试器视图:
因此,所有参数似乎都是正确的。
我不知道出了什么问题。导入的 PFX 文件绝对正确,因为它是使用 MMC 控制台完美导入的。
顺便说一句,我的代码基于本文中的示例 - http://www.codeguru.com/Cpp/IN/internet/security/article.php/c6211
编辑
我想强调一下,我需要一个非交互式过程来将机器证书从 LocalComputer\My 复制到 MSMQ\My。
c - 使用 OpenSSL API 实现 Windows CryptoAPI CryptDeriveKey
我有一个 CryptoAPI 代码来使用 AES-128 加密\解密给定的数据,以及一个使用 SHA-256 从密码派生的密钥。
如何编写 OpenSSL 等效实现,以便能够使用它加密数据,然后使用 CryptoAPI 解密,反之亦然?
尝试将 EVP_BytesToKey 与 EVP_aes_128_cbc() 和 EVP_sha256() 一起使用并不能“按原样”工作。(“不起作用”我的意思是 - 无法解密 CryptoAPI 生成的加密数据,反之亦然。这确实适用于解密 OpenSSL 的加密数据)。
有什么想法或好的参考吗?
先感谢您。
这是 Windows CryptoAPI 代码:
c++ - Window C/C++ Crypto API 示例和提示
我问这个问题是因为我花了一天中最好的时间浏览 msdn 文档和其他不透明的资源,以获取有关如何开始使用 Windows C/C++ Crypto API 的简单直接指南。
我想看到一些示例代码,典型的包含路径,链接指南等,任何真正有用的东西。我知道这是一个不精确的问题,但我认为不精确的答案最好不要。
我会用我自己微薄的发现来让球滚动......
macos - 将 Microsoft CryptoAPI 移植到 Mac OS
我有一个使用 Microsoft CryptoAPI 的 Windows 应用程序(使用 Visual Studio)。现在需要开发一个Mac OS X 应用程序,它能够读取数据,由WinApp 加密,并在Mac OS X 上加密数据,由WinApp 解密。WinApp中的加密/解密以这样的方式初始化:
对于加密/解密,使用以下内容:
据我了解,我需要找到一个实现 MD5 散列加 RC4 编码/解码的库。似乎有许多这样的库。例如:matrixSSL、OpenSSL。但是为我的目的使用这些库并不明显(特别是考虑到我不熟悉 Sequrity/Crypting API)。有人可以推荐一个特定的加密库吗?我的任务可能有代码示例吗?
添加:
似乎主要问题是我需要一个可移植的 ::CryptDeriveKey 模拟,它与 Microsoft 版本兼容(即生成相同的密钥)。有人知道这样的吗?还是通过 ::CryptDeriveKey 创建密钥的算法?
c++ - 在 Windows CryptoAPI 和 OpenSSL x509 格式之间转换
我有一个CERT_CONTEXT结构,它是通过 CryptoAPI 从 Windows 上的智能卡中提取的。我需要将此结构转换为与 OpenSSL 一致的 DER 编码字节数组。到目前为止,我得到的最接近的匹配是通过CryptEncodeObject使用 X509_ASN_ENCODING 和 X509_CERT_TO_BE_SIGNED 修饰符,该修饰符将CERT_INFO结构作为输入。
问题是它与 OpenSSL i2d_X509函数产生的输出不匹配。使用 2048 位 x509 证书作为输入,OpenSSL 产生 1789 字节的编码输出,而 Windows CryptoAPI 产生 1638 字节的编码输出。
我能看到的唯一选择是使用CERT_CONTEXT结构中的值动态创建 X509 证书,并直接使用i2d_X509函数对生成的对象进行编码。唯一的问题是我无法从智能卡中提取私钥,因此这可能会导致 x509 证书创建例程出现问题。
如果有人可以就这些问题提供任何见解/建议/提示,我将不胜感激。