c# 电子协议签名demo

本文介绍了一种使用公私钥对电子文件进行签名和验证的方法。通过生成电子文件的哈希值并使用私钥进行签名,接收方可以利用公钥验证文件的真实性与完整性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
 * 由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); 
        } 
    } 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值