最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#使用應(yīng)用RSA和ECC進(jìn)行數(shù)字簽名和簽名驗(yàn)證的示例詳解

 更新時(shí)間:2025年09月29日 09:23:59   作者:Humbunklung  
開發(fā)中需要用到數(shù)字簽名和驗(yàn)簽,這篇博客提供使用RSA和ECDSA(橢圓曲線數(shù)字簽名算法,也是橢圓曲線加密的常見應(yīng)用)進(jìn)行數(shù)字簽名和簽名驗(yàn)證的C#程序示例,同時(shí),也會(huì)包含密鑰生成和保存的例程,需要的朋友可以參考下

基本概念

  1. RSA 通常用于加密少量數(shù)據(jù)(如對(duì)稱密鑰)和數(shù)字簽名。直接使用RSA加密大量數(shù)據(jù)效率較低,更常見的是使用RSA加密一個(gè)隨機(jī)生成的對(duì)稱密鑰,然后用對(duì)稱密鑰加密實(shí)際數(shù)據(jù)。
  2. 橢圓曲線算法 (ECC) 在相同的安全級(jí)別下,密鑰長(zhǎng)度比RSA短得多,因此在性能和存儲(chǔ)方面有優(yōu)勢(shì)。它主要用于數(shù)字簽名 (ECDSA)密鑰協(xié)商 (ECDH),也可以進(jìn)行加密(通過結(jié)合ECDH和對(duì)稱加密)。
  3. 密鑰保存:在實(shí)際應(yīng)用中,私鑰的保存至關(guān)重要。通常會(huì)使用更安全的方式,如Windows證書存儲(chǔ)、硬件安全模塊 (HSM) 或加密存儲(chǔ)在文件中。這里提供的文件保存示例僅用于演示目的,不應(yīng)直接用于生產(chǎn)環(huán)境。
  4. 異常處理:為了代碼簡(jiǎn)潔,示例中的異常處理可能不夠完善,實(shí)際應(yīng)用中應(yīng)加強(qiáng)。

RSA 算法示例

RSA算法在.NET中主要通過RSACryptoServiceProvider (舊版) 或 RSA (推薦,跨平臺(tái)) 類實(shí)現(xiàn)。這里我們使用 RSA 類。

1. 密鑰生成與保存

using System.Security.Cryptography;

namespace RsaEcdsaCryption
{
    public class RsaHelper
    {
        // 生成RSA密鑰對(duì)并保存到文件
        public static void GenerateAndSaveRsaKeys(string privateKeyPath, string publicKeyPath)
        {
            using (RSA rsa = RSA.Create())
            {
                // 設(shè)置密鑰長(zhǎng)度 (例如,2048位)
                rsa.KeySize = 2048;

                // 導(dǎo)出私鑰 (包含所有參數(shù))
                string privateKeyXml = rsa.ToXmlString(true);
                File.WriteAllText(privateKeyPath, privateKeyXml);
                
                // 導(dǎo)出公鑰 (只包含模數(shù)和指數(shù))
                string publicKeyXml = rsa.ToXmlString(false);
                File.WriteAllText(publicKeyPath, publicKeyXml);

                Console.WriteLine($"RSA 私鑰已保存到: {privateKeyPath}");
                Console.WriteLine($"RSA 公鑰已保存到: {publicKeyPath}");
            }
        }

        // 從文件加載RSA私鑰
        public static RSA LoadRsaPrivateKey(string privateKeyPath)
        {
            RSA rsa = RSA.Create();
            string privateKeyXml = File.ReadAllText(privateKeyPath);
            rsa.FromXmlString(privateKeyXml);            
            return rsa;
        }

        // 從文件加載RSA公鑰
        public static RSA LoadRsaPublicKey(string publicKeyPath)
        {
            RSA rsa = RSA.Create();
            string publicKeyXml = File.ReadAllText(publicKeyPath);
            rsa.FromXmlString(publicKeyXml);
            return rsa;
        }
    }
}

2. 加密與解密

RSA加密通常是公鑰加密,私鑰解密。

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

namespace RsaEcdsaCryption
{
    public class RsaEncryptionDecryption
    {
        // 使用RSA公鑰加密數(shù)據(jù)
        public static byte[] Encrypt(byte[] data, RSA publicKeyRsa)
        {
            // OEAP填充模式推薦用于加密,提供更好的安全性
            return publicKeyRsa.Encrypt(data, RSAEncryptionPadding.OaepSHA256);
        }

        // 使用RSA私鑰解密數(shù)據(jù)
        public static byte[] Decrypt(byte[] encryptedData, RSA privateKeyRsa)
        {
            // OEAP填充模式推薦用于解密
            return privateKeyRsa.Decrypt(encryptedData, RSAEncryptionPadding.OaepSHA256);
        }

        public static void RunEncryptionDecryptionExample(RSA publicKey, RSA privateKey)
        {
            string originalText = "這是一段要使用RSA加密的秘密消息。";
            byte[] originalBytes = Encoding.UTF8.GetBytes(originalText);

            Console.WriteLine($"\n原始消息: {originalText}");

            // 加密
            byte[] encryptedBytes = Encrypt(originalBytes, publicKey);
            Console.WriteLine($"加密后 (Base64): {Convert.ToBase64String(encryptedBytes)}");

            // 解密
            byte[] decryptedBytes = Decrypt(encryptedBytes, privateKey);
            string decryptedText = Encoding.UTF8.GetString(decryptedBytes);
            Console.WriteLine($"解密后: {decryptedText}");

            Console.WriteLine($"加密/解密 {(originalText == decryptedText ? "成功" : "失敗")}");
        }
    }
}

3. 數(shù)字簽名與驗(yàn)證

RSA簽名通常使用私鑰簽名,公鑰驗(yàn)證。

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

public class RsaSignature
{
    // 使用RSA私鑰對(duì)數(shù)據(jù)進(jìn)行簽名
    public static byte[] SignData(byte[] data, RSA privateKeyRsa)
    {
        // 選擇哈希算法 (例如,SHA256) 和填充模式 (PSS推薦用于簽名)
        return privateKeyRsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pss);
    }

    // 使用RSA公鑰驗(yàn)證簽名
    public static bool VerifySignature(byte[] data, byte[] signature, RSA publicKeyRsa)
    {
        // 選擇哈希算法和填充模式與簽名時(shí)一致
        return publicKeyRsa.VerifyData(data, signature, HashAlgorithmName.SHA256, RSASignaturePadding.Pss);
    }

    public static void RunSignatureExample(RSA publicKey, RSA privateKey)
    {
        string messageToSign = "這是一段要進(jìn)行數(shù)字簽名的消息。";
        byte[] messageBytes = Encoding.UTF8.GetBytes(messageToSign);

        Console.WriteLine($"\n待簽名消息: {messageToSign}");

        // 簽名
        byte[] signature = SignData(messageBytes, privateKey);
        Console.WriteLine($"生成簽名 (Base64): {Convert.ToBase64String(signature)}");

        // 驗(yàn)證簽名
        bool isValid = VerifySignature(messageBytes, signature, publicKey);
        Console.WriteLine($"簽名驗(yàn)證結(jié)果: {(isValid ? "有效" : "無效")}");

        // 嘗試篡改數(shù)據(jù)后驗(yàn)證簽名
        Console.WriteLine("\n嘗試篡改數(shù)據(jù)后驗(yàn)證簽名...");
        byte[] tamperedMessageBytes = Encoding.UTF8.GetBytes("這是一段被篡改的消息。");
        bool isTamperedValid = VerifySignature(tamperedMessageBytes, signature, publicKey);
        Console.WriteLine($"篡改后簽名驗(yàn)證結(jié)果: {(isTamperedValid ? "有效" : "無效")}");
    }
}

橢圓曲線數(shù)字簽名算法 (ECDSA) 示例

ECDSA在.NET中主要通過 ECDsa 類實(shí)現(xiàn)。

1. 密鑰生成與保存

ECDSA密鑰通常是公私鑰對(duì),公鑰可以從私鑰派生。

using System.Security.Cryptography;

public class EcdsaHelper
{
    // 生成ECDSA密鑰對(duì)并保存到文件
    public static void GenerateAndSaveEcdsaKeys(string privateKeyPath, string publicKeyPath)
    {
        // 選擇一個(gè)命名曲線,例如 P-256 (secp256r1)
        using (ECDsa ecdsa = ECDsa.Create(ECCurve.NamedCurves.nistP256))
        {
            // 導(dǎo)出私鑰(PKCS#8格式,PEM編碼)
            string privateKeyPem = ecdsa.ExportPkcs8PrivateKeyPem();
            File.WriteAllText(privateKeyPath, privateKeyPem);

            // 導(dǎo)出公鑰(SubjectPublicKeyInfo格式,PEM編碼)
            string publicKeyPem = ecdsa.ExportSubjectPublicKeyInfoPem();
            File.WriteAllText(publicKeyPath, publicKeyPem);

            Console.WriteLine($"ECDSA 私鑰已保存到: {privateKeyPath}");
            Console.WriteLine($"ECDSA 公鑰已保存到: {publicKeyPath}");
        }
    }

    // 從文件加載ECDSA私鑰
    public static ECDsa LoadEcdsaPrivateKey(string privateKeyPath)
    {
        ECDsa ecdsa = ECDsa.Create();
        string privateKeyPem = File.ReadAllText(privateKeyPath);
        ecdsa.ImportFromPem(privateKeyPem); // 或 ImportPkcs8PrivateKeyPem
        return ecdsa;
    }

    // 從文件加載ECDSA公鑰
    public static ECDsa LoadEcdsaPublicKey(string publicKeyPath)
    {
        ECDsa ecdsa = ECDsa.Create();
        string publicKeyPem = File.ReadAllText(publicKeyPath);
        ecdsa.ImportFromPem(publicKeyPem); // 或 ImportSubjectPublicKeyInfoPem
        return ecdsa;
    }
}

2. 數(shù)字簽名與驗(yàn)證

ECDSA主要用于簽名,不支持直接的加密/解密操作(需要結(jié)合ECDH和對(duì)稱加密才能實(shí)現(xiàn))。

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

public class EcdsaSignature
{
    // 使用ECDSA私鑰對(duì)數(shù)據(jù)進(jìn)行簽名
    public static byte[] SignData(byte[] data, ECDsa privateKeyEcdsa)
    {
        // 選擇哈希算法 (例如,SHA256)
        return privateKeyEcdsa.SignData(data, HashAlgorithmName.SHA256);
    }

    // 使用ECDSA公鑰驗(yàn)證簽名
    public static bool VerifySignature(byte[] data, byte[] signature, ECDsa publicKeyEcdsa)
    {
        // 選擇哈希算法與簽名時(shí)一致
        return publicKeyEcdsa.VerifyData(data, signature, HashAlgorithmName.SHA256);
    }

    public static void RunSignatureExample(ECDsa publicKey, ECDsa privateKey)
    {
        string messageToSign = "這是一段要使用ECDSA進(jìn)行數(shù)字簽名的消息。";
        byte[] messageBytes = Encoding.UTF8.GetBytes(messageToSign);

        Console.WriteLine($"\n待簽名消息: {messageToSign}");

        // 簽名
        byte[] signature = SignData(messageBytes, privateKey);
        Console.WriteLine($"生成簽名 (Base64): {Convert.ToBase64String(signature)}");

        // 驗(yàn)證簽名
        bool isValid = VerifySignature(messageBytes, signature, publicKey);
        Console.WriteLine($"簽名驗(yàn)證結(jié)果: {(isValid ? "有效" : "無效")}");

        // 嘗試篡改數(shù)據(jù)后驗(yàn)證簽名
        Console.WriteLine("\n嘗試篡改數(shù)據(jù)后驗(yàn)證簽名...");
        byte[] tamperedMessageBytes = Encoding.UTF8.GetBytes("這是一段被篡改的消息。");
        bool isTamperedValid = VerifySignature(tamperedMessageBytes, signature, publicKey);
        Console.WriteLine($"篡改后簽名驗(yàn)證結(jié)果: {(isTamperedValid ? "有效" : "無效")}");
    }
}

主程序示例 (Program.cs)

將上述類集成到Program.cs中,演示如何使用它們。

using System;
using System.IO;
using System.Security.Cryptography;

public class Program
{
    public static void Main(string[] args)
    {
        // 定義密鑰文件路徑
        string rsaPrivateKeyPath = "rsa_private_key.xml";
        string rsaPublicKeyPath = "rsa_public_key.xml";
        string ecdsaPrivateKeyPath = "ecdsa_private_key.pem";
        string ecdsaPublicKeyPath = "ecdsa_public_key.pem";

        Console.WriteLine("--- RSA 示例 ---");

        // RSA 密鑰生成與保存
        RsaHelper.GenerateAndSaveRsaKeys(rsaPrivateKeyPath, rsaPublicKeyPath);
        RSA rsaPublicKey = RsaHelper.LoadRsaPublicKey(rsaPublicKeyPath);
        RSA rsaPrivateKey = RsaHelper.LoadRsaPrivateKey(rsaPrivateKeyPath);

        // RSA 加密與解密
        RsaEncryptionDecryption.RunEncryptionDecryptionExample(rsaPublicKey, rsaPrivateKey);

        // RSA 數(shù)字簽名與驗(yàn)證
        RsaSignature.RunSignatureExample(rsaPublicKey, rsaPrivateKey);

        Console.WriteLine("\n--- ECDSA 示例 ---");

        // ECDSA 密鑰生成與保存
        EcdsaHelper.GenerateAndSaveEcdsaKeys(ecdsaPrivateKeyPath, ecdsaPublicKeyPath);
        ECDsa ecdsaPublicKey = EcdsaHelper.LoadEcdsaPublicKey(ecdsaPublicKeyPath);
        ECDsa ecdsaPrivateKey = EcdsaHelper.LoadEcdsaPrivateKey(ecdsaPrivateKeyPath);

        // ECDSA 數(shù)字簽名與驗(yàn)證
        EcdsaSignature.RunSignatureExample(ecdsaPublicKey, ecdsaPrivateKey);

        // 清理生成的密鑰文件 (可選)
        // File.Delete(rsaPrivateKeyPath);
        // File.Delete(rsaPublicKeyPath);
        // File.Delete(ecdsaPrivateKeyPath);
        // File.Delete(ecdsaPublicKeyPath);

        Console.WriteLine("\n所有示例運(yùn)行完畢。");
        Console.ReadKey();
    }
}

運(yùn)行環(huán)境要求

  • .NET Core 3.1 或更高版本 / .NET 5.0 或更高版本RSA.Create(), ECDsa.Create(ECCurve.NamedCurves.nistP256), ExportPkcs8PrivateKeyPem(), ExportSubjectPublicKeyInfoPem(), ImportFromPem() 等方法需要較新的.NET版本支持。如果您使用的是較舊的.NET Framework,可能需要調(diào)整為 RSACryptoServiceProviderECDiffieHellmanCng/ECDsaCng,但它們的使用方式有所不同,且通常更推薦使用新的API。

關(guān)于數(shù)字證書

數(shù)字證書是公鑰基礎(chǔ)設(shè)施 (PKI) 的核心組成部分,它將公鑰與實(shí)體的身份綁定在一起,并由可信的第三方(證書頒發(fā)機(jī)構(gòu) C A)進(jìn)行簽名。上述示例只是生成了原始的公鑰和私鑰文件,并沒有涉及證書的生成和使用。

如果需要處理數(shù)字證書,C# 提供了 X509Certificate2 類來加載、創(chuàng)建和管理證書。通常涉及:

  1. 加載證書:從文件 (.pfx, .cer) 或證書存儲(chǔ)區(qū)加載。
  2. 提取公鑰:從 X509Certificate2 對(duì)象中獲取 RSAECDsa 公鑰。
  3. 使用私鑰:如果證書包含私鑰,可以直接用它進(jìn)行簽名或解密。

示例:

// 假設(shè)你有一個(gè)帶有私鑰的PFX文件
// string certPath = "myCert.pfx";
// string certPassword = "myPassword";

// using (X509Certificate2 cert = new X509Certificate2(certPath, certPassword))
// {
//     // 獲取公鑰用于驗(yàn)證
//     RSA rsaPublicKeyFromCert = cert.GetRSAPublicKey(); // 或 GetECDsaPublicKey()
//     // 獲取私鑰用于簽名
//     RSA rsaPrivateKeyFromCert = cert.GetRSAPrivateKey(); // 或 GetECDsaPrivateKey()

//     // 然后就可以用這些密鑰進(jìn)行簽名/驗(yàn)證或加密/解密
// }

程序運(yùn)行效果如下:

以上就是C#使用應(yīng)用RSA和ECC進(jìn)行數(shù)字簽名和簽名驗(yàn)證的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于C# RSA和ECC數(shù)字簽名和簽名驗(yàn)證的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 利用WPF實(shí)現(xiàn)系統(tǒng)資源監(jiān)控的完整代碼

    利用WPF實(shí)現(xiàn)系統(tǒng)資源監(jiān)控的完整代碼

    在現(xiàn)代軟件開發(fā)中,系統(tǒng)資源監(jiān)控是系統(tǒng)管理、性能分析和故障診斷的重要工具,WPF是構(gòu)建現(xiàn)代化、美觀實(shí)用的系統(tǒng)監(jiān)控應(yīng)用的理想選擇,本文將詳細(xì)介紹如何使用WPF創(chuàng)建一個(gè)功能全面的系統(tǒng)資源監(jiān)控儀表盤,需要的朋友可以參考下
    2026-01-01
  • 使用C#和SQL Server實(shí)現(xiàn)自動(dòng)清理功能的完整方案

    使用C#和SQL Server實(shí)現(xiàn)自動(dòng)清理功能的完整方案

    在現(xiàn)代軟件開發(fā)中,數(shù)據(jù)管理是一個(gè)至關(guān)重要的環(huán)節(jié),隨著時(shí)間的推移,數(shù)據(jù)庫中會(huì)積累大量過期或冗余的數(shù)據(jù),這些數(shù)據(jù)不僅占用存儲(chǔ)空間,還會(huì)影響系統(tǒng)性能,本文將詳細(xì)介紹如何使用C#和SQL Server構(gòu)建一個(gè)功能完善的自動(dòng)清理系統(tǒng),需要的朋友可以參考下
    2026-01-01
  • 用C#做網(wǎng)絡(luò)爬蟲的步驟教學(xué)

    用C#做網(wǎng)絡(luò)爬蟲的步驟教學(xué)

    在本篇內(nèi)容里小編給大家分享的是關(guān)于用C#做網(wǎng)絡(luò)爬蟲的步驟和方法,需要的朋友們可以參考下。
    2018-12-12
  • C#代碼實(shí)現(xiàn)將HTML轉(zhuǎn)換為PDF、XPS和XML

    C#代碼實(shí)現(xiàn)將HTML轉(zhuǎn)換為PDF、XPS和XML

    HTML 是網(wǎng)頁和在線內(nèi)容的標(biāo)準(zhǔn)格式,但在許多場(chǎng)景中您可能需要將 HTML 文檔轉(zhuǎn)換為其他文件格式,下面我們就來看看如何使用 Spire.Doc for .NET 在 C# 中將 HTML 轉(zhuǎn)換為 PDF、XPS 和 XML吧
    2026-04-04
  • C# String Replace高效的實(shí)例方法

    C# String Replace高效的實(shí)例方法

    C# String Replace高效的實(shí)例方法,需要的朋友可以參考一下
    2013-05-05
  • 最新評(píng)論

    汪清县| 库尔勒市| 昌邑市| 出国| 文登市| 保山市| 集安市| 来宾市| 隆尧县| 舟山市| 松滋市| 江油市| 安陆市| 甘孜县| 泸溪县| 通州市| 平乡县| 台东市| 六枝特区| 莱阳市| 涟源市| 于都县| 仁化县| 泰州市| 新宁县| 晋州市| 德庆县| 安化县| 麦盖提县| 普兰县| 兴化市| 营山县| 赤峰市| 谷城县| 台湾省| 铜山县| 永定县| 北流市| 景泰县| 和林格尔县| 竹溪县|