C# .NET框架 DES ECB加密解密

.NET框架中由命名空间System.Security.Cryptography包含与签名、加密相关的类。
DES加密是一种对称加密算法,对称加密算法用同一个密钥对数据加密和解密,因此命名,适合对大批量的数据加密。
DES加密对应的类是DESCryptoServiceProvider。
ECB(Electronic Codebook,电码本)是DES的一种,是分组密码的一种最基本的工作模式。密钥为8字节,数据块为8字节,分别对每数据块独立进行加密或解密处理。具有操作简单,易于实现的特点。同时由于其分组的独立性,利于实现并行处理,并且能很好地防止误差传播。另一方面由于所有分组的加密方式一致,明文中的重复内容会在密文中有所体现,因此难以抵抗统计分析攻击。因此,ECB模式一般只适用于小数据量的字符信息的安全性保护,例如密钥保护。不依赖向量,易受到字典攻击。

 //DES加密 ECB 
 public static byte[] Encrypt(string encryptString, string sKey)
 {
     try
     {
         string key;
         //密钥为8位
         if (sKey.Length <= 8)
         {
             key = sKey.PadRight(8, '0');
         }
         else
         {
             key = sKey.Substring(0, 8);
         }
         
         byte[] keyBytes = Encoding.Default.GetBytes(key);
         byte[] keyIV = keyBytes;
         byte[] encryptBytes = Encoding.Default.GetBytes(encryptString);
                      
         DESCryptoServiceProvider desProvider = new DESCryptoServiceProvider();
         // 使用ECB方式
         desProvider.Mode = CipherMode.ECB;
         // PKCS7padding
         desProvider.Padding = PaddingMode.PKCS7;
         MemoryStream memStream = new MemoryStream();
         //CreateEncryptor(keyBytes, keyIV)类似于OpenSSL中的密钥置换
         CryptoStream crypStream = new CryptoStream(memStream, desProvider.CreateEncryptor(keyBytes, keyIV), CryptoStreamMode.Write);
         crypStream.Write(encryptBytes, 0, encryptBytes.Length);
         crypStream.FlushFinalBlock();
         byte[] cipherBytes = memStream.ToArray();
         
         return cipherBytes;
     }
     catch
     {
         return Encoding.Default.GetBytes(encryptString);
     }
 }
 //DEC解密 ECB
public static string Decrypt(string decryptString, string sKey)
{
    //key为8位
    string key;
    if (sKey.Length <= 8)
    {
        key = sKey.PadRight(8, '0');
    }
    else
    {
        key = sKey.Substring(0, 8);
    }
    byte[] keyBytes = Encoding.Default.GetBytes(key);
    byte[] keyIV = keyBytes;
    byte[] inputByteArray = Convert.FromBase64String(decryptString);
    
    DESCryptoServiceProvider desProvider = new DESCryptoServiceProvider();
    desProvider.Mode = CipherMode.ECB;
    MemoryStream memStream = new MemoryStream();
    CryptoStream crypStream = new CryptoStream(memStream, desProvider.CreateDecryptor(keyBytes, keyIV), CryptoStreamMode.Write);
    crypStream.Write(inputByteArray, 0, inputByteArray.Length);
    crypStream.FlushFinalBlock();
    
    return Encoding.Default.GetString(memStream.ToArray());
}

PKCS7padding
DES加密对明文有长度要求,所以会ECB要求密钥为8位,明文会被分成8字节一组的数据块,对每个数据块单独加密,然后拼接,这样数据不是8的整数倍就必须对最后一个数据块填充,填充方式一般有PKCS7Padding/PKCS5Padding/ZeroPadding。DESCryptoServiceProvider类默认的填充方式是PKCS7padding,块大小是8字节,实际上就是PKCS5Padding。数据块大小是8字节,假设数据长度需要n(0<n<8)才对齐,那么填充n个字节,每个字节都是n;如果数据本身已经对齐了,要填充8个字节的8。这些分块、填充、拼接操作都封装在类里。


版权声明:本文为weixin_38973882原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。