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;
        }
    }
  • 相关阅读:
    如何查看MySQL的当前存储引擎?
    避免生产环境执行更新删除语句忘记加where条件的解决方案
    物联网发展的现状
    目前行业内比较流行的开源时序数据库产品
    如何查看端口(3306)被那个程序占用
    MySQL数据库开发的36条军规
    介绍 MySQL 8 中值得关注的新特性和改进。
    IE浏览器 兼容性(IE9-11 差异说明)
    python3:(unicode error) 'utf-8' codec can't decode
    静态代码块
  • 原文地址:https://www.cnblogs.com/anjou/p/1023772.html
Copyright © 2011-2022 走看看