zoukankan      html  css  js  c++  java
  • VS2008 椭圆曲线签名(ECDSA)

        椭圆曲线签名(ECDSA)相对传统签名算法具有速度快、强度高、签名短等优点,其用途也越来越广泛了,Microsoft 产品的25位的CDKey中就使用了椭圆曲线签名算法。如今使用 VS2008 也能方便的进行椭圆曲线签名(ECDSA)了。遗憾的是 VS2008 提供的椭圆曲线签名目前只能在 Windwos Vista 上使用。

        椭圆曲线签名(ECDSA)的工作原理与大多数签名算法类似,都是使用私钥进行签名,使用公钥进行验证。其模式与其他托管加密类相同,只是椭圆曲线签名(ECDSA)密钥存储在 CNG 中。使用 CNG 您可以安全地存储密钥对、公钥并使用简单的字符串名称对其进行引用;使用 CngKey 类对密钥进行打开、创建、删除和导出等操作。

    public class ECDSALibrary
    {
        
    public static void Test()
        {
            
    // 密钥名称
            string keyName = "Anjou's ECDSA Key";
            
    // 公钥,私钥
            byte[] publicKeyBytes, privateKeyBytes;

            CngKey cngKey;
            
    // 打开密钥
            if (CngKey.Exists(keyName))
            {
                cngKey 
    = CngKey.Open(keyName);
                
    //cngKey.Delete();
            }
            
    // 生成密钥
            else 
            {               
                CngKeyCreationParameters creationParameters 
    = new CngKeyCreationParameters();
                
    // 允许以明文的形式导出私钥
                creationParameters.ExportPolicy = CngExportPolicies.AllowPlaintextExport;
                
    // 使用 ECDsaP256,ECDsaP384,ECDsaP521 签名长度分别是 64 Bytes, 96 Bytes, 132 Bytes。
                cngKey = CngKey.Create(CngAlgorithm.ECDsaP256, keyName, creationParameters);
            }

            
    // 导出公钥
            publicKeyBytes = cngKey.Export(CngKeyBlobFormat.EccPublicBlob);
            
    // 导出私钥
            privateKeyBytes = cngKey.Export(CngKeyBlobFormat.EccPrivateBlob);

            
    // 签名数据
            byte[] data = Encoding.Unicode.GetBytes("这里是要签名的字符串。");
            
    // 签名
            byte[] signature = SignData(data, keyName);
            
    // 验证签名
            bool verified = VerifyData(data,signature,publicKeyBytes);
        }


        
    /// <summary>
        
    /// 使用私钥签名
        
    /// </summary>
        public static byte[] SignData(byte[] data, string keyName)
        {
            
    // 打开密钥
            CngKey cngKey = CngKey.Open(keyName);
            
    // 签名
            ECDsaCng ecdsa = new ECDsaCng(cngKey);
            
    byte[] signature = ecdsa.SignData(data);
            ecdsa.Clear();
            cngKey.Dispose();
            
    return signature;
        }

        
    /// <summary>
        
    /// 使用公钥验证签名
        
    /// </summary>
        public static bool VerifyData(byte[] data, byte[] signature, byte[] publicKey)
        {
            
    bool verified = false;
            
    // 导入公钥
            CngKey cngKey = CngKey.Import(publicKey, CngKeyBlobFormat.EccPublicBlob);
            
    // 验证签名
            ECDsaCng ecdsa = new ECDsaCng(cngKey);
            verified 
    = ecdsa.VerifyData(data, signature);
            ecdsa.Clear();
            cngKey.Dispose();
            
    return verified;
        }
    }
  • 相关阅读:
    面向对象
    Spring学习(十四)----- Spring Auto Scanning Components —— 自动扫描组件
    Spring学习(十三)-----Spring 表达式语言(Spring EL)
    Spring学习(十二)-----Spring @PostConstruct和@PreDestroy实例
    Spring学习(十二)-----Spring Bean init-method 和 destroy-method实例
    学习计划
    Spring学习(十一)-----Spring使用@Required注解依赖检查
    Spring学习(十)-----Spring依赖检查
    Spring学习(九)-----Spring bean配置继承
    Spring学习(八)-----Spring注入值到集合类型的例子
  • 原文地址:https://www.cnblogs.com/anjou/p/1023772.html
Copyright © 2011-2022 走看看