小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

C#編程總結(jié)(八)數(shù)字簽名

 goldbomb 2014-01-29

在日常工作中,有很多文件需要領(lǐng)導(dǎo)審閱、簽名和蓋章,由于公司業(yè)務(wù)開展,跨地域、跨國業(yè)務(wù)也日益普遍,領(lǐng)導(dǎo)簽名蓋章變得很麻煩,開始的時候人們通過郵寄、傳真等方式來解決,但是耗費時間、人力、物力。在網(wǎng)絡(luò)化日益深入的今天,需要領(lǐng)導(dǎo)審批、簽字蓋章的東西越來越多,時間也越來越緊迫,數(shù)字簽名的出現(xiàn),很好了解決了這一問題。推動了互聯(lián)網(wǎng)及跨國集團(tuán)的發(fā)展。

數(shù)字簽名

1、概念

數(shù)字簽名基于哈希算法和公鑰加密算法,對明文報文先用哈希算法計算摘要,然后用私鑰對摘要進(jìn)行加密,得到的值就是原文的數(shù)字簽名。

數(shù)字簽名(又稱公鑰數(shù)字簽名、電子簽章)是一種類似寫在紙上的普通的物理簽名,但是使用了公鑰加密領(lǐng)域的技術(shù)實現(xiàn),用于鑒別數(shù)字信息的方法。

一套數(shù)字簽名通常定義兩種互補的運算,一個用于簽名,另一個用于驗證。

可以由下圖表示電子簽名的用處:

2、工作原理

流程圖如下:

  數(shù)字簽名的使用一般涉及以下幾個步驟,我們通過安全電子郵件為案例進(jìn)行介紹

  (1)發(fā)件人生成或取得獨一無二的加密密碼組,包括私鑰和公鑰。

  (2)發(fā)件人書寫電子郵件

  (3)發(fā)件人用安全的摘要算法獲取電子郵件的信息摘要

      (4)發(fā)件人再使用私鑰對信息摘要進(jìn)行加密,即可得到數(shù)字簽名?! ?/p>

  (5)發(fā)件人將數(shù)字簽名附在信息之后.

  (6)發(fā)件人將數(shù)字簽名和信息(加密或未加密)發(fā)送給電子收件人.

  (7)收件人使用發(fā)件人的公共密碼(公鑰)確認(rèn)發(fā)件人的電子簽名,即將發(fā)件人的數(shù)字簽名通過公鑰進(jìn)行解密,得到信息摘要

  (8)收件人使用同樣安全的摘要算法,獲取信息(加密或未加密)的"信息摘要".

  (9)收件人比較兩個信息摘要.假如兩者相同,則收件人可以確信信息在簽發(fā)后并未作任何改變

  (10) 收件人從證明機(jī)構(gòu)處獲得認(rèn)證證書(或者是通過信息發(fā)件人獲得),這一證書用以確認(rèn)發(fā)件人發(fā)出信息上的數(shù)字簽名的真實性.證明機(jī)構(gòu)在數(shù)字簽名系統(tǒng)中是一個典型的受委托管理證明業(yè)務(wù)的第三方.該證書包含發(fā)件人的公共密碼和姓名(以及其他可能的附加信息),由證明機(jī)構(gòu)在其上進(jìn)行數(shù)字簽名.

  其中,第(1)~(6)是數(shù)字簽名的制作過程,(7)~(10)是數(shù)字簽名的核實過程

3、主要作用

1、防冒充,因為私鑰只有簽名者自己知道,其他人不能偽造出正確的簽名
2、可鑒別身份,接收方用發(fā)送方的公開公鑰對報文簽名進(jìn)行解密運算后,和原文進(jìn)行匹配
3、防篡改,明文和簽名值一起發(fā)送,相互驗證,防止數(shù)據(jù)被篡改
4、防抵賴,簽名值可以鑒別身份,帶簽名的數(shù)據(jù)里包含的信息簽名者是不能抵賴的

4、應(yīng)用

現(xiàn)在典型的應(yīng)用如:網(wǎng)上銀行、電子商務(wù)、電子政務(wù)、網(wǎng)絡(luò)通信等

其中一個最重要的應(yīng)用場景為:數(shù)字的證書,后續(xù)有具體文章對其進(jìn)行詳細(xì)介紹。

5、通過RSA實現(xiàn)數(shù)字簽名

數(shù)字簽名

復(fù)制代碼
        /// <summary>
        /// 數(shù)字簽名
        /// </summary>
        /// <param name="plaintext">原文</param>
        /// <param name="privateKey">私鑰</param>
        /// <returns>簽名</returns>
        public static string HashAndSignString(string plaintext, string privateKey)
        {
            UnicodeEncoding ByteConverter = new UnicodeEncoding();
            byte[] dataToEncrypt = ByteConverter.GetBytes(plaintext);

            using (RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider())
            {
                RSAalg.FromXmlString(privateKey);
                //使用SHA1進(jìn)行摘要算法,生成簽名
                byte[] encryptedData = RSAalg.SignData(dataToEncrypt, new SHA1CryptoServiceProvider());
                return Convert.ToBase64String(encryptedData);
            }
        }
復(fù)制代碼

 

簽名認(rèn)證:

復(fù)制代碼
        /// <summary>
        /// 驗證簽名
        /// </summary>
        /// <param name="plaintext">原文</param>
        /// <param name="SignedData">簽名</param>
        /// <param name="publicKey">公鑰</param>
        /// <returns></returns>
        public static bool VerifySigned(string plaintext, string SignedData, string publicKey)
        {
            using (RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider())
            {
                RSAalg.FromXmlString(publicKey);
                UnicodeEncoding ByteConverter = new UnicodeEncoding();
                byte[] dataToVerifyBytes = ByteConverter.GetBytes(plaintext);
                byte[] signedDataBytes = Convert.FromBase64String(SignedData);
                return RSAalg.VerifyData(dataToVerifyBytes, new SHA1CryptoServiceProvider(), signedDataBytes);
            }
        }
復(fù)制代碼

測試用例:

復(fù)制代碼
        public static void TestSign()
        {
            string originalData = "文章不錯,這是我的簽名:奧巴馬!";
            Console.WriteLine("簽名數(shù)為:{0}",originalData);
            KeyValuePair<string,string> keyPair = Encrypter.CreateRSAKey();
            string privateKey = keyPair.Value;
            string publicKey = keyPair.Key;

            //1、生成簽名,通過摘要算法
            string signedData = Encrypter.HashAndSignString(originalData, privateKey);
            Console.WriteLine("數(shù)字簽名:{0}",signedData);

            //2、驗證簽名
            bool verify = Encrypter.VerifySigned(originalData, signedData,publicKey);
            Console.WriteLine("簽名驗證結(jié)果:{0}",verify);
        }
復(fù)制代碼

 

源碼地址:

http://files.cnblogs.com/yank/EncriptSample.zip

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多