c# 电子协议签名demo

/*
 * 由SharpDevelop创建。
 * 用户: Administrator
 * 日期: 2018-04-17
 * 时间: 15:12
 * 
 * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件
 */

using System; 
using System.IO; 
using System.Security.Cryptography;

namespace oozinoz1 

     /**//// <summary> 
     /// Class5 的摘要说明。 
     /// </summary> 
     public class Class5 
    { 
         static void Main_() 
        { 
             // 生成电子文件 
             string filePath = "C:\\公文.txt"
             StreamWriter sw = File. CreateText(filePath); 
            sw. Write( "测试公文"); 
            sw. Close();

             // 对电子文件进行哈希             
             byte[] fileHash = GetFileHash(filePath); 
             // 取得公钥 
             string publicKey = GetKeyFromContainer( "公文", false); 
             // 取得私钥 
             string privateKey = GetKeyFromContainer( "公文", true);

             Console. WriteLine( "发送方:A"); 
             Console. WriteLine( "电子文件地址:"); 
             Console. WriteLine(filePath);

             Console. WriteLine( "哈希:"); 
             Console. WriteLine( ConvertBytesToString(fileHash));

             Console. WriteLine( "使用私钥进行数字签名:"); 
             // 取得电子签名 
             byte[] ElectronicSignature = EncryptHash(privateKey,fileHash); 
             Console. WriteLine( ConvertBytesToString(ElectronicSignature));

             Console. WriteLine( "传送给接收方。"); 
             Console. WriteLine( ""); 
             string fileCopyPath = "C:\\公文接收.txt"
             File. Copy(filePath,fileCopyPath, true);

             Console. WriteLine( "是否篡改文件?(Y/N)"); 
             string sRe = string. Empty
             do 
            { 
                sRe = Console. ReadLine(); 
            } 
             while(sRe != "Y" && sRe != "N"); 
             
             byte[] fileCopyHash; 
             if(sRe == "N"
            { 
                 Console. WriteLine( "接收方收到电子文件。");

                 Console. WriteLine( "接收方:B"); 
                 Console. WriteLine( "接收文件地址:"); 
                 Console. WriteLine(fileCopyPath);

                fileCopyHash = GetFileHash(fileCopyPath); 
                 Console. WriteLine( "哈希:"); 
                 Console. WriteLine( ConvertBytesToString(fileCopyHash)); 
            } 
             else 
            { 
                 Console. WriteLine( "正在篡改文件。"); 
                sw = new StreamWriter(fileCopyPath); 
                sw. WriteLine( "公文已被篡改。"); 
                sw. Close(); 
                 
                 Console. WriteLine( "接收方收到电子文件。");

                 Console. WriteLine( "接收方:"); 
                 Console. WriteLine( "接收文件地址:"); 
                 Console. WriteLine(fileCopyPath);

                fileCopyHash = GetFileHash(fileCopyPath); 
                 Console. WriteLine( "哈希:"); 
                 Console. WriteLine( ConvertBytesToString(fileCopyHash)); 
            }

             Console. WriteLine( "公钥:"); 
             Console. WriteLine(publicKey);

             //使用公钥进行验证 
             Console. WriteLine( "使用公钥进行验证:"); 
             if( DecryptHash(publicKey,fileCopyHash,ElectronicSignature)) 
            { 
                 Console. WriteLine( "通过验证,电子文件合法有效。"); 
            } 
             else 
            { 
                 Console. WriteLine( "未通过验证,电子文件非法或被人篡改过。"); 
            }

             Console. Read();             
        }

         /**//// <summary> 
         /// 将Byte[]转换成十六进制字符串 
         /// </summary> 
         /// <param name="bytes">要转换的Byte[]</param> 
         /// <returns>十六进制字符串</returns> 
         public static string ConvertBytesToString( byte[] bytes) 
        { 
             string bytestring = string. Empty
             if(bytes != null && bytes.Length > 0
            { 
                 for( int i = 0;i<bytes.Length;i++) 
                { 
                    bytestring += bytes[i]. ToString( "X") + " "
                } 
            } 
             return bytestring; 
        }

         /**//// <summary> 
         /// 得到指定电子文件的哈希 
         /// </summary> 
         /// <param name="filePath">电子文件地址</param> 
         /// <returns>哈希值</returns> 
         public static byte[] GetFileHash( string filePath) 
        { 
             try 
            { 
                 FileStream objFile = File. OpenRead(filePath); 
                 HashAlgorithm MD5 = HashAlgorithm. Create( "MD5"); 
                 byte[] Hashbyte = MD5. ComputeHash(objFile); 
                objFile. Close(); 
                 return Hashbyte;         
            } 
             catch 
            { 
                 return null
            } 
        }

         /**//// <summary> 
         /// 得到公钥与私钥 
         /// </summary> 
         /// <param name="ContainerName">私钥容器名</param> 
         /// <param name="privatekey">真为得到私钥,假为得到公钥</param> 
         /// <returns>公钥或私钥</returns> 
         public static string GetKeyFromContainer( string ContainerName, bool privatekey) 
        { 
             CspParameters cp = new CspParameters(); 
            cp. KeyContainerName = ContainerName; 
             RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp); 
             return rsa. ToXmlString(privatekey); 
        }

         /**//// <summary> 
         /// 对哈希进行数字签名 
         /// </summary> 
         /// <param name="privateKey">私钥</param> 
         /// <param name="fileHash">电子文件哈希</param> 
         /// <returns></returns> 
         public static byte[] EncryptHash( string privateKey, byte[] fileHash) 
        { 
             RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

            RSA. FromXmlString(privateKey);

             RSAPKCS1SignatureFormatter RSAFormatter = new RSAPKCS1SignatureFormatter(RSA); 
             
            RSAFormatter. SetHashAlgorithm( "MD5"); 
             
             return RSAFormatter. CreateSignature(fileHash); 
        }

         /**//// <summary> 
         /// 对数字签名用公钥进行验证 
         /// </summary> 
         /// <param name="publicKey">公钥</param> 
         /// <param name="fileHash">接收到的电子文件的哈希</param> 
         /// <param name="electronicSignature">数字签名</param> 
         /// <returns>数字签名有效为真,数字签名无效为假</returns> 
         public static bool DecryptHash( string publicKey, byte[] fileHash, byte[] electronicSignature) 
        { 
             RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

            RSA. FromXmlString(publicKey);

             RSAPKCS1SignatureDeformatter RSADeformatter = new RSAPKCS1SignatureDeformatter(RSA);

            RSADeformatter. SetHashAlgorithm( "MD5");

             return RSADeformatter. VerifySignature(fileHash,electronicSignature); 
        } 
    } 
}

猜你喜欢

转载自blog.csdn.net/pxgame/article/details/79986113