.Net加密与解密——非对称加密之数字签名

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介:   一,从非对称加密的认证模式说起 由消息的发送方发布公钥,持有私钥。   步骤: 1,发送方公布自己的公钥,任何人都可以获得。 2,发送方使用自己的私钥对消息进行加密,然后发送。





  一,从非对称加密的认证模式说起



由消息的发送方发布公钥,持有私钥。

 

步骤:

1,发送方公布自己的公钥,任何人都可以获得。

2,发送方使用自己的私钥对消息进行加密,然后发送。

3,接收方使用发送方的公钥对消息进行解密。

 

 

缺点:

1,任何截获该消息的第三方都能够使用发送方公钥进行解密;

2,耗时,不适用于大数据



  二,数字签名


      过程:


1,发送方对想要传递的消息进行散列运算,得到原始消息摘要。(摘要可以代表消息本身,相当于指纹)


2,发送方使用自己的私钥只对消息摘要进行加密,该过程也称作签名。将消息和加密后的摘要发送给接收方。由于摘要非常小,因此次采用非对称加密运算速度也很快。


3,接收方使用发送方的公钥对消息摘要进行解密,确认了发送方,并得到原始消息摘要。接收方对收到的消息进行散列运算,得到一个本地消息摘要。


4,接收方对比原始的消息摘要和本地消息摘要。如果相同,说明消息没有被改动过;如果不同,说明消息已经被改动过;


  优点:

          1,解决了非对称加密中认证模式比较耗时间的问题。

       

 缺点:

  1,只对摘要进行了加密,并未对消息进行加密,一旦被截获,即可查看该消息。




三,数字签名Demo


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;

namespace 数字签名
{
    class Program
    {
        static void Main(string[] args)
        {
            //发送方
            string plainTest = "hello world";
            string privateKey = "<RSAKeyValue><Modulus>qA89WuhLCmvYHJqw+mfjRZ6Ep8xuicvRkVWkuufRHBAmLgXt2lHThSSBsZhFEECHqvwGFF+OybGj1Ki72A3h056tM6yRNppJFaJGGrnsjsWPPNa14E6f+ZBvC/MZRISLGNTDxhbHuvNSMx+hLU+Skz+B75RCMoYuEOuP8GxFEqs=</Modulus><Exponent>AQAB</Exponent><P>7VxYssHAiMZtnVzgK3h3U9llNZSa5MCK4/iLvATQ5h3+yHegT0t+q2Tv844QUxcBPvkkrF+uvSb043Nw65KoTw==</P><Q>tUG739ddGWVrsBxle1ZmuABVBzeUNUiCOsbcGP/LsmbScdnk46rIfjVZ3NGlfptbAv4I7MPatr8Je1O5GL485Q==</Q><DP>ZyFXnJuYhxUILXZcJCccWb88PVKLFlceQb0NIa1KAqIHwJxReAKKT/f0VfNk3mVBclYX/Bk6uA7EGktfRcub+w==</DP><DQ>rLubBiNgBo6/hFJbZ6GcPCec4EbYB7s02DygjXZfsYEJdhQ3a7taW+QN4kEsHK6CmiRrbu7qpJMDvzK3R1wr/Q==</DQ><InverseQ>a0q3ffhjSHdaZW0QrkqZNUNSQ+j5/ltPS9zaJQiVhO2abaYaGwKaVVsbuD7cB+i4EasAw4uQHrk456Vkw/HQnw==</InverseQ><D>DyXIfvAfC2JrCTD8MKW6e2TtSf6IHA1t5y6T+XC5jVD7T/yi0qG7ce23bt1tpChc0hGDLsTqJs3HGXzX6YJez0Frz37UuNNsNyrhh3cAnxQuAwaCZMF7tPYOQbmgXP5OFpgaIjUmhMwysmm9WdrTocE6h39t5QlLy7g6xH9MJ+k=</D></RSAKeyValue>";//这里的key均由provider产生的
            string signedDigest = RSACryptoHelper.SignData(plainTest, privateKey);
            Console.Write(signedDigest);
            Console.WriteLine();


            //接收方
            string publicKey = "<RSAKeyValue><Modulus>qA89WuhLCmvYHJqw+mfjRZ6Ep8xuicvRkVWkuufRHBAmLgXt2lHThSSBsZhFEECHqvwGFF+OybGj1Ki72A3h056tM6yRNppJFaJGGrnsjsWPPNa14E6f+ZBvC/MZRISLGNTDxhbHuvNSMx+hLU+Skz+B75RCMoYuEOuP8GxFEqs=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
            bool isCorrect = RSACryptoHelper.VerifyData(plainTest, signedDigest, publicKey);
            Console.Write(isCorrect);
            Console.ReadKey();



        }
    }

    /// <summary>
    /// Class RSACryptoHelper
    /// </summary>
    /// <remarks>Editor:v-liuhch CreateTime:2015/5/17 19:15:42</remarks>
    public class RSACryptoHelper {

        /*
         RSACryptoServiceProvider
         
         */
        /// <summary>
        /// 运算摘要,并对摘要进行签名
        /// </summary>
        /// <param name="plainText">明文</param>
        /// <param name="privateKeyXml">私钥.</param>
        /// <returns>System.String.</returns>
        /// <remarks>Editor:v-liuhch CreateTime:2015/5/17 19:11:41</remarks>
        public static string SignData(string plainText, string privateKeyXml) {

            RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
            provider.FromXmlString(privateKeyXml);

            byte[] plainData = Encoding.Default.GetBytes(plainText);

            //设置获取摘要的算法
            HashAlgorithm shal = HashAlgorithm.Create("SHA1");

            //获得签名的过的摘要
            byte[] signedDigest = provider.SignData(plainData, shal);//运算摘要,并对摘要进行签名,并返回签名后的摘要
            return Convert.ToBase64String(signedDigest);

        }

        /// <summary>
        /// Verifies the data.
        /// </summary>
        /// <param name="plainText">明文</param>
        /// <param name="signature">要验证的签名数据.</param>
        /// <param name="publicKeyXml">发送方公钥</param>
        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
        /// <remarks>Editor:v-liuhch CreateTime:2015/5/17 18:44:36</remarks>
        public static bool VerifyData(string plainText, string signature, string publicKeyXml) {

            RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
            provider.FromXmlString(publicKeyXml);

            byte[] plainData = Encoding.Default.GetBytes(plainText);
            byte[] signedDigest = Convert.FromBase64String(signature);

            HashAlgorithm shal = HashAlgorithm.Create("SHA1");

            /*
                 摘要:
            //     通过将指定的签名数据与为指定数据计算的签名进行比较来验证指定的签名数据。
            //
            // 参数:
            //   buffer:
            //     已签名的数据。
            //
            //   halg:
            //     用于创建数据的哈希值的哈希算法名称。
            //
            //   signature:
            //     要验证的签名数据。
            //
            // 返回结果:
            //     如果签名验证为有效,则为 true;否则,为 false。
             */
            bool isDataIntact = provider.VerifyData(plainData, shal, signedDigest);//用于重新运算消息,得出本地摘要,并解密传递进来的原始摘要,最后对本地摘要和原始摘要进行对比,并返回bool型的结果

            return isDataIntact;


        }

        /// <summary>
        /// Signs the data2.
        /// </summary>
        /// <param name="plainText">The plain text.</param>
        /// <param name="privateKeyXml">The private key XML.</param>
        /// <returns>System.String.</returns>
        /// <remarks>Editor:v-liuhch CreateTime:2015/5/17 19:15:36</remarks>
        public static string SignData2(string plainText, string privateKeyXml) {

            RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
            provider.FromXmlString(privateKeyXml);

            byte[] plainData = Encoding.Default.GetBytes(plainText);

            //设置获取摘要的算法
            HashAlgorithm shal = HashAlgorithm.Create("SHA1");
            //获取原始摘要
            byte[] digestData = shal.ComputeHash(plainData);
            //对原始摘要签名
            byte[] signedDigest = provider.SignHash(digestData, "SHA1");
            return Convert.ToBase64String(signedDigest);

        }

        /// <summary>
        /// Verifies the data2.
        /// </summary>
        /// <param name="plainText">The plain text.</param>
        /// <param name="signedDigest">The signed digest.</param>
        /// <param name="publicKeyXml">The public key XML.</param>
        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns>
        /// <remarks>Editor:v-liuhch CreateTime:2015/5/17 19:15:33</remarks>
        public static bool VerifyData2(string plainText, string signedDigest, string publicKeyXml) {


            RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
            provider.FromXmlString(publicKeyXml);

            byte[] plainData = Encoding.Default.GetBytes(plainText);
            byte[] signedDigestData = Convert.FromBase64String(signedDigest);

            //获得本地摘要
            HashAlgorithm shal = HashAlgorithm.Create("SHA1");
            byte[] digest = shal.ComputeHash(plainData);

            //解密签名,并判断摘要是否一致
            bool isDataIntact = provider.VerifyHash(digest, "SHA1", signedDigestData);
            return isDataIntact;



        
        }
    }

}



         
















目录
相关文章
|
2月前
|
安全 数据库 数据安全/隐私保护
对称加密与非对称加密的区别
对称加密与非对称加密的区别
203 64
|
5月前
|
存储 数据安全/隐私保护
.NET Core 究竟隐藏着怎样的神秘力量,能实现强身份验证与数据加密?
【8月更文挑战第28天】在数字化时代,数据安全与身份验证至关重要。.NET Core 提供了强大的工具,如 Identity 框架,帮助我们构建高效且可靠的身份验证系统,并支持高度定制化的用户模型和认证逻辑。此外,通过 `System.Security.Cryptography` 命名空间,.NET Core 还提供了丰富的加密算法和工具,确保数据传输和存储过程中的安全性。以下是一个简单的示例,展示如何使用 .NET Core 的 Identity 框架实现用户注册和登录功能。
44 3
|
1月前
|
Java 数据安全/隐私保护
对称加密、非对称加密、哈希摘要
对称加密使用同一密钥进行加解密,速度快但需保密;非对称加密采用公钥加密、私钥解密,公钥可公开,安全性高但速度较慢,双向通信需双方各持一对密钥;哈希摘要是从数据中提取特征,用于数据完整性校验,不同数据的哈希值几乎不会相同。
33 0
|
3月前
|
安全 网络协议 网络安全
【HTTPS】对称加密和非对称加密
【HTTPS】对称加密和非对称加密
46 0
|
4月前
|
算法 安全 网络安全
概念区分:对称加密、非对称加密、公钥、私钥、签名、证书
概念区分:对称加密、非对称加密、公钥、私钥、签名、证书
181 0
|
5月前
|
存储 算法 安全
|
6月前
|
数据安全/隐私保护
https【详解】与http的区别,对称加密,非对称加密,证书,解析流程图
https【详解】与http的区别,对称加密,非对称加密,证书,解析流程图
195 0
|
10天前
|
安全 算法 网络协议
【网络原理】——图解HTTPS如何加密(通俗简单易懂)
HTTPS加密过程,明文,密文,密钥,对称加密,非对称加密,公钥和私钥,证书加密
|
29天前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。
|
30天前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
49 10