C#加解密之DES算法的实现
简介
DES是一种对称加密算法,常用于数据加密解密、数字签名等方面。在C#中可以使用System.Security.Cryptography命名空间中的类库来实现DES加解密功能。
实现流程
1. 创建DES对象
首先,我们需要创建一个Des类的对象,代码如下:
using System.Security.Cryptography;
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
2. 设置密钥和向量
DES算法需要设置一个8位的密钥和一个8位的向量。可以使用以上代码创建的des
对象来生成随机的密钥和向量。
byte[] key = des.Key;
byte[] iv = des.IV;
密钥和向量是二进制数据,但可以通过Base64编码转化为字符串进行保存。可以使用以下代码分别获取密钥和向量的Base64编码字符串:
string keyString = Convert.ToBase64String(key);
string ivString = Convert.ToBase64String(iv);
3. 加密
加密可以通过以下代码实现:
byte[] plaintext = Encoding.UTF8.GetBytes("要加密的数据");
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, des.CreateEncryptor(), CryptoStreamMode.Write))
{
csEncrypt.Write(plaintext, 0, plaintext.Length);
csEncrypt.FlushFinalBlock();
byte[] ciphertext = msEncrypt.ToArray();
}
}
以上代码中,我们使用MemoryStream来暂存加密后的数据。同时,使用CryptoStream类将数据写入MemoryStream中,并使用CreateEncryptor方法来创建DES加密器。
4. 解密
解密可以通过类似的代码实现:
byte[] ciphertext = // 从加密后的数据源中获取到的数据
byte[] plaintext = new byte[ciphertext.Length];
using (MemoryStream msDecrypt = new MemoryStream(ciphertext))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, des.CreateDecryptor(), CryptoStreamMode.Read))
{
csDecrypt.Read(plaintext, 0, plaintext.Length);
}
}
string result = Encoding.UTF8.GetString(plaintext);
以上代码中,我们使用MemoryStream来暂存解密后的数据。同时,使用CryptoStream类将数据从MemoryStream中读取,并使用CreateDecryptor方法来创建DES解密器。
示例说明
以下是两个关于DES加解密的示例说明:
示例1:使用固定密钥和向量进行加解密
string keyString = "fwniu37c";
string ivString = "jxczoe17";
byte[] key = Convert.FromBase64String(keyString);
byte[] iv = Convert.FromBase64String(ivString);
using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
{
des.Key = key;
des.IV = iv;
byte[] plaintext = Encoding.UTF8.GetBytes("要加密的数据");
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, des.CreateEncryptor(), CryptoStreamMode.Write))
{
csEncrypt.Write(plaintext, 0, plaintext.Length);
csEncrypt.FlushFinalBlock();
byte[] ciphertext = msEncrypt.ToArray();
byte[] decryptedText = new byte[ciphertext.Length];
using (MemoryStream msDecrypt = new MemoryStream(ciphertext))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, des.CreateDecryptor(), CryptoStreamMode.Read))
{
csDecrypt.Read(decryptedText, 0, decryptedText.Length);
}
}
string result = Encoding.UTF8.GetString(decryptedText);
Console.WriteLine(result);
}
}
}
示例2:使用随机生成的密钥和向量进行加解密
using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
{
byte[] key = des.Key;
byte[] iv = des.IV;
string keyString = Convert.ToBase64String(key);
string ivString = Convert.ToBase64String(iv);
Console.WriteLine($"key: {keyString}");
Console.WriteLine($"iv: {ivString}");
byte[] plaintext = Encoding.UTF8.GetBytes("要加密的数据");
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, des.CreateEncryptor(), CryptoStreamMode.Write))
{
csEncrypt.Write(plaintext, 0, plaintext.Length);
csEncrypt.FlushFinalBlock();
byte[] ciphertext = msEncrypt.ToArray();
byte[] decryptedText = new byte[ciphertext.Length];
using (MemoryStream msDecrypt = new MemoryStream(ciphertext))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, des.CreateDecryptor(), CryptoStreamMode.Read))
{
csDecrypt.Read(decryptedText, 0, decryptedText.Length);
}
}
string result = Encoding.UTF8.GetString(decryptedText);
Console.WriteLine(result);
}
}
}
在这两个示例中,我们分别使用了固定的和随机生成的密钥和向量进行了加解密操作。通过在控制台输出加密后的字符串,我们可以看到正确地将字符串加密后再进行解密,确保了所谓的DES数据保密性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#加解密之DES算法的实现 - Python技术站