bal*_*int 8 c# security encryption cryptography
我在Java中有以下代码示例,我需要在C#中重新编写它:
PKCS8EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(pkcs8PrivateKey);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privKey = keyFactory.generatePrivate(privKeySpec);
Signature sign = Signature.getInstance("MD5withRSA");
sign.initSign(privKey);
sign.update(data);
byte[] signature = sign.sign();
Run Code Online (Sandbox Code Playgroud)
是否可以使用标准的.Net Crypto API,还是应该使用BouncyCastle?谢谢,
湾
另一种方法是使用CNG(下一代加密)以及CodePlex的Security.Cryptography DLL
然后你可以写:
byte[] dataToSign = Encoding.UTF8.GetBytes("Data to sign");
using (CngKey signingKey = CngKey.Import(pkcs8PrivateKey, CngKeyBlobFormat.Pkcs8PrivateBlob))
using (RSACng rsa = new RSACng(signingKey))
{
rsa.SignatureHashAlgorithm = CngAlgorithm.MD5;
return rsa.SignData(dataToSign);
}
Run Code Online (Sandbox Code Playgroud)
感谢Simon Mourier:使用.Net 4.6,您不再需要单独的库
我在尝试创建一个用于打包 Chrome 扩展的本机 C# 工具时遇到了一个非常类似的问题(使用 SHA1,而不是 MD5,但这并不是很大的区别)。我相信我已经尝试了 .Net 的所有可能的解决方案:System.Security.Cryptography、BouncyCastle、OpenSSL.Net 和 Chilkat RSA。
最好的解决方案可能是 Chilkat;他们的界面是最干净和最直接的,它得到良好的支持和良好的文档记录,并且有一百万个示例。例如,这里有一些使用他们的库的代码,它的功能非常接近您想要的功能:http://www.example-code.com/csharp/rsa_signPkcs8.asp。然而,它不是免费的(尽管 150 美元也不是不合理,因为我花了 2 天时间试图解决这个问题,而且我每天赚的钱比 75 美元多一点!)。
作为免费的替代方案,JavaScience 在http://www.jensign.com/JavaScience/cryptoutils/index.html上提供了许多适用于多种语言(包括 C#/.Net)的源代码形式的加密实用程序。对于您想要做的事情来说,最重要的是 opensslkey ( http://www.jensign.com/opensslkey/index.html ),它可以让您从 .pem 文件生成 RSACryptoServiceProvider。然后,您可以使用该提供商来签署您的代码:
string pemContents = new StreamReader("pkcs8privatekey.pem").ReadToEnd();
var der = opensslkey.DecodePkcs8PrivateKey(pemContents);
RSACryptoServiceProvider rsa = opensslkey.DecodePrivateKeyInfo(der);
signature = rsa.SignData(data, new MD5CryptoServiceProvider());
Run Code Online (Sandbox Code Playgroud)