我需要能够在不知道密码的情况下从PFX文件中读取 public 键。我很确定只有私钥是加密的,但是即使我不需要私钥,所有读取PFX格式的方便的API似乎都会在没有密码的情况下破解。
如何阅读公钥?
答案 0 :(得分:2)
我研究了一下,看看我是否可以确定Cert Manager如何打开PFX文件。我发现cryptext.dll是“Crypto Shell Extensions”并处理PFX文件。如果在注册表中搜索cryptext.dll,您将看到它处理了许多不同的文件类型(CER,CRL,加密存储等)。使用rundll32.exe和“动词”调用它。从注册表中,您可以看到哪个动词与每种文件类型相关联。
Cryptext.dll是一个COM组件。虽然它包含嵌入式类型库,但使用TLBIMP创建互操作程序集不能提供对任何有趣方法或属性的访问。基于OLEVIEW,它只实现IUnknown接口。因此,没有明显的方法可以从.NET或非托管程序以编程方式访问它。
它是一个COM组件的事实意味着它(几乎可以肯定)使用非托管加密API。
以下是关于逆向工程cryptext.dll的一些建议,看看它是如何工作的。转储文件中的ASCII / UNICODE字符串。你应该看到上面提到的各种动词。确定哪些动词最有可能支持打开PFX文件。尝试使用PFX作为输入选择的动词运行rundll32.exe。希望你能弄清楚哪个是正确的动词。
然后将rundll32.exe加载到调试器(即Windbg)中。在调试器中设置命令行以使用您找到的动词以及测试PFX文件。在DLL的内存中将读取断点放在包含该动词的字符串的第一个字节/单词上。 (您可以使用windbg搜索内存)。然后开始执行。当读取断点触发时,开始逐步读取读取字符串的代码。它可能会在循环中将命令行上指定的动词与程序中的每个动词进行比较。它应该在比较动词的中间。因此它应该退出比较循环并转到该动词的处理程序。进入该处理程序,看看它调用的加密API。了解加密API有望足以弄清楚如何访问PFX文件中的公钥。