• 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;
                    }
                }
            }
    
        }
    }
  • 相关阅读:
    jquery ready()的几种实现方法小结
    jQuery之$(document).ready()使用介绍
    jquery的$(document).ready()和onload的加载顺序
    php var_export与var_dump 输出的不同
    PHP获取和操作配置文件php.ini的几个函数
    PHP 网站保存快捷方式的实现代码
    php 图形验证码的3种方法
    面向对象基础01
    提高记忆力
    Python数据分析环境和工具
  • 原文地址:https://www.cnblogs.com/tlmbem/p/10689478.html
Copyright © 2020-2023  润新知