C#盐加密解密
时间: 2023-07-12 17:08:47 浏览: 67
C#中的盐加密解密可以使用以下步骤:
1. 生成一个随机的盐值
2. 将盐值与要加密的数据进行拼接
3. 使用某种加密算法(如AES)对拼接后的字符串进行加密
4. 将盐值和加密后的数据一起存储
解密时,需要先取出盐值,然后使用相同的加密算法对剩余部分进行解密。以下是一个示例代码:
```csharp
using System;
using System.Security.Cryptography;
using System.Text;
class Program
{
static void Main(string[] args)
{
string password = "password123";
string salt = GenerateSalt();
string encryptedPassword = EncryptPassword(password, salt);
Console.WriteLine("Original password: " + password);
Console.WriteLine("Salt: " + salt);
Console.WriteLine("Encrypted password: " + encryptedPassword);
string decryptedPassword = DecryptPassword(encryptedPassword, salt);
Console.WriteLine("Decrypted password: " + decryptedPassword);
}
static string GenerateSalt()
{
byte[] saltBytes = new byte[16];
using (var rng = new RNGCryptoServiceProvider())
{
rng.GetBytes(saltBytes);
}
return Convert.ToBase64String(saltBytes);
}
static string EncryptPassword(string password, string salt)
{
byte[] saltBytes = Convert.FromBase64String(salt);
byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
byte[] combinedBytes = new byte[saltBytes.Length + passwordBytes.Length];
Buffer.BlockCopy(saltBytes, 0, combinedBytes, 0, saltBytes.Length);
Buffer.BlockCopy(passwordBytes, 0, combinedBytes, saltBytes.Length, passwordBytes.Length);
byte[] encryptedBytes;
using (var aes = Aes.Create())
{
aes.KeySize = 256;
aes.BlockSize = 128;
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
aes.GenerateIV();
aes.Key = Encoding.UTF8.GetBytes("mysecretpassword12345");
using (var encryptor = aes.CreateEncryptor())
{
encryptedBytes = encryptor.TransformFinalBlock(combinedBytes, 0, combinedBytes.Length);
}
}
return Convert.ToBase64String(encryptedBytes);
}
static string DecryptPassword(string encryptedPassword, string salt)
{
byte[] saltBytes = Convert.FromBase64String(salt);
byte[] encryptedBytes = Convert.FromBase64String(encryptedPassword);
byte[] decryptedBytes;
using (var aes = Aes.Create())
{
aes.KeySize = 256;
aes.BlockSize = 128;
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
aes.Key = Encoding.UTF8.GetBytes("mysecretpassword12345");
aes.IV = encryptedBytes.Take(16).ToArray();
using (var decryptor = aes.CreateDecryptor())
{
decryptedBytes = decryptor.TransformFinalBlock(encryptedBytes, 16, encryptedBytes.Length - 16);
}
}
byte[] passwordBytes = new byte[decryptedBytes.Length - saltBytes.Length];
Buffer.BlockCopy(decryptedBytes, saltBytes.Length, passwordBytes, 0, passwordBytes.Length);
return Encoding.UTF8.GetString(passwordBytes);
}
}
```
注意,上述代码中的密码和加密密钥应该使用更加安全的方式进行管理,例如将其存储在安全的密钥库中。