Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# RSACryptServiceProvider和openSSL之间的互操作性_C#_Openssl_Rsacryptoserviceprovider - Fatal编程技术网

C# RSACryptServiceProvider和openSSL之间的互操作性

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)); } 现

我使用.NET类rsacyptoserviceprovider来获取密钥对:

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加密接口并不难。