public class ECDSAClass
{
internal static CngKey aliceKeySignature;
internal static byte[] alicePubKeyBlob;
/// <summary>
/// 主调度方法,数字签名
/// </summary>
public static void MShow()
{
CreateKeys();
byte[] aliceData = Encoding.UTF8.GetBytes("Alice");
byte[] aliceSignature = CreateSignature(aliceData, aliceKeySignature);
Console.WriteLine("Alice created signature:{0}", Convert.ToBase64String(aliceSignature));
if (VerifySignature(aliceData, aliceSignature, alicePubKeyBlob))
{
Console.WriteLine("Alice signature verified successfully");
}
}
//验证数据
private static bool VerifySignature(byte[] data, byte[] aliceSignature, byte[] pubkey)
{
bool retvalue = false;
using (CngKey key = CngKey.Import(pubkey, CngKeyBlobFormat.GenericPublicBlob))
{
var signingAlg = new ECDsaCng(key);
retvalue = signingAlg.VerifyData(data, aliceSignature);
signingAlg.Clear();
}
return retvalue;
}
//加密数据
private static byte[] CreateSignature(byte[] data, CngKey key)
{
var signingAlg = new ECDsaCng(key);
byte[] signature = signingAlg.SignData(data);
signingAlg.Clear();
return signature;
}
/// <summary>
/// 创建密钥
/// </summary>
private static void CreateKeys()
{
//创建密钥
aliceKeySignature = CngKey.Create(CngAlgorithm.ECDsaP256);
//导出公钥
alicePubKeyBlob = aliceKeySignature.Export(CngKeyBlobFormat.GenericPublicBlob);
}