鱼C论坛

 找回密码
 立即注册
查看: 1848|回复: 17

有没有人懂电子签章

[复制链接]
发表于 2020-5-5 10:09:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
找到了一些电子签章的代码 但是实现不了 谁能教教我  留个联系方式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-5 10:18:21 | 显示全部楼层
那是个啥?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-5 10:31:17 | 显示全部楼层

关于MD5  和RSA算法的  大佬你懂C#吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-5 10:32:58 | 显示全部楼层
litianyang 发表于 2020-5-5 10:31
关于MD5  和RSA算法的  大佬你懂C#吗

不会不会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-5 10:33:30 | 显示全部楼层
litianyang 发表于 2020-5-5 10:31
关于MD5  和RSA算法的  大佬你懂C#吗

关于C的东西都让我老阔疼。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-5 10:41:12 | 显示全部楼层
涉及加密算法,没法给你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-5 10:42:52 | 显示全部楼层
乘号 发表于 2020-5-5 10:33
关于C的东西都让我老阔疼。。。

一样,我现在看见只要让我做带有C的程序,我宁可去免费给别人p几百张图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-5 11:17:48 | 显示全部楼层
不二如是 发表于 2020-5-5 10:41
涉及加密算法,没法给你

我这有代码 可以帮我看看吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-5 11:23:48 | 显示全部楼层
不二如是 发表于 2020-5-5 10:41
涉及加密算法,没法给你

调试的时候总是说缺少调试目标
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-5 12:22:25 | 显示全部楼层
js0086 发表于 2020-5-5 10:42
一样,我现在看见只要让我做带有C的程序,我宁可去免费给别人p几百张图

C也没有很难啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-5 12:23:34 | 显示全部楼层
litianyang 发表于 2020-5-5 11:17
我这有代码 可以帮我看看吗

亮出来看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-5 12:39:54 | 显示全部楼层
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);
        }
    }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-5 12:41:42 | 显示全部楼层

但是 出现了个问题C:\Users\李天洋\Desktop\代码.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-5 12:42:57 | 显示全部楼层
litianyang 发表于 2020-5-5 12:41
但是 出现了个问题

“System.UnauthorizedAccessException”类型的未经处理的异常在 mscorlib.dll 中发生
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-5 12:43:01 | 显示全部楼层
litianyang 发表于 2020-5-5 12:41
但是 出现了个问题

又是FILE 链接……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-5 12:45:25 | 显示全部楼层

不会贴图   要不加个联系方式  你看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-5 12:45:50 | 显示全部楼层
litianyang 发表于 2020-5-5 12:45
不会贴图   要不加个联系方式  你看看

emmm……那算了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-5 15:00:50 | 显示全部楼层

C对我而言是天书。。。。。。
我只懂个JavaScript,而且还快忘了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 22:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表