zoukankan      html  css  js  c++  java
  • c# aes,des,md5加密等解密算法

    一:可逆加密,即是能加密也能解密

    1. 对称可逆加密:加密后能解密回原文,加密key和解密key是一个
    2. 加密算法都是公开的,密钥是保密的, 即使拿到密文 你是推算不了密钥 也推算不了原文
    3. 加密解密的速度快,问题是密钥的安全

    1:DES加密解密

     1 /// <summary>
     2 /// DES AES Blowfish
     3 ///  对称加密算法的优点是速度快,
     4 ///  缺点是密钥管理不方便,要求共享密钥。
     5 /// 可逆对称加密  密钥长度8
     6 /// </summary>
     7 public class DesEncrypt
     8     {
     9         private static byte[] _rgbKey = ASCIIEncoding.ASCII.GetBytes("12345678");
    10         private static byte[] _rgbIV = ASCIIEncoding.ASCII.GetBytes("AES00000");
    11         /// <summary>
    12         /// DES 加密
    13         /// </summary>
    14         /// <param name="text">需要加密的值</param>
    15         /// <returns>加密后的结果</returns>
    16         public static string Encrypt(string text)
    17         {
    18             DESCryptoServiceProvider dsp = new DESCryptoServiceProvider();
    19             using (MemoryStream memStream = new MemoryStream())
    20             {
    21                 CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateEncryptor(_rgbKey, _rgbIV), CryptoStreamMode.Write);
    22                 StreamWriter sWriter = new StreamWriter(crypStream);
    23                 sWriter.Write(text);
    24                 sWriter.Flush();
    25                 crypStream.FlushFinalBlock();
    26                 memStream.Flush();
    27                 return Convert.ToBase64String(memStream.GetBuffer(), 0, (int)memStream.Length);
    28             }
    29         }
    30 
    31         /// <summary>
    32         /// DES解密
    33         /// </summary>
    34         /// <param name="encryptText"></param>
    35         /// <returns>解密后的结果</returns>
    36         public static string Decrypt(string encryptText)
    37         {
    38             DESCryptoServiceProvider dsp = new DESCryptoServiceProvider();
    39             byte[] buffer = Convert.FromBase64String(encryptText);
    40 
    41             using (MemoryStream memStream = new MemoryStream())
    42             {
    43                 CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateDecryptor(_rgbKey, _rgbIV), CryptoStreamMode.Write);
    44                 crypStream.Write(buffer, 0, buffer.Length);
    45                 crypStream.FlushFinalBlock();
    46                 return ASCIIEncoding.UTF8.GetString(memStream.ToArray());
    47             }
    48         }
    49     }
    View Code

     2:AES加密解密

    c#代码:

     1 public class AesEncrypts
     2     {
     3         /// <summary>
     4         ///  AES 加密
     5         /// </summary>
     6         /// <param name="str"></param>
     7         /// <param name="key"></param>
     8         /// <returns></returns>
     9         public static string AesEncrypt(string str, string key)
    10         {
    11             if (string.IsNullOrEmpty(str)) return null;
    12             Byte[] toEncryptArray = Encoding.UTF8.GetBytes(str);
    13             byte[] ivs = new byte[16];
    14             RijndaelManaged rm = new RijndaelManaged
    15             {
    16                 Key = Encoding.UTF8.GetBytes(key),
    17                 Mode = CipherMode.CBC, //位置偏移,如果是ECB则不需要ivs
    18                 Padding = PaddingMode.PKCS7,
    19                 IV=ivs
    20             };
    21 
    22             ICryptoTransform cTransform = rm.CreateEncryptor();
    23             Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
    24 
    25             return Convert.ToBase64String(resultArray, 0, resultArray.Length);
    26         }
    27 
    28         /// <summary>
    29         ///  AES 解密
    30         /// </summary>
    31         /// <param name="str"></param>
    32         /// <param name="key"></param>
    33         /// <returns></returns>
    34         public static string AesDecrypt(string str, string key)
    35         {
    36             if (string.IsNullOrEmpty(str)) return null;
    37             Byte[] toEncryptArray = Convert.FromBase64String(str);
    38             byte[] ivs = new byte[16];
    39             RijndaelManaged rm = new RijndaelManaged
    40             {
    41                 Key = Encoding.UTF8.GetBytes(key),
    42                 Mode =CipherMode.CBC,
    43                 Padding =PaddingMode.PKCS7,
    44                 IV=ivs
    45             };
    46 
    47             ICryptoTransform cTransform = rm.CreateDecryptor();
    48             Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
    49 
    50             return Encoding.UTF8.GetString(resultArray);
    51         }
    52     }
    View Code

    java代码:

     1 //
     2 // Source code recreated from a .class file by IntelliJ IDEA
     3 // (powered by Fernflower decompiler)
     4 //
     5 
     6 package com.lvmama.intlflight.api.common.util;
     7 
     8 import javax.crypto.Cipher;
     9 import javax.crypto.spec.IvParameterSpec;
    10 import javax.crypto.spec.SecretKeySpec;
    11 import sun.misc.BASE64Decoder;
    12 import sun.misc.BASE64Encoder;
    13 
    14 public class AESUtil {
    15     public AESUtil() {
    16     }
    17 
    18     public static String encrypt(String sSrc, String sKey) throws Exception {
    19         if(sKey == null) {
    20             System.out.print("Key为空null");
    21             return null;
    22         } else if(sKey.length() != 16) {
    23             System.out.print("Key长度不是16位");
    24             return null;
    25         } else {
    26             byte[] raw = sKey.getBytes();
    27             SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
    28             Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    29             byte[] ivs = new byte[16];
    30             IvParameterSpec iv = new IvParameterSpec(ivs);
    31             cipher.init(1, skeySpec, iv);
    32             byte[] encrypted = cipher.doFinal(sSrc.getBytes());
    33             return (new BASE64Encoder()).encode(encrypted);
    34         }
    35     }
    36 
    37     public static String decrypt(String sSrc, String sKey) throws Exception {
    38         try {
    39             if(sKey == null) {
    40                 System.out.print("Key为空null");
    41                 return null;
    42             } else if(sKey.length() != 16) {
    43                 System.out.print("Key长度不是16位");
    44                 return null;
    45             } else {
    46                 byte[] raw = sKey.getBytes("ASCII");
    47                 SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
    48                 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    49                 byte[] ivs = new byte[16];
    50                 IvParameterSpec iv = new IvParameterSpec(ivs);
    51                 cipher.init(2, skeySpec, iv);
    52                 byte[] encrypted1 = (new BASE64Decoder()).decodeBuffer(sSrc);
    53 
    54                 try {
    55                     byte[] original = cipher.doFinal(encrypted1);
    56                     String originalString = new String(original);
    57                     return originalString;
    58                 } catch (Exception var10) {
    59                     System.out.println(var10.toString());
    60                     return null;
    61                 }
    62             }
    63         } catch (Exception var11) {
    64             System.out.println(var11.toString());
    65             return null;
    66         }
    67     }
    68 
    69     public static void main(String[] args) throws Exception {
    70         String cKey = "1234567890123456";
    71         String cSrc = "abcdefghigklmnopqrstuvwxyz0123456789";
    72         System.out.println(cSrc);
    73         long lStart = System.currentTimeMillis();
    74         String enString = encrypt(cSrc, cKey);
    75         System.out.println("加密后的字串是:" + enString);
    76         long lUseTime = System.currentTimeMillis() - lStart;
    77         System.out.println("加密耗时:" + lUseTime + "毫秒");
    78         lStart = System.currentTimeMillis();
    79         String DeString = decrypt(enString, cKey);
    80         System.out.println("解密后的字串是:" + DeString);
    81         lUseTime = System.currentTimeMillis() - lStart;
    82         System.out.println("解密耗时:" + lUseTime + "毫秒");
    83     }
    84 }
    View Code

    二:不可逆加密,即是没有办法解密,其特点为如下几个:

    •  相同原文加密的结果是一样的
    •  不同长度的内容加密后加过都是32位
    •  原文差别很小,结果差别很大
    • 不管文件多大,都能产生32位长度摘要

    1:MD5加密代码:

     1  #region MD5
     2  /// <summary>
     3  /// MD5加密,和动网上的16/32位MD5加密结果相同,
     4  /// 使用的UTF8编码
     5  /// </summary>
     6  /// <param name="source">待加密字串</param>
     7  /// <param name="length">16或32值之一,其它则采用.net默认MD5加密算法</param>
     8  /// <returns>加密后的字串</returns>
     9  public static string Encrypt(string source, int length = 32)//默认参数
    10         {
    11             if (string.IsNullOrEmpty(source)) return string.Empty;
    12             HashAlgorithm provider = CryptoConfig.CreateFromName("MD5") as HashAlgorithm;
    13             byte[] bytes = Encoding.UTF8.GetBytes(source);//这里需要区别编码的
    14             byte[] hashValue = provider.ComputeHash(bytes);
    15             StringBuilder sb = new StringBuilder();
    16             switch (length)
    17             {
    18                 case 16://16位密文是32位密文的9到24位字符
    19                     for (int i = 4; i < 12; i++)
    20                     {
    21                         sb.Append(hashValue[i].ToString("x2"));
    22                     }
    23                     break;
    24                 case 32:
    25                     for (int i = 0; i < 16; i++)
    26                     {
    27                         sb.Append(hashValue[i].ToString("x2"));
    28                     }
    29                     break;
    30                 default:
    31                     for (int i = 0; i < hashValue.Length; i++)
    32                     {
    33                         sb.Append(hashValue[i].ToString("x2"));
    34                     }
    35                     break;
    36             }
    37             return sb.ToString();
    38         }
    39  #endregion MD5
    View Code

    2:MD5的用途

    A:防篡改:
    //发个文档,事先给别人一个MD5,是文档的摘要,
    //源代码管理器svn--即使电脑断网了,文件有任何改动都能被发现--本地存了一个文件的MD5--文件有更新,就再对比下MD5
    //急速秒传--扫描文件的MD5--跟已有的文件MD5比对--吻合表示文件已存在不用再上传

    B: 密码保存,防止看到明文
    //密码应该只有用户知道----数据库不能存明文---但是又需要验证
    //MD5加密下原始密码---数据库存密文---下次登录把密码MD5后再比对
    //密文是可见的,所以要求密码不能太简单,加盐(123456+wss)

    C 防止抵赖,数字签名
    //把一些内容摘要一下,由权威的第三方去保障,将来这个文件就是你做的,不能抵赖

     1  #region MD5摘要
     2  /// <summary>
     3  /// 获取文件的MD5摘要
     4  /// </summary>
     5  /// <param name="fileName"></param>
     6  /// <returns></returns>
     7  public static string AbstractFile(string fileName)
     8         {
     9             using (FileStream file = new FileStream(fileName, FileMode.Open))
    10             {
    11                 return AbstractFile(file);
    12             }
    13         }
    14  /// <summary>
    15  /// 根据stream获取文件摘要
    16  /// </summary>
    17  /// <param name="stream"></param>
    18  /// <returns></returns>
    19  public static string AbstractFile(Stream stream)
    20         {
    21             MD5 md5 = new MD5CryptoServiceProvider();
    22             byte[] retVal = md5.ComputeHash(stream);
    23 
    24             StringBuilder sb = new StringBuilder();
    25             for (int i = 0; i < retVal.Length; i++)
    26             {
    27                 sb.Append(retVal[i].ToString("x2"));
    28             }
    29             return sb.ToString();
    30         }
    31  #endregion
    View Code
  • 相关阅读:
    【海洋女神原创】安装导论谨以此文与那些徘徊在安装的大门外,并且被花哨的功能所迷惑的朋友们共勉。
    【海洋女神原创】Installshield脚本拷贝文件常见问题汇总
    Installshield获取安装包版本的系统变量是IFX_PRODUCT_VERSION
    Installshield 64位操作系统下拷贝文件,如何重定向到32位的系统文件夹下
    【海洋女神原创】installshield 32位打包和64位打包的注意事项
    Installshield关于.NET安装时需要重启动的处理办法,以及延伸出的重启后继续安装的安装包的一点想法
    【海洋女神原创】一个简单的带序列号输入的安装包
    How to:installshield安装包怎样才能出现选择路径的界面?
    Excel连接字符串在.NET中的应用
    将Excel的数据导入DataGridView中[原创]
  • 原文地址:https://www.cnblogs.com/loverwangshan/p/10609287.html
Copyright © 2011-2022 走看看