C# DES加密

第一种:
  2 using System;
  3 using System.Text;
  4 using System.Security.Cryptography;
  5 using System.IO;
  6 
  7 /// <summary>
  8 /// Summary description for EncryptAndDecrypt
  9 /// </summary>
 10 public class EncryptAndDecrypt
 11 {
 12     //默认密钥向量
 13     private static byte[] Keys = { 0x120x340x560x780x900xAB0xCD0xEF };
 14     /**//// <summary>
 15     /// DES加密字符串
 16     /// </summary>
 17     /// <param name="encryptString">待加密的字符串</param>
 18     /// <param name="encryptKey">加密密钥,要求为8位</param>
 19     /// <returns>加密成功返回加密后的字符串,失败返回源串</returns>
 20     public static string EncryptDES(string encryptString, string encryptKey)
 21     {
 22         try
 23         {           
 24             byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(08));
 25             byte[] rgbIV = Keys;
 26             byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
 27              DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
 28              MemoryStream mStream = new MemoryStream();
 29              CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
 30              cStream.Write(inputByteArray, 0, inputByteArray.Length);
 31              cStream.FlushFinalBlock();
 32             return Convert.ToBase64String(mStream.ToArray());
 33          }
 34         catch
 35         {
 36             return encryptString;
 37         }
 38     }
 39 
 40     /**//// <summary>
 41     /// DES解密字符串
 42     /// </summary>
 43     /// <param name="decryptString">待解密的字符串</param>
 44     /// <param name="decryptKey">解密密钥,要求为8位,和加密密钥相同</param>
 45     /// <returns>解密成功返回解密后的字符串,失败返源串</returns>
 46     public static string DecryptDES(string decryptString, string decryptKey)
 47     {
 48         try
 49         {
 50             byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey);
 51             byte[] rgbIV = Keys;
 52             byte[] inputByteArray = Convert.FromBase64String(decryptString);
 53              DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
 54              MemoryStream mStream = new MemoryStream();
 55              CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
 56              cStream.Write(inputByteArray, 0, inputByteArray.Length);
 57              cStream.FlushFinalBlock();
 58             return Encoding.UTF8.GetString(mStream.ToArray());
 59          }
 60         catch
 61          {
 62             return decryptString;
 63          }
 64     }
 65 }
 66 第二种:
 67 
 68 //名称空间
 69 using System;
 70 using System.Security.Cryptography;
 71 using System.IO;
 72 using System.Text; 
 73 
 74 /// <summary>
 75 /// Summary description for Encryption
 76 /// </summary>
 77 public class Encryption
 78 {
 79     /// <summary>
 80     /// Default Key
 81     /// </summary>
 82     public const string Key = "bmc.1001";
 83     /// <summary>
 84     /// Initial
 85     /// </summary>
 86     public Encryption()
 87     {
 88        ///
 89     }
 90     /// <summary>
 91     /// 加密方法
 92     /// </summary>
 93     /// <param name="pToEncrypt"></param>
 94     /// <param name="sKey"></param>
 95     /// <returns></returns>
 96     public string Encrypt(string pToEncrypt, string sKey)
 97     {
 98         DESCryptoServiceProvider des = new DESCryptoServiceProvider();
 99         //把字符串放到byte数组中
100         //原来使用的UTF8编码,我改成Unicode编码了,不行
101         byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);
102         //byte[]  inputByteArray=Encoding.Unicode.GetBytes(pToEncrypt); 
103 
104         //建立加密对象的密钥和偏移量
105         //原文使用ASCIIEncoding.ASCII方法的GetBytes方法
106         //使得输入密码必须输入英文文本
107         des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
108         des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
109         //创建其支持存储区为内存的流
110         MemoryStream ms = new MemoryStream();
111         //将数据流链接到加密转换的流
112         CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
113         //Write  the  byte  array  into  the  crypto  stream 
114         //(It  will  end  up  in  the  memory  stream) 
115         cs.Write(inputByteArray, 0, inputByteArray.Length);
116         //用缓冲区的当前状态更新基础数据源或储存库,随后清除缓冲区
117         cs.FlushFinalBlock();
118         //Get  the  data  back  from  the  memory  stream,  and  into  a  string 
119         byte[] EncryptData = (byte[])ms.ToArray();
120         return System.Convert.ToBase64String(EncryptData, 0, EncryptData.Length);
121     }
122     /// <summary>
123     /// 解密方法
124     /// </summary>
125     /// <param name="pToDecrypt"></param>
126     /// <param name="sKey"></param>
127     /// <returns></returns> 
128     public string Decrypt(string pToDecrypt, string sKey)
129     {
130         DESCryptoServiceProvider des = new DESCryptoServiceProvider();
131         //Put  the  input  string  into  the  byte  array 
132         byte[] inputByteArray = Convert.FromBase64String(pToDecrypt);
133        
134         //建立加密对象的密钥和偏移量,此值重要,不能修改
135         des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
136         des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
137         MemoryStream ms = new MemoryStream();
138         CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
139         //Flush  the  data  through  the  crypto  stream  into  the  memory  stream 
140         cs.Write(inputByteArray, 0, inputByteArray.Length);
141         cs.FlushFinalBlock();
142         return System.Text.Encoding.Default.GetString(ms.ToArray());
143     }
144 }
145

<think>我们被要求使用C#实现DES加密。根据引用[1]和引用[2],我们知道在C#中可以使用`System.Security.Cryptography`命名空间下的`DES`类来实现。同时,引用[2]提到了一些关键点:密钥、偏移量(IV)、块密码模式(如ECB、CBC)和填充模式(如PKCS7)。这些都需要在加密时设置正确,以确保与其他系统(如Java)的互操作性。 在C#中实现DES加密的步骤: 1. 创建DES加密服务提供对象。 2. 设置密钥(Key)和初始化向量(IV)。注意:在ECB模式下不需要IV,而在CBC模式下需要。 3. 设置加密模式(Mode)和填充模式(Padding)。 4. 创建加密转换器(ICryptoTransform)。 5. 使用MemoryStream和CryptoStream进行加密操作。 6.加密后的字节数组转换为Base64字符串(或十六进制字符串)以便传输或存储。 注意:密钥长度必须为8字节(64),但DES实际只使用56(每个字节的第8用作奇偶校验)。在.NET中,我们直接使用8字节的密钥。 以下是一个C#实现DES加密的示例代码,支持不同的加密模式(如CBC和ECB)和填充模式(如PKCS7)。我们将创建一个方法,允许指定密钥、IV、模式和填充。 根据引用[2],如果使用ECB模式,则不需要IV(但C#要求设置IV,我们可以将IV设置为全0或与密钥相同,但更安全的做法是使用随机IV,不过ECB模式本身不安全,不推荐使用)。在ECB模式下,设置IV为全0是常见的做法。 然而,为了安全,通常推荐使用CBC模式,并需要随机生成IV(每次加密都随机生成,然后将IV和密文一起存储或传输)。 我们将分别提供两种模式的示例:ECB(不推荐,仅为了兼容性)和CBC(推荐)。 但注意:用户要求是DES加密,我们按照要求实现。 由于DES已经不再安全,建议仅用于遗留系统兼容,新系统应使用AES等更安全的算法。 代码实现:</think>### C# DES加密实现方法 在C#中实现DES加密需要使用`System.Security.Cryptography`命名空间下的类。以下是完整的实现步骤和代码示例: #### 1. 基本DES加密实现 ```csharp using System; using System.IO; using System.Security.Cryptography; using System.Text; public class DESHelper { // DES加密方法 public static string Encrypt(string plainText, string key) { // 验证密钥长度(必须为8字节) if (key.Length != 8) throw new ArgumentException("密钥长度必须为8个字符"); using (DESCryptoServiceProvider des = new DESCryptoServiceProvider()) { // 设置加密参数 des.Key = Encoding.UTF8.GetBytes(key); des.IV = Encoding.UTF8.GetBytes(key); // IV通常与Key相同 des.Mode = CipherMode.CBC; // 默认使用CBC模式 des.Padding = PaddingMode.PKCS7; // 推荐填充模式 using (MemoryStream ms = new MemoryStream()) { using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write)) { byte[] plainBytes = Encoding.UTF8.GetBytes(plainText); cs.Write(plainBytes, 0, plainBytes.Length); cs.FlushFinalBlock(); } return Convert.ToBase64String(ms.ToArray()); } } } // DES解密方法 public static string Decrypt(string cipherText, string key) { if (key.Length != 8) throw new ArgumentException("密钥长度必须为8个字符"); using (DESCryptoServiceProvider des = new DESCryptoServiceProvider()) { des.Key = Encoding.UTF8.GetBytes(key); des.IV = Encoding.UTF8.GetBytes(key); des.Mode = CipherMode.CBC; des.Padding = PaddingMode.PKCS7; using (MemoryStream ms = new MemoryStream()) { using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write)) { byte[] cipherBytes = Convert.FromBase64String(cipherText); cs.Write(cipherBytes, 0, cipherBytes.Length); cs.FlushFinalBlock(); } return Encoding.UTF8.GetString(ms.ToArray()); } } } } ``` #### 2. 使用示例 ```csharp // 加密示例 string originalText = "需要加密的敏感数据"; string secretKey = "myKey123"; // 必须是8个字符 string encrypted = DESHelper.Encrypt(originalText, secretKey); Console.WriteLine($"加密结果: {encrypted}"); // 解密示例 string decrypted = DESHelper.Decrypt(encrypted, secretKey); Console.WriteLine($"解密结果: {decrypted}"); ``` #### 3. 关键参数说明 1. **密钥(Key)**: - 必须是**8字节(64)**长度 - 实际安全密钥为56(每个字节的第8为奇偶校验) - 示例:`"secret12"`(8个字符) 2. **初始化向量(IV)**: - 通常设置为与Key相同的值 - 在CBC模式下必须提供,ECB模式下不需要 - 长度必须为8字节 3. **加密模式(Mode)**: - `CipherMode.CBC`(默认):更安全,需要IV - `CipherMode.ECB`:简单但安全性较低 - 与Java互操作时需保持模式一致[^2] 4. **填充模式(Padding)**: - `PaddingMode.PKCS7`(推荐):最常用 - `PaddingMode.Zeros`:零填充 - 不同系统间需保持一致 #### 4. 与Java互操作的注意事项 ```csharp // 与Java DES互操作的特殊设置 public static string DecryptJavaCompatible(string cipherText, string key) { using (DESCryptoServiceProvider des = new DESCryptoServiceProvider()) { // 设置ECB模式(Java默认模式) des.Mode = CipherMode.ECB; des.Padding = PaddingMode.PKCS7; des.Key = Encoding.UTF8.GetBytes(key); // ECB模式下IV可忽略 using (MemoryStream ms = new MemoryStream()) { using (CryptoStream cs = new CryptoStream( ms, des.CreateDecryptor(), CryptoStreamMode.Write)) { byte[] data = Convert.FromBase64String(cipherText); cs.Write(data, 0, data.Length); cs.FlushFinalBlock(); return Encoding.UTF8.GetString(ms.ToArray()); } } } } ``` #### 5. 安全建议 1. **密钥管理**: ```csharp // 不要硬编码密钥,应从安全存储获取 string key = ConfigurationManager.AppSettings["DES_Key"]; ``` 2. **使用更安全的算法**: ```csharp // DES已过时,推荐使用AES using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider()) { // AES实现代码... } ``` 3. **错误处理**: ```csharp try { string result = DESHelper.Encrypt(data, key); } catch (CryptographicException ex) { // 处理加密错误 } ``` ### 数学原理补充 DES算法核心是Feistel网络结构,加密过程包含16轮迭代操作: $$ \begin{aligned} L_i &= R_{i-1} \\ R_i &= L_{i-1} \oplus F(R_{i-1}, K_i) \end{aligned} $$ 其中: - $L_i$ 和 $R_i$ 是第i轮的左右32分组 - $K_i$ 是第i轮的子密钥 - $F$ 函数包含扩展置换、S盒替换和P盒置换 ### 注意事项 1. DES已被证明不安全,仅适用于兼容旧系统 2. 生产环境推荐使用AES(Rijndael)算法 3. 确保加密模式、填充模式与解密方一致 4. 使用Base64编码处理二进制加密结果[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值