我正在创建一个管理Windows上RSA密钥对的工具,因为没有内置功能,我们在.NET中广泛使用RSA加密功能.
该工具提供各种功能,例如列出现有RSA密钥对,创建新密钥,删除密钥,导出密钥以及从先前创建的XML导出导入密钥(使用ASPNet_RegIIS.exe导出).
除了仅导入加密操作的公钥之外,我还具有所有功能.当密钥对最初在服务器上创建时,公共和公共/私有导出都使用xml aspnet_regiis.exe.
我热衷于提供加密其他机器上的配置文件的选项,以防止私钥被分发,除非绝对必要.
每次从先前导出的XML块导入公钥时,该PublicOnly属性RSACryptoServiceProvider都设置为false,表示密钥对具有公钥和私钥.我已确认xml不包含私钥信息,因此问题不在xml文件中.
使用该CspParameters对象并将Flags指定为时,似乎会出现此问题CspProviderFlags.UseMachineKeyStore.如果构造RSACryptoServiceProvider没有指定任何Csp参数然后从xml导入密钥,则该PublicOnly属性正确设置为false.
String xmlText = File.ReadAllText(filePath);
RSACryptoServiceProvider csp = new RSACryptoServiceProvider();
csp.FromXmlString(xmlText);
//csp.PublicOnly equals true;
Run Code Online (Sandbox Code Playgroud)
但是,因为我需要为密钥容器提供一个名称,以便以后可以用于加密操作,因此CspParameters在构造a 时不得不使用该对象,RSACryptoServiceProvider因为没有其他方法可以命名密钥容器.
String xmlText = File.ReadAllText(filePath);
CspParameters cspParams = new CspParameters();
cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
cspParams.KeyContainerName = keyContainerName;
RSACryptoServiceProvider csp = new RSACryptoServiceProvider(cspParams);
csp.PersistKeyInCsp = true;
csp.FromXmlString(xmlText);
//csp.PublicOnly equals false;
Run Code Online (Sandbox Code Playgroud)
我已经尝试了这个代码的各种版本,但问题仍然存在.我注意到有类似的问题,例如RSA加密公钥没有从容器返回?但我相信这个问题是不同的,并没有给出令人满意的答案.
因此,问题是如何从XML导入RSA公钥并为密钥容器命名,同时确保容器中只存在公钥对?
编辑
围绕此区域的进一步研究还显示从xml导入完整密钥时的问题,并设置标志以允许导出密钥.
CspProviderFlags.UseArchivableKey;
Run Code Online (Sandbox Code Playgroud)
在CSP Parameter对象上指定此标志时,将在该行处抛出"指定的无效标志"类型的异常 csp.FromXmlString(xmlText);
我实在无法解释这一点.密钥已创建并先前已导出到XML,当然如果密钥先前已导出,则应该可以导入它并允许再次导出它?
我对此做了很多研究,但却无法找到这些问题的答案.
我已经尝试将csp提供程序类型从PROV_RSA_FULL更改为PROV_RSA_AES,因为我认为现在这是默认设置,我认为密钥最初可能是使用此而不是PROV_RSA_FULL创建的,但这没有任何区别.