C#实现简单的RSA非对称加密算法示例

下面是关于C#实现简单的RSA非对称加密算法的攻略:

什么是RSA加密算法?

RSA加密算法采用了一种被称为"公钥加密算法"的加密方式,加密和解密使用不同的密钥。公钥可以公开,任何人都可以获得,私钥则只有一个人可以拥有。采用这种方式,可以保证信息传输的安全性。

在C#中实现RSA加密算法

C#提供了RSACryptoServiceProvider类,可以用来实现RSA加密算法。下面是一个简单的C#代码示例,演示了如何使用RSACryptoServiceProvider类对一段数据进行加密和解密:

using System;
using System.Security.Cryptography;

class Program
{
  static void Main()
  {
    string data = "hello world";
    byte[] plainData = System.Text.Encoding.Default.GetBytes(data);

    // 生成密钥对
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(2048);

    // 加密
    byte[] encryptedData = rsa.Encrypt(plainData, false);

    // 解密
    byte[] decryptedData = rsa.Decrypt(encryptedData, false);

    string decryptedString = System.Text.Encoding.Default.GetString(decryptedData);
    Console.WriteLine(decryptedString);
  }
}

以上代码的输出结果为"hello world",说明加密和解密成功。

示例1:加密/解密字符串

下面是一个更详细的示例代码,演示如何使用RSA加密算法对一段字符串进行加密和解密:

using System;
using System.Security.Cryptography;

class Program
{
  static byte[] publicKey;
  static byte[] privateKey;

  static void Main()
  {
    string data = "hello world";
    byte[] plainData = System.Text.Encoding.Default.GetBytes(data);

    // 生成密钥对
    using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(2048))
    {
      publicKey = rsa.ExportCspBlob(false);
      privateKey = rsa.ExportCspBlob(true);
    }

    // 加密
    byte[] encryptedData = Encrypt(plainData, publicKey);

    // 解密
    byte[] decryptedData = Decrypt(encryptedData, privateKey);

    string decryptedString = System.Text.Encoding.Default.GetString(decryptedData);
    Console.WriteLine(decryptedString);
  }

  static byte[] Encrypt(byte[] data, byte[] publicKey)
  {
    using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
    {
      rsa.ImportCspBlob(publicKey);
      return rsa.Encrypt(data, false);
    }
  }

  static byte[] Decrypt(byte[] data, byte[] privateKey)
  {
    using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
    {
      rsa.ImportCspBlob(privateKey);
      return rsa.Decrypt(data, false);
    }
  }
}

以上代码将对字符串"hello world"进行加密和解密,输出的结果仍然是"hello world"。在这个例子中,我们使用了ExportCspBlob方法导出公钥和私钥,并通过ImportCspBlob方法导入密钥。

示例2:保存和恢复密钥

在实际应用中,我们通常需要将公钥和私钥保存在文件或数据库中,并在需要时恢复密钥。下面是一个示例代码,演示如何保存和恢复RSA密钥:

using System;
using System.Security.Cryptography;

class Program
{
  static void Main()
  {
    string data = "hello world";
    byte[] plainData = System.Text.Encoding.Default.GetBytes(data);

    // 生成密钥对
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(2048);
    byte[] publicKey = rsa.ExportCspBlob(false);
    byte[] privateKey = rsa.ExportCspBlob(true);

    // 保存公钥和私钥
    SavePublicKey(publicKey, @"c:\temp\public.key");
    SavePrivateKey(privateKey, @"c:\temp\private.key");

    // 恢复公钥和私钥
    byte[] restoredPublicKey = LoadPublicKey(@"c:\temp\public.key");
    byte[] restoredPrivateKey = LoadPrivateKey(@"c:\temp\private.key");

    // 加密
    byte[] encryptedData = Encrypt(plainData, restoredPublicKey);

    // 解密
    byte[] decryptedData = Decrypt(encryptedData, restoredPrivateKey);

    string decryptedString = System.Text.Encoding.Default.GetString(decryptedData);
    Console.WriteLine(decryptedString);
  }

  static void SavePublicKey(byte[] data, string fileName)
  {
    System.IO.File.WriteAllBytes(fileName, data);
  }

  static byte[] LoadPublicKey(string fileName)
  {
    return System.IO.File.ReadAllBytes(fileName);
  }

  static void SavePrivateKey(byte[] data, string fileName)
  {
    System.IO.File.WriteAllBytes(fileName, data);
  }

  static byte[] LoadPrivateKey(string fileName)
  {
    return System.IO.File.ReadAllBytes(fileName);
  }

  static byte[] Encrypt(byte[] data, byte[] publicKey)
  {
    using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
    {
      rsa.ImportCspBlob(publicKey);
      return rsa.Encrypt(data, false);
    }
  }

  static byte[] Decrypt(byte[] data, byte[] privateKey)
  {
    using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
    {
      rsa.ImportCspBlob(privateKey);
      return rsa.Decrypt(data, false);
    }
  }
}

以上代码先将公钥和私钥保存到文件中,然后又从文件中恢复密钥,并进行加密和解密。请注意,这里使用了File.WriteAllBytes和File.ReadAllBytes方法来保存和读取密钥文件。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现简单的RSA非对称加密算法示例 - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • C#文件目录操作方法汇总

    C#文件目录操作方法汇总 在C#编程中,文件和目录操作是非常常见的需求。本文总结了常用的C#文件目录操作方法,包括路径操作、目录创建、文件创建、文件读写、文件复制、文件删除等多个方面,旨在帮助读者快速实现对文件和目录的操作。 路径操作 获取当前应用程序执行文件所在目录 string path = AppDomain.CurrentDomain.BaseDir…

    C# 2023年6月7日
    00
  • C# 没有动态的数组,可以用arraylist或list取代

    首先,需要说明的是C#中的数组属于静态数组,即在声明数组时就必须确定数组的长度,而不能在程序运行时再动态更改数组的大小。但是,C#提供了一些其他的数据结构,例如ArrayList和List,可以实现动态数组的功能。下面是使用ArrayList和List的具体说明: 使用ArrayList ArrayList是可以动态调整存储数据的容器,通过Add方法可以向其…

    C# 2023年6月7日
    00
  • C# 获取系统DPI缩放比例以及分辨率大小

    一般方法 System.Windows.Forms.Screen类 // 获取当前主屏幕分辨率 int screenWidth = Screen.PrimaryScreen.Bounds.Width; int screenHeight = Screen.PrimaryScreen.Bounds.Height; // 获取指定屏幕分辨率 Screen seco…

    C# 2023年4月27日
    00
  • 详解C#对路径…的访问被拒绝解决过程

    下面是详解C#对路径访问被拒绝的完整攻略: 1. 问题描述 在进行C#开发时,经常会使用到文件系统的操作,如创建、读取、删除等。在进行这些操作的过程中,有时会遇到“访问被拒绝”的错误提示,如下所示: System.UnauthorizedAccessException: 访问被拒绝。 在 System.IO.__Error.WinIOError(Int32 …

    C# 2023年5月31日
    00
  • 关于C#委托三种调用的分享使用

    关于C#委托的三种调用方式,分别是:直接调用、使用BeginInvoke/EndInvoke方法异步调用、使用线程池异步调用。下面逐一进行详细讲解。 直接调用 直接调用是指在委托实例后面直接加上小括号和对应参数,就相当于调用了委托所指向的方法。示例代码如下: using System; namespace DelegateDemo { class Progr…

    C# 2023年6月7日
    00
  • WCF实现进程间管道通信Demo分享

    下面是关于“WCF实现进程间管道通信Demo分享”的完整攻略,包含两个示例。 1. 什么是进程间管道通信 进程间管道通信是一种在不同进程之间进行通信的方法。在Windows操作系统中,可以使用命名管道(Named Pipe)来实现进程间管道通信。命名管道是一种命名的、双向的、异步的、字节流管道,可以在本地或远程计算机之间进行通信。 2. WCF实现进程间管道…

    C# 2023年5月15日
    00
  • C#微信公众号与订阅号接口开发示例代码

    下面我将详细讲解如何进行C#微信公众号与订阅号接口开发,并提供以下两个示例说明: 示例一:获取微信公众号基本信息 步骤一:申请开发者账号 首先,你需要到微信公众平台官网上注册一个开发者账号。 步骤二:创建公众号 在申请开发者账号后,你需要创建一个新的公众号。 步骤三:获取AppID和AppSecret 创建公众号后,在公众号设置页面可以获取到AppID和Ap…

    C# 2023年5月31日
    00
  • C#单例模式Singleton的实现详解

    C#单例模式Singleton的实现详解 单例模式是什么? 单例模式是一种创建型设计模式,其主题为确保一个类只有一个实例,并提供全局访问点。 实现单例模式 1. 延迟初始化 实现单例模式的一种简单方法是在实例化对象之前先执行一些操作。 假如我们只需要在调用该对象时才创建该对象,那么我们可以使用以下方式来实现: public class Singleton {…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部