C# Sign Data with RSA using BouncyCastle

匿名 (未验证) 提交于 2019-12-03 01:40:02

问题:

Does anyone know of a simple tutorial or sample code of how to sign data in c# using bouncy castle. In Java there are tons of tutorials and samples. I can't find a single example in c#. Does anyone know how to do this?

回答1:

Okay I could not find any documentation on how to do this. But I ended up figuring it out. I am pasting the full code here so hopefully it can help someone in the future.

This class will calculate a RSA signature with a sha1 hash for the provided string and verify it as well.

using System; using System.IO; using System.Text; using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.OpenSsl; using Org.BouncyCastle.Security; using Org.BouncyCastle.Utilities.Encoders;  namespace API.Crypto {     public class RsaSha1Signing     {         private RsaKeyParameters MakeKey(String modulusHexString, String exponentHexString, bool isPrivateKey)         {             var modulus = new Org.BouncyCastle.Math.BigInteger(modulusHexString, 16);             var exponent = new Org.BouncyCastle.Math.BigInteger(exponentHexString, 16);              return new RsaKeyParameters(isPrivateKey, modulus, exponent);         }          public String Sign(String data, String privateModulusHexString, String privateExponentHexString)         {             /* Make the key */             RsaKeyParameters key = MakeKey(privateModulusHexString, privateExponentHexString, true);              /* Init alg */             ISigner sig = SignerUtilities.GetSigner("SHA1withRSA");              /* Populate key */             sig.Init(true, key);              /* Get the bytes to be signed from the string */             var bytes = Encoding.UTF8.GetBytes(data);              /* Calc the signature */             sig.BlockUpdate(bytes, 0, bytes.Length);             byte[] signature = sig.GenerateSignature();              /* Base 64 encode the sig so its 8-bit clean */             var signedString = Convert.ToBase64String(signature);              return signedString;         }          public bool Verify(String data, String expectedSignature, String publicModulusHexString, String publicExponentHexString)         {             /* Make the key */             RsaKeyParameters key = MakeKey(publicModulusHexString, publicExponentHexString, false);              /* Init alg */             ISigner signer = SignerUtilities.GetSigner("SHA1withRSA");              /* Populate key */             signer.Init(false, key);              /* Get the signature into bytes */             var expectedSig = Convert.FromBase64String(expectedSignature);              /* Get the bytes to be signed from the string */             var msgBytes = Encoding.UTF8.GetBytes(data);              /* Calculate the signature and see if it matches */             signer.BlockUpdate(msgBytes, 0, msgBytes.Length);             return signer.VerifySignature(expectedSig);         }     } } 


回答2:

Look at Bouncy Castle web site. There is archive with sources and examples. http://www.bouncycastle.org/csharp/download/bccrypto-net-1.7-src-ext.zip

As a examples there are a lot of NUnit tests. Below is code of method to encrypt data byte array using RSA algorithm as a sample, but in Bouncy Castle sources and tests you can find more samples.

    public static byte[] Encrypt(byte[] data, AsymmetricKeyParameter key)     {         RsaEngine e = new RsaEngine();         e.Init(true, key);         int blockSize = e.GetInputBlockSize();         List output = new List();          for (int chunkPosition = 0; chunkPosition 


回答3:

Have you tried Signtool. This tool will be under Microsoft framework folder.



回答4:

.NET doesn't expose encryption algorithms for selection. And there are a lot of tutorials for RSA.

For example.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!