using System.Security.Cryptography;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.OpenSsl;
using Org.BouncyCastle.Security;
private static string privateKey = @"-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAqCKSZaUnkufLHBgS12FOxf8nyLMTHg/ZlRvNs3LcmV1bRV9Y
hwTVlCQSrtOn87iGWtzlE8xeNizq9H5XI5OG527lTa+kBeYSaKrr9dExrBDGnsfH
QA+P+R3J09B/jHsvMWxIrojJoGzHGHnegatsH+8vlpDOsuyGnSTwduCCC717sBCX
Dt7G8ZkLcopFykxpBYbh/RPM/cbO+WTmmX9ag6kH4ZIQMibxQ4+xTt1a70Z/9dlP
hxGPgkqgK4Ljh5plA3KFnCYazWoHZwYUyKGI8oyYepNxJBLdw62f3/PRCUd0jRRU
0z1yTAp2GYtSmwbhoyNa5C6hQe3r/PbLMx7ecwIDAQABAoIBAQCTYfrCbwtJkzZP
4iph8kKC/S96lr7jUzF/q2edLcqCBXvES9fmQy6VNSnLZm2LDu13KLsFp9fN1YH/
39+yp9dRd7w5ZQV6xjrM1UcRq9bG5c210ZmvZfTmgl4w9ktYcYLk5+6uT+muXqwH
oIyTThjxxVEJwtXtsbgud/rxuctFTd1VNpJwE0g/G8H9agPFC6Y1OV1/Y34UaNQt
uxovhr+o14yyjalnSHYn0gx9MHe6hhGTyV/2rZduOkAUHG8I38Li/1O4wykEM4IX
7CgGx5UQkIvf+Gdu69kT+1GCot6m/tnodZNlerbN+KU7WtBZumVAlF5kniWmqfRB
SRHbiNhBAoGBAOsSRNMj2e1I9xf081p9bHb+nN10kmPG2SsuXDAhySZMRBU+PIp0
UJXAqg55x9kLFcFFEqNh2hWa57R/2sGOSAkdPkcmnLsCJw2E9t4SieGqLNxsfozc
y43fuYXVgfNHBJa5ZW9wVDn8dhr7HdUOGAZ1tw/fVhc+cHdAWCzLJwsfAoGBALca
seKeT6RH03atDpb1G6Tgl7nqSbzQOf+rKp2t7j+yiBv7cw7vWKsUfTwX8M1QClT7
KeeAdHsrk6Ai4nolvxv3l1sMu0+4BrxfRMubUj6LHudd9A+hosDdaPjucLg/Qoqo
zIoS9RJ7yZoqTH99ssqEC13EKD3YNpJPwe79StYtAoGAIqYituyF5s/mfAWDCUeL
gU6uWIYiPcrFn/PJat7QA3EiZ+8whUf3yNsJNfEFYByeLEq+II7/0kdu99AQso8C
VzWURHCQkZATqY57xOf+ouCulB752FGDP3pGok+CRBWnu3/AT9jC0XlA/2EcWJcn
O2yGezR0QCDX+vvlA1U+gAkCgYAIx0jb+ocK8z6aI/XdGuc2YmYjza23VaxSK5yh
bqNLfn20CbwcbTEtEpBmfydWUI4OQPRjWu86sH4lYUbGYGTnLFmfTd71FXeNNGwR
7uJkiTr0ELcQwMkSwgq0VIom6zF/gFQ+EmaZekHSGFEOk7Isr2P0HOFpBaKoJRbB
JHegCQKBgQDkOOWkJs+cXd067zE1W7uw0BHmBHvq6PjLoXA563Vtp8nB3FI7Ow9W
O5MGy7kQ8C69F19sZcTIDi9QWfhUJSw1PFtrsmFkzBkwGe3SvKB19VbROadJIC4b
/ntmkgyD4LCB3c0JpDn4cm6dyJSO/HbN43Duo1XQtcdmRjGjPff8mg==
-----END RSA PRIVATE KEY-----";
private static string publicKey = @"-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqCKSZaUnkufLHBgS12FO
xf8nyLMTHg/ZlRvNs3LcmV1bRV9YhwTVlCQSrtOn87iGWtzlE8xeNizq9H5XI5OG
527lTa+kBeYSaKrr9dExrBDGnsfHQA+P+R3J09B/jHsvMWxIrojJoGzHGHnegats
H+8vlpDOsuyGnSTwduCCC717sBCXDt7G8ZkLcopFykxpBYbh/RPM/cbO+WTmmX9a
g6kH4ZIQMibxQ4+xTt1a70Z/9dlPhxGPgkqgK4Ljh5plA3KFnCYazWoHZwYUyKGI
8oyYepNxJBLdw62f3/PRCUd0jRRU0z1yTAp2GYtSmwbhoyNa5C6hQe3r/PbLMx7e
-----END PUBLIC KEY-----";
public static void Main()
RSACryptoServiceProvider privateCSP = GetRSACryptoServiceProviderFromPem(privateKey, true);
RSACryptoServiceProvider publicCSP = GetRSACryptoServiceProviderFromPem(publicKey, false);
byte[] dataToSign = Encoding.UTF8.GetBytes("The quick brown fox jumps over the lazy dog");
byte[] signature = privateCSP.SignData(dataToSign, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1);
Console.WriteLine(Convert.ToBase64String(signature));
bool verified = publicCSP.VerifyData(dataToSign, signature, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1);
Console.WriteLine(verified);
RsaPrivateCrtKeyParameters privateKeyParameters = (RsaPrivateCrtKeyParameters)GetAsymmetricKeyParameterFromPem(privateKey, true);
RsaKeyParameters publicKeyParameters = (RsaKeyParameters)GetAsymmetricKeyParameterFromPem(publicKey, false);
ISigner signer = SignerUtilities.GetSigner("SHA1withRSA");
signer.Init(true, privateKeyParameters);
byte[] dataToSign = Encoding.UTF8.GetBytes("The quick brown fox jumps over the lazy dog");
signer.BlockUpdate(dataToSign, 0, dataToSign.Length);
byte[] signature = signer.GenerateSignature();
Console.WriteLine(Convert.ToBase64String(signature));
signer.Init(false, publicKeyParameters);
signer.BlockUpdate(dataToSign, 0, dataToSign.Length);
bool verified = signer.VerifySignature(signature);
Console.WriteLine(verified);
public static RSACryptoServiceProvider GetRSACryptoServiceProviderFromPem(string pem, bool isPrivate)
PemReader pemReader = new PemReader(new StringReader(pem));
object key = pemReader.ReadObject();
RSAParameters rsaParameters = isPrivate ?
DotNetUtilities.ToRSAParameters((RsaPrivateCrtKeyParameters)(((AsymmetricCipherKeyPair)key).Private)) :
DotNetUtilities.ToRSAParameters((RsaKeyParameters)key);
RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider();
rsaKey.ImportParameters(rsaParameters);
public static AsymmetricKeyParameter GetAsymmetricKeyParameterFromPem(string pem, bool isPrivate)
PemReader pemReader = new PemReader(new StringReader(pem));
object key = pemReader.ReadObject();
return isPrivate ? ((AsymmetricCipherKeyPair)key).Private : (AsymmetricKeyParameter)key;