C#RSA加密

发布于:2025-06-18 ⋅ 阅读:(19) ⋅ 点赞:(0)

RSA加密的概念

  • RSA加密是一种非对称加密算法。非对称加密算法使用一对密钥,公钥(Public Key)和私钥(Private Key)。公钥可以公开发布,用于加密数据;私钥则由接收者自己保存,用于解密数据。这就好比有一个特殊的盒子,任何人都可以用公钥这个锁将物品锁在这个盒子里,但是只有拥有私钥的人才能打开这个盒子获取物品。

  • RSA加密算法基于大数质因数分解的困难性原理。简单来说,就是将两个大素数相乘很容易,但是将它们的乘积分解回原来的两个素数却非常困难。例如,给你两个很大的素数p和q,计算出它们的乘积n = p*q很容易,但是如果只是给你n,要找出p和q就很困难,这个特性使得RSA加密算法具有很高的安全性。

RSA加密的用法 

  • 密钥生成:首先需要生成一对公钥和私钥。这一过程涉及到选择两个大素数p和q,计算它们的乘积n,然后计算欧拉函数φ(n) =(p - 1)*(q - 1)。接着选择一个与φ(n)互质的整数e作为公钥的指数部分,再计算出与e同余的模逆元d,作为私钥的指数部分。公钥可以表示为(e,n),私钥可以表示为(d,n)。

  • 加密过程:发送方使用接收方的公钥(e,n)对明文m进行加密。加密公式为c = m^e mod n,其中c是加密后的密文。

  • 解密过程:接收方使用自己的私钥(d,n)对接收到的密文c进行解密。解密公式为m = c^d mod n,这样就可以得到原始的明文m。

C#代码实现 

  • 首先,需要引用相关的命名空间,例如 System.Security.Cryptography,它提供了用于加密和解密的类。

  • RSA加密解密示例代码:

    using System;
    using System.Security.Cryptography;
    using System.Text;
    
    class RSACryptoExample
    {
        static void Main()
        {
            // 创建RSA加密服务提供者
            using (RSA rsa = RSA.Create())
            {
                // 生成密钥对
                // 一般 RSA 密钥大小建议使用 2048 位或更高,这里为了演示简单,可能使用较小的默认值
                // 获取公钥
                string publicKey = rsa.ToXmlString(false); // false表示只导出公钥
                // 获取私钥
                string privateKey = rsa.ToXmlString(true); // true表示导出公钥和私钥
    
                // 明文
                string plainText = "Hello RSA Encryption!";
    
                // 加密
                byte[] encryptedData = EncryptStringToBytes_RSA(plainText, publicKey);
    
                Console.WriteLine("Encrypted Data: " + Convert.ToBase64String(encryptedData));
    
                // 解密
                string decryptedText = DecryptBytesToString_RSA(encryptedData, privateKey);
    
                Console.WriteLine("Decrypted Text: " + decryptedText);
            }
        }
    
        // 加密方法
        static byte[] EncryptStringToBytes_RSA(string plainText, string publicKey)
        {
            byte[] encryptedBytes = null;
    
            // 使用 RSA 从公钥字符串创建加密服务提供者
            using (RSA rsa = RSA.Create())
            {
                try
                {
                    // 导入公钥
                    rsa.FromXmlString(publicKey);
                    // 将明文字符串转换为字节数组
                    byte[] dataToEncrypt = Encoding.UTF8.GetBytes(plainText);
                    // 使用公钥加密数据
                    encryptedBytes = rsa.Encrypt(dataToEncrypt, RSAEncryptionPadding.OaepSHA256);
                }
                catch (CryptographicException e)
                {
                    Console.WriteLine("Error encrypting: {0}", e.Message);
                }
            }
    
            return encryptedBytes;
        }
    
        // 解密方法
        static string DecryptBytesToString_RSA(byte[] encryptedData, string privateKey)
        {
            string decryptedText = null;
    
            // 使用 RSA 从私钥字符串创建解密服务提供者
            using (RSA rsa = RSA.Create())
            {
                try
                {
                    // 导入私钥
                    rsa.FromXmlString(privateKey);
                    // 使用私钥解密数据
                    byte[] decryptedBytes = rsa.Decrypt(encryptedData, RSAEncryptionPadding.OaepSHA256);
                    // 将解密后的字节数组转换为字符串
                    decryptedText = Encoding.UTF8.GetString(decryptedBytes);
                }
                catch (CryptographicException e)
                {
                    Console.WriteLine("Error decrypting: {0}", e.Message);
                }
            }
    
            return decryptedText;
        }
    }

    代码详细解释

  • 在代码中,首先创建了一个RSA加密服务提供者对象 RSA rsa = RSA.Create()。这个对象用于生成密钥对以及进行加密和解密操作。

  • 通过调用 rsa.ToXmlString(false)rsa.ToXmlString(true) 分别获取公钥和私钥的XML字符串形式。这是为了方便存储和传输密钥。例如,在网络通信中,可以将公钥发送给发送方,而私钥由接收方自己保存。

  • 在加密方法 EncryptStringToBytes_RSA 中,使用公钥对明文进行加密。首先将明文字符串转换为字节数组,然后调用 rsa.Encrypt 方法,传入加密数据和加密填充模式(这里使用OAEPSHA256填充模式)。加密填充模式是为了防止某些攻击,如选择密文攻击等。加密后的结果是一个字节数组。

  • 在解密方法 DecryptBytesToString_RSA 中,使用私钥对密文进行解密。调用 rsa.Decrypt 方法,传入加密后的字节数组和解密填充模式,得到解密后的字节数组,然后再将其转换为字符串。

  • 在主方法中,首先生成密钥对,然后对明文进行加密,并将加密后的数据打印出来。接着对加密后的数据进行解密,并打印解密后的明文,从而验证加密解密过程的正确性。


网站公告

今日签到

点亮在社区的每一天
去签到