zoukankan      html  css  js  c++  java
  • DES加密

    1 DES算法是对称可逆加密算法,DES是一个分组加密算法,典型的DES以64位为分组对数据加密。
    2 DES常见的有ECB模式和CBC模式。ECB模式是JAVA封装的DES算法的默认模式, CBC模式是.NET封装的DES算法的默认模式。
      3.1 ECB是不推荐的方式,只要Key相同时,相同的明文在不同的时候产生相同的明文,容易遭到字典攻击;
      3.2 CBC由于加入了向量参数,一定程度上抵御了字典工具,但缺点也随之而来,一旦中间一个数据出错或丢失,后面的数据将受到影响;
      3.3 CFB与CBC类似,好处是明文和密文不用是8bit的整数倍,中间一个数据出错,只影响后面的几个块的数据;
      3.4 OFB比CFB方式,一旦一个数据出错,不会影响后面的数据,但安全性降低;

    4 PKCS7填充方式:为.NET和JAVA的默认填充方式,对加密数据字节长度对8取余为r,如r大于0,则补8-r个字节,字节为8-r的值;如果r等于0,则补8个字节8。

    源码:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Security.Cryptography;
    using System.Text;
    
    namespace Cryp
    {
        public static class DES
        {
            /// <summary>  
            /// DES加密
            /// </summary>  
            /// <param name="data">要加密的字符串</param>  
            /// <param name="key">密钥,且Length必须为8位</param>  
            /// <param name="keyEncoding">密钥编码方式</param>  
            /// <param name="dataEncoding">要加密字符串加载时编码方式</param>  
            /// <param name="cipherMode">对称算法的运算模式</param>  
            /// <param name="paddingMode">对称算法中使用的填充模式</param>  
            /// <returns>64位编码字符串</returns>  
            public static string DESEncrypt(string data, string key, Encoding keyEncoding, Encoding dataEncoding, CipherMode cipherMode = CipherMode.CBC, PaddingMode paddingMode = PaddingMode.PKCS7)
            {
                return Convert.ToBase64String(DESEncrypt(dataEncoding.GetBytes(data), key, keyEncoding, cipherMode, paddingMode));
            }
    
            /// <summary>  
            /// DES加密
            /// </summary>  
            /// <param name="data">要加密字节流</param>  
            /// <param name="key">密钥,且Length必须为8位</param> 
            /// <param name="keyEncoding">密钥编码方式</param>   
            /// <param name="cipherMode">对称算法的运算模式</param> 
            /// <param name="paddingMode">对称算法中使用的填充模式</param>  
            /// <returns></returns>  
            public static byte[] DESEncrypt(byte[] data, string key, Encoding keyEncoding, CipherMode cipherMode, PaddingMode paddingMode = PaddingMode.PKCS7)
            {
                using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
                {
                    des.Key = keyEncoding.GetBytes(key);
                    des.IV = keyEncoding.GetBytes(key);
                    des.Mode = cipherMode;
                    des.Padding = paddingMode;
                    using (MemoryStream ms = new MemoryStream())
                    {
                        using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
                        {
                            cs.Write(data, 0, data.Length);
                            cs.FlushFinalBlock();
                        }
                        byte[] str = ms.ToArray();
                        return str;
                    }
                }
            }
    
            /// <summary>  
            /// DES解密  
            /// </summary>  
            /// <param name="data">要解密的字符串</param>  
            /// <param name="key">密钥,且Length必须为8位</param>  
            /// <param name="keyEncoding">密钥编码方式</param>  
            /// <param name="dataEncoding">要解密字符串加载时编码方式</param> 
            /// <param name="cipherMode">对称算法的运算模式</param>  
            /// <param name="paddingMode">对称算法中使用的填充模式</param>  
            /// <returns></returns>  
            public static string DESUnEncrypt(string data, string key, Encoding keyEncoding, Encoding dataEncoding, CipherMode cipherMode, PaddingMode paddingMode = PaddingMode.PKCS7)
            {
                return dataEncoding.GetString(DESUnEncrypt(Convert.FromBase64String(data), key, keyEncoding, cipherMode, paddingMode));
            }
    
            /// <summary>  
            /// DES解密。  
            /// </summary>  
            /// <param name="data">要解密字节流</param>  
            /// <param name="key">密钥,且Length必须为8位</param>  
            /// <param name="keyEncoding">密钥编码方式</param>  
            /// <param name="cipherMode">对称算法的运算模式</param>  
            /// <param name="paddingMode">对称算法中使用的填充模式</param>  
            /// <returns></returns>  
            public static byte[] DESUnEncrypt(byte[] data, string key, Encoding keyEncoding, CipherMode cipherMode, PaddingMode paddingMode = PaddingMode.PKCS7)
            {
                using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
                {
                    des.Key = keyEncoding.GetBytes(key);
                    des.IV = keyEncoding.GetBytes(key);
                    des.Mode = cipherMode;
                    using (MemoryStream ms = new MemoryStream())
                    {
                        using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
                        {
                            cs.Write(data, 0, data.Length);
                            cs.FlushFinalBlock();
                        }
                        byte[] str = ms.ToArray();
                        return str;
                    }
                }
            }
    
        }
    }
  • 相关阅读:
    SQl 事物+视图+游标+索引+锁
    常用经典SQL语句大全完整版--详解+实例 《来自网络,很全没整理,寄存与此》
    SQL--存储过程+触发器 对比!
    SQL---触发器
    SQL (一)定义变量以及变量赋值
    Js 事件大全
    ASP.NET 常用内置对象详解-----Response
    母板页----路径问题
    构建低代码开发生态,APICloud全面进入3.0时代
    APICloud:云端服务开发的硬核要素
  • 原文地址:https://www.cnblogs.com/tlmbem/p/10689478.html
Copyright © 2011-2022 走看看