C# RSACryptServiceProvider和openSSL之间的互操作性
我使用.NET类rsacyptoserviceprovider来获取密钥对:C# RSACryptServiceProvider和openSSL之间的互操作性,c#,openssl,rsacryptoserviceprovider,C#,Openssl,Rsacryptoserviceprovider,我使用.NET类rsacyptoserviceprovider来获取密钥对: using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) { File.WriteAllText ("PublicKeyOnly.xml", rsa.ToXmlString (false)); File.WriteAllText ("PublicPrivate.xml", rsa.ToXmlString (true)); } 现
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
File.WriteAllText ("PublicKeyOnly.xml", rsa.ToXmlString (false));
File.WriteAllText ("PublicPrivate.xml", rsa.ToXmlString (true));
}
现在,我想在openSSH中使用它,但是密钥格式看起来一点都不一样。
有人知道如何将公钥和私钥转换为openSSH可以使用的文件吗
谢谢 这篇关于使用的博文指出这是可能的,但作者最终使用该库从C#内部与OpenSSL进行互操作。NET世界不支持PEM格式,因此您可以使用JavaScience中的这个库,名为;然而,正如博客文章的作者所提到的,由于这个()他们遇到了问题:
OpenSSL:只能对少量的
适合单个块的数据。
数据被填充和签名。这个
反过来称为“验证”,也就是说
如果数据为“未签名”,则
未添加,原始数据为
返回
[Windows]:可以签署任意数量的
数据。Sign*方法首先对
数据,然后填充哈希并
签署。Verify*方法期望
三个输入:原始数据,a
哈希算法名称和签名
数据。对原始数据进行散列和排序
取消签名/取消添加的结果为
与原始文件的哈希比较
数据
因此,我建议您使用Chilkat RSA库。我确实需要实现与RSACryptServiceProvider的Openssl互操作性,以便实现软件许可证密钥系统() 我需要能够使用openssl在Linux中创建私钥和公钥,以便以后可以将它们用于PHP web应用程序中的许可证管理。但是,也可以将它们用作VB.Net应用程序中RSA签名许可证系统的基础 经过一周的搜索,我最终发现这是完全可能的,所以我想我会分享它 从Linux(或任何其他有用的操作系统)开始,使用openssl创建私钥(private.pem)、公钥(public.pem)、证书(certificate.crt)和个人信息交换文件(certificate.pfx)。不要担心CN和emailAddress字段,证书和pfx文件仅用作将公钥或私钥获取到RSACryptServiceProvider对象中的工具
openssl genrsa -out private.pem 1024
openssl rsa -in private.pem -out public.pem -pubout
openssl req -nodes -x509 -days 3650 -subj '/CN=www.example.com/emailAddress=info@example.com' -new -key private.pem -out certificate.crt
openssl pkcs12 -export -out certificate.pfx -inkey private.pem -in certificate.crt
现在要将私钥放入代码中:
Dim cert As New X509Certificate2("certificate.pfx", "", X509KeyStorageFlags.Exportable)
Dim rsaProvider As RSACryptoServiceProvider = DirectCast(cert.PrivateKey, RSACryptoServiceProvider)
Dim cert As New X509Certificate2("certificate.crt")
Dim rsaProvider As RSACryptoServiceProvider = DirectCast(cert.PublicKey.Key, RSACryptoServiceProvider)
如果需要私钥或公钥,请尝试以下操作:
msgbox(rsaProvider.ToXmlString(True)) 'Private key in XML format
msgbox(rsaProvider.ToXmlString(False)) 'Public key in XML format
msgbox(rsaProvider.ToXmlString(False)) 'Public key in XML format
要将公钥输入到代码中,请执行以下操作:
Dim cert As New X509Certificate2("certificate.pfx", "", X509KeyStorageFlags.Exportable)
Dim rsaProvider As RSACryptoServiceProvider = DirectCast(cert.PrivateKey, RSACryptoServiceProvider)
Dim cert As New X509Certificate2("certificate.crt")
Dim rsaProvider As RSACryptoServiceProvider = DirectCast(cert.PublicKey.Key, RSACryptoServiceProvider)
如果需要公钥,请尝试以下操作:
msgbox(rsaProvider.ToXmlString(True)) 'Private key in XML format
msgbox(rsaProvider.ToXmlString(False)) 'Public key in XML format
msgbox(rsaProvider.ToXmlString(False)) 'Public key in XML format
接下来还有更多…看起来它应该可以工作,不是吗?不是,我认为OpenSSL也可以对任何数量的数据进行签名。。您使用EVP_SignInit、零或多个EVP_SignUpdate和一个EVP_SignFinal的组合。在OpenSSL本机包装器(如sourceforge上的OpenSSL NET)上实现ICryptoTransform和其他.NET加密接口并不难。