C# 实现对称加密算法(AES)与非对称加密算法(RSA),包含前端加密对应算法实现

这篇具有很好参考价值的文章主要介绍了C# 实现对称加密算法(AES)与非对称加密算法(RSA),包含前端加密对应算法实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、两者的含义

1、对称加密:

一种既简单速度又快的加密方式,加密与解密使用的都是同一个密钥,别名又叫做:单密钥加密;对称加密有很多公开算法,并且因为它效率很高,所以适用于加密大量数据的场合;但其密钥的传输过程是不安全的,并且容易被破解,密钥管理起来也相对麻烦。

2、非对称加密:

需要两个密钥来进行加密和解密,这两个密钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥),如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。加密密钥是公开的,密钥的分配和管理就很简单,而且能够很容易地实现数字签名,因此最适合于电子商务应用的需要;但是如果对大数量进行操作,计算量特别大,速度远远比不上对称加密。

详细请阅读这篇文章 https://blog.csdn.net/qq_38556796/article/details/126706393

二、后端代码实现

1、AES对称加密算法(CBC模式,多一个初始化向量,安全性高)

IV:初始化向量,配合秘钥一起使用,每次加密时随机生成,解密需要秘钥与IV一起才能解密
代码如下:

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

namespace Aes
{
    public class AesHelper
    {
        private const int KEY_SIZE = 256;
        private const int BLOCK_SIZE = 128;
        private const string KEY_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        private const string IV_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

        public static string Encrypt(string plainText, string key, string iv)
        {
            byte[] keyBytes = Encoding.UTF8.GetBytes(key);
            byte[] ivBytes = Encoding.UTF8.GetBytes(iv);

            using (Aes aes = Aes.Create())
            {
                aes.KeySize = KEY_SIZE;
                aes.BlockSize = BLOCK_SIZE;
                aes.Key = keyBytes;
                aes.IV = ivBytes;
                aes.Mode = CipherMode.CBC;

                ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);

                byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);

                using (MemoryStream ms = new MemoryStream())
                {
                    using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
                    {
                        cs.Write(plainBytes, 0, plainBytes.Length);
                    }

                    byte[] encryptedBytes = ms.ToArray();

                    return Convert.ToBase64String(encryptedBytes);
                }
            }
        }

        public static string Decrypt(string cipherText, string key, string iv)
        {
            byte[] keyBytes = Encoding.UTF8.GetBytes(key);
            byte[] ivBytes = Encoding.UTF8.GetBytes(iv);

            using (Aes aes = Aes.Create())
            {
                aes.KeySize = KEY_SIZE;
                aes.BlockSize = BLOCK_SIZE;
                aes.Key = keyBytes;
                aes.IV = ivBytes;
                aes.Mode = CipherMode.CBC;

                ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);

                byte[] cipherBytes = Convert.FromBase64String(cipherText);

                using (MemoryStream ms = new MemoryStream())
                {
                    using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Write))
                    {
                        cs.Write(cipherBytes, 0, cipherBytes.Length);
                    }

                    byte[] decryptedBytes = ms.ToArray();

                    return Encoding.UTF8.GetString(decryptedBytes);
                }
            }
        }

        public static string GenerateKey()
        {
            Random random = new Random();
            StringBuilder sb = new StringBuilder();

            for (int i = 0; i < KEY_SIZE / 8; i++)
            {
                int index = random.Next(KEY_CHARS.Length);
                sb.Append(KEY_CHARS[index]);
            }

            return sb.ToString();
        }

        public static string GenerateIV()
        {
            Random random = new Random();
            StringBuilder sb = new StringBuilder();

            for (int i = 0; i < BLOCK_SIZE / 8; i++)
            {
                int index = random.Next(IV_CHARS.Length);
                sb.Append(IV_CHARS[index]);
            }

            return sb.ToString();
        }
    }
}

1.1、加解密测试:

string plainText = "Hello World!";
string key = AesHelper.GenerateKey();
string iv = AesHelper.GenerateIV();

string cipherText = AesHelper.Encrypt(plainText, key, iv);
string decryptedText = AesHelper.Decrypt(cipherText, key, iv);

Console.WriteLine("Plain text: {0}", plainText);
Console.WriteLine("Cipher text: {0}", cipherText);
Console.WriteLine("Decrypted text: {0}", decryptedText);

2、AES对称加密算法(ECB模式,无需初始化向量)

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

namespace AesHelper
{
    public class Aes
    {
        /// <summary>
        /// AES算法的keysize有一定限制。
        /// 具体来说,AES算法支持的keysize为 128 bits、192 bits 和 256 bits,而且只能以16 bits(即2个字节)为步长递增。
        /// 也就是说,支持的有效的 keysize 可以是:128、160、192、224 或 256。
        /// 需要注意的是,AES算法的 keysize 越大,加密强度越高,但同时也会增加加密运算所需的时间和计算资源。
        /// 因此,在实际应用中,需要根据实际需求和环境对 keysize 进行合理的选择。
        /// </summary>
        private static readonly int KeySize = 256;

        /// <summary>
        /// 生成秘钥
        /// </summary>
        /// <returns></returns>
        public static string GenerateKey()
        {
            using (var aes = Aes.Create())
            {
                aes.KeySize = KeySize;
                aes.Mode = CipherMode.ECB; // ECB 模式无需 IV 向量
                aes.Padding = PaddingMode.PKCS7;

                aes.GenerateKey();
                return Convert.ToBase64String(aes.Key);
            }
        }

        /// <summary>
        /// 加密
        /// </summary>
        /// <param name="plainText"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public static string Encrypt(string plainText, string key)
        {
            using (var aes = Aes.Create())
            {
                aes.KeySize = KeySize;
                aes.Mode = CipherMode.ECB; // ECB 模式无需 IV 向量
                aes.Padding = PaddingMode.PKCS7;
                aes.Key = Convert.FromBase64String(key);

                ICryptoTransform encryptor = aes.CreateEncryptor();

                byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);
                byte[] cipherBytes = encryptor.TransformFinalBlock(plainBytes, 0, plainBytes.Length);

                return Convert.ToBase64String(cipherBytes);
            }
        }

        /// <summary>
        /// 解密
        /// </summary>
        /// <param name="cipherText"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public static string Decrypt(string cipherText, string key)
        {
            using (var aes = Aes.Create())
            {
                aes.KeySize = KeySize;
                aes.Mode = CipherMode.ECB; // ECB 模式无需 IV 向量
                aes.Padding = PaddingMode.PKCS7;
                aes.Key = Convert.FromBase64String(key);

                ICryptoTransform decryptor = aes.CreateDecryptor();

                byte[] cipherBytes = Convert.FromBase64String(cipherText);
                byte[] plainBytes = decryptor.TransformFinalBlock(cipherBytes, 0, cipherBytes.Length);

                return Encoding.UTF8.GetString(plainBytes);
            }
        }
    }
}

2.1、加解密测试

string key = AesHelper.GenerateKey();

string plainText = "Hello, world!";
string cipherText = AesHelper.Encrypt(plainText, key);
Console.WriteLine(cipherText);

string decryptedPlainText = AesHelper.Decrypt(cipherText, key);
Console.WriteLine(decryptedPlainText);

3、RSA非对称加密算法

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

namespace RSA
{
    /// <summary>
    /// 在C#中,RSACryptoServiceProvider的KeySize属性可以设置为任意偶数位的值,
    /// 建议使用2048位或更长的密钥长度以提供足够的安全性,典型情况下,RSA密钥的长度为2048位。
    /// 尽管在理论上可以使用较小的密钥长度来加速RSA操作,但是使用较小的密钥可能会使RSA易受到攻击,
    /// 因此不推荐使用少于2048位的密钥长度。为了确保数据的安全,应该使用更长的密钥(根据实际需求选择),并定期更换密钥。
    /// ----------------------------
    /// RSA验证签名的作用是确保接收到的数据没有经过篡改,并且确实是由发送方发送的。
    /// 在数字通信中,攻击者可能会截取通信并修改消息内容,然后将其发送给接收方,导致接收方无法正确解释消息或采取错误的行动。
    /// 通过使用RSA签名,发送方可以对消息进行数字签名,这个数字签名是通过使用发送方的私钥生成的。
    /// 接收方可以使用发送方的公钥来验证数字签名,如果验证成功,就意味着消息没有被篡改,并且确实是由发送方发送的。
    /// 如果验证失败,接收方就可以确定消息已被篡改或不是由发送方发送的。
    /// 该过程确保了消息的完整性和真实性,防止了中间人攻击。因此,在数字通信中,RSA验证签名是一种非常重要的安全机制。
    /// ----------------------------
    /// 【注意】:为了与jsencrypt.min.js互换数据,需要将生成的 publicKey 和 privateKey 中的 = 去除
    /// </summary>
    public class RsaHelper
    {
        /// <summary>
        /// 生成公钥和私钥
        /// </summary>
        /// <param name="keySize">密钥大小</param>
        /// <param name="privateKey">输出私钥</param>
        /// <param name="publicKey">输出公钥</param>
        public static void GenerateKeys(int keySize, out string privateKey, out string publicKey)
        {
            using (var rsa = new RSACryptoServiceProvider(keySize))
            {
                privateKey = Convert.ToBase64String(rsa.ExportRSAPrivateKey());
                publicKey = Convert.ToBase64String(rsa.ExportRSAPublicKey());
            }
        }

        /// <summary>
        /// 加密
        /// </summary>
        /// <param name="publicKey">公钥</param>
        /// <param name="data">要加密的数据</param>
        /// <returns>加密后的数据</returns>
        public static string Encrypt(string publicKey, string data)
        {
            using (var rsa = new RSACryptoServiceProvider())
            {
                rsa.ImportRSAPublicKey(Convert.FromBase64String(publicKey), out _);
                var bytes = Encoding.UTF8.GetBytes(data);
                var encryptedBytes = rsa.Encrypt(bytes, RSAEncryptionPadding.Pkcs1);
                return Convert.ToBase64String(encryptedBytes);
            }
        }

        /// <summary>
        /// 解密
        /// </summary>
        /// <param name="privateKey">私钥</param>
        /// <param name="data">要解密的数据</param>
        /// <returns>解密后的数据</returns>
        public static string Decrypt(string privateKey, string data)
        {
            using (var rsa = new RSACryptoServiceProvider())
            {
                rsa.ImportRSAPrivateKey(Convert.FromBase64String(privateKey), out _);
                var encryptedBytes = Convert.FromBase64String(data);
                var decryptedBytes = rsa.Decrypt(encryptedBytes, RSAEncryptionPadding.Pkcs1);
                return Encoding.UTF8.GetString(decryptedBytes);
            }
        }

        /// <summary>
        /// RSA私钥签名
        /// </summary>
        /// <param name="privateKey">私钥</param>
        /// <param name="data">要签名的数据</param>
        /// <returns>签名数据</returns>
        public static string SignData(string privateKey, string data)
        {
            using (var rsa = new RSACryptoServiceProvider())
            {
                rsa.ImportRSAPrivateKey(Convert.FromBase64String(privateKey), out _);
                var bytes = Encoding.UTF8.GetBytes(data);
                var signatureBytes = rsa.SignData(bytes, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1);
                return Convert.ToBase64String(signatureBytes);
            }
        }

        /// <summary>
        /// 验证RSA签名
        /// </summary>
        /// <param name="publicKey">公钥</param>
        /// <param name="data">原始数据</param>
        /// <param name="signatureData">签名数据</param>
        /// <returns></returns>
        public static bool VerifyData(string publicKey, string data, string signatureData)
        {
            using (var rsa = new RSACryptoServiceProvider())
            {
                rsa.ImportRSAPublicKey(Convert.FromBase64String(publicKey), out _);
                var bytes = Encoding.UTF8.GetBytes(data);
                var signatureBytes = Convert.FromBase64String(signatureData);
                return rsa.VerifyData(bytes, signatureBytes, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1);
            }
        }
    }
}


3.1、加解密测试

//生成公钥和私钥
RsaHelper.GenerateKeys(2048, out var privateKey, out var publicKey);

//加密
var data = "Hello World!";
string encryptedData = RsaHelper.Encrypt(publicKey, data);

//解密
string decryptedData = RsaHelper.Decrypt(privateKey, encryptedData);

//签名
string signatureData = RsaHelper.SignData(privateKey, data);

//验证签名
bool isVerify = RsaHelper.VerifyData(publicKey, data, signatureData);

Console.WriteLine($"公钥:{publicKey} \n");
Console.WriteLine($"私钥:{privateKey} \n");
Console.WriteLine($"密文:{encryptedData} \n");
Console.WriteLine($"解密明文:{decryptedData} \n");
Console.WriteLine($"签名:{signatureData} \n");
Console.WriteLine($"验证签名:{isVerify} \n");

三、前端代码实现

c# 非对称加密,C#,c#,开发语言
c# 非对称加密,C#,c#,开发语言

已打包成资源供各位下载查阅:https://download.csdn.net/download/qq_41970599/87898493文章来源地址https://www.toymoban.com/news/detail-707285.html

到了这里,关于C# 实现对称加密算法(AES)与非对称加密算法(RSA),包含前端加密对应算法实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 常见的对称式加密与非对称式加密算法

            对称式加密 :对称加密算法就是传统的用一个密码进行加密和解密,通信发送方使用这种算法加密数据,接收方也用同样的算法解密数据. 因此对称式加密本身不是安全的。从程序的角度看,所谓加密,就是这样一个函数:         它接收密码和明文,然后输出密

    2023年04月08日
    浏览(30)
  • AES 对称加密算法

    高级加密标准(英语:Advanced Encryption Standard,缩写:AES),是一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。 那么为什么原来的DES会被取代呢,,原因就在于其使用56位密钥,比较容易被破解。而AES可以使用128、192、和256位密钥,并且

    2023年04月17日
    浏览(25)
  • 密码学之对称加密体系(2):AES、SM4的 S 盒具体算法的实现

    🔥点击进入【硬件安全】社区,查看更多精彩内容🔥 🔥点击查看《硬件安全》系列文章🔥 📢  声明 : 🥭 作者主页:【摆渡沧桑的CSDN主页】。 ⚠️ 未经作者允许,禁止转载。 ⚠️ 本文为非盈利性质,目的为个人学习记录及知识分享。因能力受限,存在知识点分析不

    2024年02月16日
    浏览(29)
  • AES对称加密实战——前端js加密后端python解密

    高级加密标准(AES, Advanced Encryption Standard),是一种最常见的对称加密算法 。其加密流程如下图所示,发送方通过密钥对明文加密后进行网络传输,接收方用同样的密钥将密文解密。在前后端通讯场景中,可利用AES算法对用户密码进行加密后传输,防止被抓包而造成密码泄露。

    2024年02月04日
    浏览(40)
  • 加密算法 AES和RSA

    通过互联网发送数据,数据可能会被第三者恶意窃听,造成损失。因此需要给重要的数据进行加密,加密后的数据被称为“密文”。接收方通过解除加密或得原本的数据,把密文恢复为原本数据的操作叫做“解密”。像这样就减少了数据被恶意窃听的风险。 那么加密是怎么操

    2024年02月06日
    浏览(40)
  • Python 基于pycryptodome,实现对AES、DES、3DES、RSA等常用加密算法的使用,文末附各种加密的源码示例

    (中文名:加密圆顶)pycryptodome是一个基于c实现的Python库,它在2.x中支持2.7以上版本,或3.x中支持3.5以上版本的Python。 可以使用以下命令安装它: 该库支持以下特性 认证加密模式 Authenticated encryption modes (GCM, CCM, EAX, SIV, OCB) AES加密在英特尔上的加速 Accelerated AES on Intel platf

    2023年04月09日
    浏览(73)
  • 0001__非对称加密与 RSA 算法

    密码学浅谈(1):非对称加密与 RSA 算法 - 知乎 密码学浅谈(2):密码学标准 - X.509 与 PKCS 系列 - 知乎 密码学浅谈(3):OpenSSL 与 Cryptography/CNG 的使用 - 知乎 密码学浅谈(1):非对称加密与 RSA 算法 - 知乎

    2024年02月07日
    浏览(32)
  • 【密码算法 之二】对称加密算法 AES(Advanced Encryption Standard)浅析

      AES的全称是 Advanced Encryption Standard,意思就是“高级加密标准”。它的出现主要是用于取代其前任DES算法的,因为我们都知道EDS算法的秘钥长度实际为56bit,因此算法的理论安全强度为2的56次方,但是随着计算能力的大幅提高,虽然出现了3DES的加密方法,但由于它的加密

    2024年02月05日
    浏览(37)
  • RSA+AES实现混合加密

    为什么使用RSA + AES混合加密 1.加密介绍 RSA加密: 属于非对称加密,公钥用于对数据进行加密,私钥对数据进行解密,两者不可逆。公钥和私钥是同时生成的,且一一对应。比如:客户端拥有公钥,服务端拥有公钥和私钥。客户端将数据通过公钥进行加密后,发送密文给服务端

    2024年02月05日
    浏览(37)
  • php常用加密算法大全aes、3des、rsa等

    目录 一、可解密加解密算法 1、aes 加解密算法 2、旧3des加解密方法  3、新3des加解密方法 4、rsa公私钥加解密、签名验签方法 5、自定义加密算法1  6、自定义加密算法2 7、自定义加密算法3 二、不可解密加密算法  1、md5算法  2、crypt算法 3、sha1算法 5、hash 算法 6、 password_ha

    2024年02月09日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包