RSA 签名用法

引用:encoding - Signing and verifying signatures with RSA C# - Stack Overflow

1.首先生成Key

using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
        {
            //Export the key information to an RSAParameters object.
            //Pass false to export the public key information or pass
            //true to export public and private key information.
            //RSAParameters RSAPublicParams = RSA.ExportParameters(false);

            //RSAParameters RSAPrivateParams = RSA.ExportParameters(false);

            var publicKye = RSA.ExportXmlPublicKey();
            var privateKye = RSA.ExportXmlPrivateKey();
        }

2. 使用上面保存的Key

var signText = "";
        var originalMessage = "this is a test.";
        using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
        {
            RSA.FromXmlString(privateKey);
            var parameterKey = RSA.ExportParameters(true);
            signText = SignData(originalMessage, parameterKey);
            Console.WriteLine(signText);
        }

        using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
        {
            RSA.FromXmlString(publickKey);
            var parameterKey = RSA.ExportParameters(false);
            var result = VerifyData(originalMessage, signText, parameterKey);
            Console.WriteLine(result);
        }


static string SignData(string message, RSAParameters privateKey)
{
     The array to store the signed message in bytes
    byte[] signedBytes;
    using (var rsa = new RSACryptoServiceProvider())
    {
         Write the message to a byte array using UTF8 as the encoding.
        byte[] originalData = Encoding.UTF8.GetBytes(message);

        try
        {
             Import the private key used for signing the message
            rsa.ImportParameters(privateKey);

             Sign the data, using SHA512 as the hashing algorithm 
            signedBytes = rsa.SignData(originalData, CryptoConfig.MapNameToOID("SHA512"));
        }
        catch (CryptographicException e)
        {
            Console.WriteLine(e.Message);
            return null;
        }
        finally
        {
             Set the keycontainer to be cleared when rsa is garbage collected.
            rsa.PersistKeyInCsp = false;
        }
    }
     Convert the a base64 string before returning
    return Convert.ToBase64String(signedBytes);
}


static bool VerifyData(string originalMessage, string signedMessage, RSAParameters publicKey)
{
    bool success = false;
    using (var rsa = new RSACryptoServiceProvider())
    {        
        try
        {
            byte[] bytesToVerify = Encoding.UTF8.GetBytes(originalMessage);

            byte[] signedBytes = Convert.FromBase64String(signedMessage);
            rsa.ImportParameters(publicKey);

            SHA512Managed Hash = new SHA512Managed();

            byte[] hashedData = Hash.ComputeHash(signedBytes);

            success = rsa.VerifyData(bytesToVerify, CryptoConfig.MapNameToOID("SHA512"), signedBytes);
        }
        catch (CryptographicException e)
        {
            Console.WriteLine(e.Message);
        }
        finally
        {
            rsa.PersistKeyInCsp = false;
        }
    }
    return success;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值