用C#语言怎么从本机去查到指定容器名的证书,并且去做签名,或者去进行签名的验证.我用CertOpenStore()和函数CertFindCertificateInStore去读证书的信息的时候CertFindCertificateInStore总读不出来信息,有那为朋友作过,介绍一下函数的声明,结构体的声明,谢谢

解决方案 »

  1.   

    //给指定文件生成一个数字签名文件   
      private   void   GenerateADigitalSignatureFile(string   fName,   string   fDigName)   
      {   
      DSACryptoServiceProvider   dsa   =   new   DSACryptoServiceProvider();   
      FileStream   fs   =   new   FileStream(fName,FileMode.Open,FileAccess.Read);   
      byte[]   bt   =   new   byte[fs.Length];   
      textBox7.Text   =   dsa.ToXmlString(false); //生成的公匙   
      bt   =   dsa.SignData(fs);   
      //string   str   =   BitConverter.ToString(bt);   
      FileStream   fw   =   new   FileStream(fDigName,FileMode.OpenOrCreate,FileAccess.Write);   
      fw.Write(bt,0,bt.Length);   
      fs.Close();   
      fw.Close();   
      }   
        
      //验证文件的数字签名   
      private   bool   VerifyFileDig(string   fName,   string   fDigName,   string   key)   
      {   
      DSACryptoServiceProvider   dsa   =   new   DSACryptoServiceProvider();   
      FileStream   f   =   new   FileStream(fName,FileMode.Open,FileAccess.Read);   
      byte[]   bfile   =   new   byte[f.Length];   
      f.Read(bfile,0,bfile.Length);   
      f.Close();   
        
      FileStream   fd   =   new   FileStream(fDigName,FileMode.Open,FileAccess.Read);   
      byte[]   bd   =   new   byte[fd.Length];   
      fd.Read(bd,0,bd.Length);   
      fd.Close();   
      dsa.FromXmlString(key);   
      return   dsa.VerifyData(bfile,bd);   
      }
      

  2.   

    using   System;   
      using   System.Security.Cryptography;   
      using   System.IO;   
      using   System.Text;   
      using   System.Web.Security;   
        
      namespace   Paladin.Common   
      {   
      ///   <summary>   
      ///   Security   的摘要说明。   
      ///   对称加密算法   :   DES   /   TripleDES   /   RC2   /   Rijndael   
      ///   非对称加密算法   :   DSA   /   RSA   
      ///   </summary>   
      public   class   Cryptography   
      {   
      public   Cryptography()   
      {   
      //   
      //   TODO:   在此处添加构造函数逻辑   
      //   
      }   
      //   DES     的加密方法   。   
      //   私钥加密   /   对称算法   。   
      public   static   string   Encrypt_Des(   string   cleanString   )   
      {   
      //.NET   框架提供的对称加密类需要一个密钥和一个新的   IV   来加密和解密数据。   
      //每当使用默认的构造函数创建其中一个托管对称加密类的新实例时,就会自动创建新的密钥和   IV   
      //DES   使用   64   位密钥、64   位块来加密和解密数据。每个数据块迭代   16   次以生成加密文本。   
      //初始化向量(IV)   用来第一次对数据块进行加密   。   
      byte[]   KEY_64   =   {42,   16,   93,   156,   78,   4,   218,   32}; //   指定的   Key   
      byte[]   IV_64   =   {55,   103,   246,   79,   36,   99,   167,   3}; //   初始化向量(IV)   
      DESCryptoServiceProvider   provider   =   new   DESCryptoServiceProvider   (   )   ;   
      MemoryStream   ms   =   new   MemoryStream();   
      CryptoStream   cs   =   new   CryptoStream(   ms   ,   provider.CreateEncryptor(   KEY_64,IV_64   )   ,   CryptoStreamMode.Write   )   ;   
      StreamWriter   sw   =   new   StreamWriter(   cs   )   ;   
      sw.Write(   cleanString   )   ;   
      sw.Flush(   )   ;   
      cs.FlushFinalBlock(   )   ;   
      ms.Flush(   )   ;   
      return   Convert.ToBase64String(   ms.GetBuffer(   )   ,   0   ,   int.Parse(   (   ms.Length.ToString   (   )   )   )   )   ;   
      }   
        
      //   DES     的解密方法   。   
      //   私钥加密   /   对称算法   。   
      public   static   string   Decrypt_Des(   string   encryptedString   )   
      {   
      byte[]   KEY_64   =   {42,   16,   93,   156,   78,   4,   218,   32};   
      byte[]   IV_64   =   {55,   103,   246,   79,   36,   99,   167,   3};   
      DESCryptoServiceProvider   provider   =   new   DESCryptoServiceProvider   (   )   ;   
      byte[]   buffer   =   Convert.FromBase64String(   encryptedString   )   ;   
      MemoryStream   ms   =   new   MemoryStream   (   buffer   )   ;   
      CryptoStream   cs   =   new   CryptoStream(   ms,provider.CreateDecryptor(   KEY_64,IV_64   )   ,   CryptoStreamMode.Read   )   ;   
      StreamReader   sr   =   new   StreamReader(   cs   )   ;   
      return   sr.ReadToEnd   (   )   ;   
        
      }   
        
      //   hash   加密   
      public   static   string   Encrypt_Hash(string   cleanString)   
      {   
      Byte[]   clearBytes   =   new   UnicodeEncoding().GetBytes(cleanString);   
      Byte[]   hashedBytes   =   ((HashAlgorithm)   CryptoConfig.CreateFromName("MD5")).ComputeHash(clearBytes);   
        
      return   BitConverter.ToString(hashedBytes);   
      }   
        
      //   sha1   的方式加密密码   
      public     static   String   Encrypt_Sha1(   String   oriPassWrd   )   
      {   
      String   returnstr="";   
        
      returnstr   =   FormsAuthentication.HashPasswordForStoringInConfigFile(   oriPassWrd   ,   "sha1"   );   
        
      return   returnstr;   
        
      }   
        
      //   DSA   的数字签名   
      //   RSA   类似,不过RSA比DSA慢得多,但比DSA安全。RSA可以选择关键字的大小,越大越安全   
      public   static   byte[]     DsaCrypto_SignData   (   string   content   ,   ref   string   dsaXmlString   )   
      {   
      //先要将字符串转换为字节数组,这与编码有关。   
      // String   content   =   "this   is   a   test.";   
      byte[]   bytes   =   Encoding.ASCII.GetBytes(   content   );   
      //选择签名方式,有RSA和DSA   
      DSACryptoServiceProvider   dsac   =   new   DSACryptoServiceProvider();   
      byte[]   sign   =   dsac.SignData(   bytes   );   
      //当前   Dsa   对象的   xml   表示字符串   。   
      dsaXmlString   =   dsac.ToXmlString(   false   )   ;   
      //sign便是出来的签名结果。   
      return   sign   ;   
      }   
        
      //   DSA   的数字签名认证   
      public   static   void   DsaCrypto_VerifyData   (string   content   ,   byte[]   sign   ,   string   dsaXmlString   )   
      {   
      byte[]   bytes   =   Encoding.ASCII.GetBytes(   content   );   
      //下面是认证了   
      // DSACryptoServiceProvider   dsac2   =   new   DSACryptoServiceProvider();   
      // dsac2.FromXmlString(   dsac.ToXmlString(   false   )   );   
      // bool   _verify   =   dsac2.VerifyData(   bytes,   sign   );   
      DSACryptoServiceProvider   dsac   =   new   DSACryptoServiceProvider();   
      dsac.FromXmlString(   dsaXmlString   );   
      bool   _verify   =   dsac.VerifyData(   bytes,   sign   );   
      if   (   _verify   )     
      {   
      common.setMessage   (   "通过"   )   ;   
      }     
      else     
      {   
      common.setMessage   (   "不能通过"   )   ;   
      }   
      }   
      }//class   
      }   
      

  3.   

    谢谢,你的回复.
    我这里主要是想知道怎么用pki的函数,怎么去查找已有的证书,并且从证书里获得相关的信息,来进行一些验证
      

  4.   

    不好意思,这几天密码上不来了,现在我调试程序的时候报Attemp to read or write protected
    Memory,这种错误一般怎么解决,谢谢.应该给大家结帖子了