C#语言基础问题16:C# 中如何进行加密和解密操作?
在 C# 中,可以使用以下几种常见的加密算法进行加密和解密操作:
- 对称加密算法:使用相同的密钥对数据进行加密和解密,常见的对称加密算法有 DES、3DES、AES 等。
- 非对称加密算法:使用公钥和私钥进行加密和解密,常见的非对称加密算法有 RSA、DSA 等。
- 散列算法:将数据映射为固定长度的散列值,不可逆,常见的散列算法有 MD5、SHA1、SHA256、SHA512 等。
下面是一个使用 AES 对称加密算法进行加密和解密的示例代码:
using System;
using System.Security.Cryptography;
using System.Text;
class Program
{
static void Main(string[] args)
{
string text = "Hello, world!"; // 待加密的字符串
string key = "this is a secret key"; // 密钥,需要保密
// 加密
byte[] encrypted = EncryptAes(text, key);
Console.WriteLine("Encrypted string: " + Convert.ToBase64String(encrypted));
// 解密
string decrypted = DecryptAes(encrypted, key);
Console.WriteLine("Decrypted string: " + decrypted);
}
// 使用 AES 对称加密算法加密数据
static byte[] EncryptAes(string text, string key)
{
byte[] keyBytes = Encoding.UTF8.GetBytes(key);
using (Aes aes = Aes.Create())
{
aes.Key = keyBytes;
aes.Mode = CipherMode.ECB;
aes.Padding = PaddingMode.PKCS7;
byte[] textBytes = Encoding.UTF8.GetBytes(text);
using (ICryptoTransform encryptor = aes.CreateEncryptor())
{
return encryptor.TransformFinalBlock(textBytes, 0, textBytes.Length);
}
}
}
// 使用 AES 对称加密算法解密数据
static string DecryptAes(byte[] encrypted, string key)
{
byte[] keyBytes = Encoding.UTF8.GetBytes(key);
using (Aes aes = Aes.Create())
{
aes.Key = keyBytes;
aes.Mode = CipherMode.ECB;
aes.Padding = PaddingMode.PKCS7;
using (ICryptoTransform decryptor = aes.CreateDecryptor())
{
byte[] decryptedBytes = decryptor.TransformFinalBlock(encrypted, 0, encrypted.Length);
return Encoding.UTF8.GetString(decryptedBytes);
}
}
}
}
在这个示例中,我们使用了 AES 对称加密算法对字符串进行加密和解密。在加密时,我们首先将密钥转换为字节数组,然后创建一个 AES 对象,并设置加密模式、填充方式和密钥。接着,将要加密的字符串转换为字节数组,使用 CreateEncryptor 方法创建一个加密器,将加密器应用到数据上,最后返回加密后的字节数组。
在解密时,我们使用密钥和加密后的字节数组创建一个 AES 对象,并设置加密模式、填充方式和密钥。然后,使用 CreateDecryptor 方法创建一个解密器,将解密器应用到加密后的字节数组上,最后将解密后的字节数组转换为字符串。
除了对称加密算法,C# 中还提供了其他的加密算法,如 RSA 非对称加密算法和 MD5 散列算法。使用 RSA 非对称加密算法时,需要生成一对公钥和私钥,并将公钥用于加密数据,私钥用于解密数据。使用 MD5 散列算法时,可以将数据映射为一个 128 位的散列值,该散列值在理论上不可逆。
下面是一个使用 RSA 非对称加密算法进行加密和解密的示例代码:
using System;
using System.Security.Cryptography;
using System.Text;
class Program
{
static void Main(string[] args)
{
string text = "Hello, world!"; // 待加密的字符串
// 创建 RSA 对象并生成公钥和私钥
using (RSA rsa = RSA.Create())
{
string publicKey = Convert.ToBase64String(rsa.ExportRSAPublicKey());
string privateKey = Convert.ToBase64String(rsa.ExportRSAPrivateKey());
Console.WriteLine("Public key: " + publicKey);
Console.WriteLine("Private key: " + privateKey);
// 加密
byte[] encrypted = EncryptRsa(text, publicKey);
Console.WriteLine("Encrypted string: " + Convert.ToBase64String(encrypted));
// 解密
string decrypted = DecryptRsa(encrypted, privateKey);
Console.WriteLine("Decrypted string: " + decrypted);
}
}
// 使用 RSA 非对称加密算法加密数据
static byte[] EncryptRsa(string text, string publicKey)
{
byte[] publicKeyBytes = Convert.FromBase64String(publicKey);
using (RSA rsa = RSA.Create())
{
rsa.ImportRSAPublicKey(publicKeyBytes, out _);
byte[] textBytes = Encoding.UTF8.GetBytes(text);
byte[] encryptedBytes = rsa.Encrypt(textBytes, RSAEncryptionPadding.Pkcs1);
return encryptedBytes;
}
}
// 使用 RSA 非对称加密算法解密数据
static string DecryptRsa(byte[] encrypted, string privateKey)
{
byte[] privateKeyBytes = Convert.FromBase64String(privateKey);
using (RSA rsa = RSA.Create())
{
rsa.ImportRSAPrivateKey(privateKeyBytes, out _);
byte[] decryptedBytes = rsa.Decrypt(encrypted, RSAEncryptionPadding.Pkcs1);
string decryptedText = Encoding.UTF8.GetString(decryptedBytes);
return decryptedText;
}
}
}
在这个示例中,我们首先创建了一个 RSA 对象,并使用 ExportRSAPublicKey 和 ExportRSAPrivateKey 方法生成公钥和私钥。在加密时,我们将公钥转换为字节数组,使用 RSA.Create 方法创建一个 RSA 对象,并使用 ImportRSAPublicKey 方法导入公钥。然后,将要加密的字符串转换为字节数组,使用 Encrypt 方法进行加密,最后返回加密后的字节数组。
在解密时,我们将私钥转换为字节数组,使用 RSA.Create 方法创建一个 RSA 对象,并使用ImportRSAPrivateKey 方法导入私钥。然后,将加密后的字节数组传递给 Decrypt 方法进行解密,最后将解密后的字节数组转换为字符串并返回。
对于使用 MD5 散列算法进行加密的示例代码,可以参考以下代码:
using System;
using System.Security.Cryptography;
using System.Text;
class Program
{
static void Main(string[] args)
{
string text = "Hello, world!"; // 待加密的字符串
// 计算散列值
byte[] hash = ComputeMd5Hash(text);
Console.WriteLine("MD5 hash: " + Convert.ToBase64String(hash));
}
// 使用 MD5 散列算法计算散列值
static byte[] ComputeMd5Hash(string text)
{
byte[] textBytes = Encoding.UTF8.GetBytes(text);
using (MD5 md5 = MD5.Create())
{
byte[] hashBytes = md5.ComputeHash(textBytes);
return hashBytes;
}
}
}
在这个示例中,我们首先将要加密的字符串转换为字节数组,然后使用 MD5.Create 方法创建一个 MD5 对象,并使用 ComputeHash 方法计算散列值,最后返回散列值的字节数组。由于 MD5 散列值在理论上不可逆,因此这种方式一般用于数据的校验或者简单的加密场景。
总的来说,C# 中提供了多种加密算法和库,可以根据不同的需求选择合适的算法进行加密和解密操作。