Kit.Core/LibCommon/Kit.Core.Helpers/Rsa/DigitalSignature.cs

88 lines
2.5 KiB
C#

namespace Kit.Helpers.Rsa
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
public class DigitalSignature
{
private string _publicKey;
private string _privateKey;
private int _dwKeySize;
public string PublicKey { get { return _publicKey; } }
public string PrivateKey { get { return _privateKey; } }
public DigitalSignature(int dwKeySize)
{
_dwKeySize = dwKeySize;
}
public void AssignKey(string publicKey, string privateKey)
{
_publicKey = publicKey;
_privateKey = privateKey;
}
public void AssignNewKey()
{
using (var rsa = new RSACryptoServiceProvider(_dwKeySize))
{
rsa.PersistKeyInCsp = false;
_publicKey = rsa.ToXmlString(false);
_privateKey = rsa.ToXmlString(true);
}
}
public byte[] SignData(string data)
{
return SignData(Encoding.UTF8.GetBytes(data));
}
public byte[] SignData(byte[] data)
{
using (var rsa = new RSACryptoServiceProvider(_dwKeySize))
{
byte[] hash;
using (SHA256 sha256 = SHA256.Create())
{
hash = sha256.ComputeHash(data);
}
rsa.PersistKeyInCsp = false;
rsa.FromXmlString(_privateKey);
var rsaFormatter = new RSAPKCS1SignatureFormatter(rsa);
rsaFormatter.SetHashAlgorithm("SHA256");
return rsaFormatter.CreateSignature(hash);
}
}
public bool VerifySignature(string data, byte[] signature)
{
return VerifySignature(Encoding.UTF8.GetBytes(data), signature);
}
public bool VerifySignature(byte[] data, byte[] signature)
{
using (var rsa = new RSACryptoServiceProvider(_dwKeySize))
{
byte[] hash;
using (SHA256 sha256 = SHA256.Create())
{
hash = sha256.ComputeHash(data);
}
rsa.FromXmlString(_publicKey);
var rsaDeformatter = new RSAPKCS1SignatureDeformatter(rsa);
rsaDeformatter.SetHashAlgorithm("SHA256");
return rsaDeformatter.VerifySignature(hash, signature);
}
}
}
}