基于RSA的数字签名和验证C#源码


/**//* 基于RSA的数字签名和验证C#源码
 * (采用字符串作为参数)RSA_Demo3
 * 
 * 夏春涛 Email:xChuntao@163.com 
 * Blog:http://bluesky521.cnblogs.com
 * 运行环境:.net2.0 framework
 */

/**//* 备注:
 * 若要使用公钥系统对消息进行数字签名,发送方先向该消息应用哈希函数以创建消息摘要。
 * 然后,发送方用自己的私钥对消息摘要进行加密,以创建发送方的个人签名。在收到消息和
 * 签名后,接收方使用发送方的公钥解密该签名,以恢复消息摘要,并使用发送方所用的同一
 * 哈希算法对该消息进行哈希运算。如果接收方计算的消息摘要与从发送方收到的消息摘要完
 * 全匹配,则接收方可以假定消息在传输中未被更改。请注意,因为发送方的公钥是公共知识,
 * 所以任何人都可以验证签名。
 */

using System;
using System.Security.Cryptography;
using System.Text;

class RSACSPSample
{
    static void Main()
    {
        try
        {

            string str_DataToSign = @"Data to Sign!Data to Sign!Data to Sign!";
            Console.WriteLine("原文:" + str_DataToSign);
            Console.WriteLine("长度:" + str_DataToSign.Length.ToString());
            Console.WriteLine();

            RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider();

            string str_Private_Key = Convert.ToBase64String( RSAalg.ExportCspBlob(true) );
            string str_Public_Key = Convert.ToBase64String( RSAalg.ExportCspBlob(false) );
            Console.WriteLine("公钥:" + str_Public_Key);
            Console.WriteLine();
            Console.WriteLine("私钥:" + str_Private_Key);
            Console.WriteLine();

            string str_SignedData = HashAndSign(str_DataToSign, str_Private_Key);// Hash and sign the data.
            Console.WriteLine("签名数据:" + str_SignedData);
            Console.WriteLine();

            if (VerifySignedHash(str_DataToSign, str_SignedData, str_Public_Key))
            {
                Console.WriteLine("验证签名OK.");
            }
            else
            {
                Console.WriteLine("签名不匹配!");
            }
            Console.WriteLine();

        }
        catch (ArgumentNullException)
        {
            Console.WriteLine("The data was not signed or verified");

        }
    }

    //对数据签名
    public static string HashAndSign(string str_DataToSign, string str_Private_Key)
    {
        ASCIIEncoding ByteConverter = new ASCIIEncoding();
        byte[] DataToSign = ByteConverter.GetBytes(str_DataToSign);
        try
        {
            RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider();
            RSAalg.ImportCspBlob( Convert.FromBase64String(str_Private_Key) );
            byte[] signedData = RSAalg.SignData(DataToSign, new SHA1CryptoServiceProvider());
            string str_SignedData = Convert.ToBase64String(signedData);
            return str_SignedData;
        }
        catch (CryptographicException e)
        {
            Console.WriteLine(e.Message);
            return null;
        }
    }

    //验证签名
    public static bool VerifySignedHash(string str_DataToVerify, string str_SignedData, string str_Public_Key)
    {
        byte[] SignedData = Convert.FromBase64String(str_SignedData);

        ASCIIEncoding ByteConverter = new ASCIIEncoding();
        byte[] DataToVerify = ByteConverter.GetBytes(str_DataToVerify);
        try
        {
            RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider();
            RSAalg.ImportCspBlob( Convert.FromBase64String(str_Public_Key) );

            return RSAalg.VerifyData(DataToVerify, new SHA1CryptoServiceProvider(), SignedData);

        }
        catch (CryptographicException e)
        {
            Console.WriteLine(e.Message);

            return false;
        }
    }
}


附件:/Files/bluesky521/RSA_Demo.rar

时间: 2024-10-13 13:50:00

基于RSA的数字签名和验证C#源码的相关文章

数据库建模 数据库-基于web的数据库建模系统的源码!重谢!!!!!!!发邮箱1439943801@qq.com

问题描述 基于web的数据库建模系统的源码!重谢!!!!!!!发邮箱1439943801@qq.com 求基于web的数据库建模系统的源码!网页版的数据库建模平台,最简单的就行我重谢!!!!!!!发邮箱1439943801@qq.com

基于jQuery实现的扇形定时器附源码下载_jquery

效果图如下所示: 效果演示  源码下载 Pietimer是一个可以在页面上生成一个扇形变化的定时器,它基于jQuery,可以自定义定时时间秒数,自定义扇形的颜色.宽度和高度等,并且支持定时结束时回调函数,可以控制开始和暂停,适用于需要定时器的页面如在线考试.限时抢购的场景. HTML 首先加载jquery库文件和pietimer.js文件. <script src="jquery.min.js"></script> <script src="jq

基于jQuery实现选取月份插件附源码下载_jquery

这是一个基于jQuery的可以选择年份和月份的月份拾取插件,你可以设置点击页面上的任意元素触发弹出年月选择面板,可以是一个链接也可以是一个输入框,广泛应用于月份查询,而无需设置select表单. 效果展示        源码下载   HTML 首先将monthpicker插件相关的css和js文件载入,大家可以到源码下载里下载css和js文件. <link rel="stylesheet" type="text/css" href="jquery.m

一文详解如何用 TensorFlow 实现基于 LSTM 的文本分类(附源码)

 引言 学习一段时间的tensor flow之后,想找个项目试试手,然后想起了之前在看Theano教程中的一个文本分类的实例,这个星期就用tensorflow实现了一下,感觉和之前使用的theano还是有很大的区别,有必要总结mark一下.   模型说明 这个分类的模型其实也是很简单,主要就是一个单层的LSTM模型,当然也可以实现多层的模型,多层的模型使用Tensorflow尤其简单,下面是这个模型的图  简单解释一下这个图,每个word经过embedding之后,进入LSTM层,这里LSTM是

基于jsp实现新闻管理系统 附完整源码_JSP编程

很棒的新闻发布系统分享给大家,希望大家喜欢. 下面就让我们来说一说基于jsp的新闻发布系统,其中使用的技术有JavaBean.fillter.数据库等,能够实现新闻的发布功能,在发布之后能够进行对每一条新闻的删除.修改.或者继续增加新的文章,最后还能够进行查询功能,其中引用了百度编辑器,能够进行图文并茂的编辑,极大地方便用户的使用. 注:完整项目下载地址:新闻发布系统 一.效果演示 首先让我们来看一看实现的效果: 下面是登陆的首界面: 图1 首界面 管理员登录页面: 图2 管理员登录界面 下面是

网站验证-求源码 大神在那里 出来告诉我 感谢了

问题描述 求源码 大神在那里 出来告诉我 感谢了 求网站登录注册的源码能存进oracle数据库 能判定是否为空什么的. 感谢了 解决方案 http://www.docin.com/p-681020663.html 解决方案二: 楼上的猫大神 人家要的是简单的登录记录源代码 你给他这个 笑死

基于Ajax asp的留言板示例源码

ajax.asp <% dim conn,rs dim connstr dim sqlcmd '创建数据库教程连接对象并打开 set conn=server.createobject("adodb.connection") connstr="provider=microsoft.jet.oledb.4.0;data source=" & server.mappath("guestbook.mdb") conn.open connst

ym——android源码大放送(实战开发必备)

文件夹 PATH 列表 卷序列号为 000A-8F50 E:. │  javaapk.com文件列表生成工具.bat │  使用说明.txt │  免费下载更多源码.url │  目录列表.txt │   ├─android web应用 │      jqmDemo_static.zip │      jqmMobileDemo-master.zip │      jqmMobileDemo1_1-master.zip │      Location1014.rar │ ├─anko │    

C#源码500份

C Sharp  短信发送平台源代码.rar http://1000eb.com/5c6v ASP.NET+AJAX基础示例 视频教程 http://1000eb.com/89jc C# Winform qq弹窗 360弹窗 http://1000eb.com/89jf 精华志 C#高级编程(第七版)源码 http://1000eb.com/89k3 C#网络应用编程教案及代码.rar http://1000eb.com/89kh IPhone远程桌面xp控制+Desktop+Connect教程