C# DES解密异常问题
2016-12-12 16:09
471 查看
一、C#DES解密操作定义
本实例是对使用DES加密,然后将加密结果转换成Base64字符串的解密操作。
特别说明:
1.在批量解密过程中,如果有很多的异常产生,程序会运行非常慢。
2.所以异常处理尽可能自己过滤,比如:验证当前字符串是否是合法的Base64格式
3.再者经常出问题的是 stream2.FlushFinalBlock(); 方法,目前没有找到更好的避开当前异常的方案。
它抛出的异常:“不正确的数据。”
如果有异常产生
如果没有异常产生
更多:
C#
Try/Catch性能测试
C#字符串连接和StringBuilder字符串拼接性能测试
private static string key = "ceshishiyong"; private static byte[] Keys = new byte[] { 0x12, 0x34, 0x56, 120, 0x90, 0xab, 0xcd, 0xef };//8个bit位,是DES算法的初始化向量 加解密钥也是8位; /// <summary> /// 解密字符串 /// </summary> /// <param name="decryptString">是要被解密的密文数据</param> /// <param name="decryptKey">DES算法的工作密钥</param> /// <returns>明文</returns> public static string Decrypt(string decryptString, string decryptKey) { byte[] result = null; try { decryptKey = decryptKey.Length > 8 ? decryptKey.Substring(0, 8) : decryptKey; decryptKey = decryptKey.PadRight(8, ' '); byte[] bytes = Encoding.UTF8.GetBytes(decryptKey); byte[] keys = Keys; //判断是否是base64的字符串 if (IsBase64(decryptString) == false) //转换异常出现位置1,自己处理 return string.Empty; byte[] buffer = Convert.FromBase64String(decryptString); DESCryptoServiceProvider provider = new DESCryptoServiceProvider(); MemoryStream stream = new MemoryStream(); ICryptoTransform tran = provider.CreateDecryptor(bytes, keys); CryptoStream stream2 = new CryptoStream(stream, tran, CryptoStreamMode.Write); stream2.Write(buffer, 0, buffer.Length); // stream2.FlushFinalBlock(); //不处理异常情况 try { stream2.FlushFinalBlock(); //转换异常出现位置2,使用try/catch 处理 } catch { return string.Empty; } result = stream.ToArray(); stream.Dispose(); return Encoding.UTF8.GetString(result); } catch (Exception ex) { return string.Empty; } }二、说明
本实例是对使用DES加密,然后将加密结果转换成Base64字符串的解密操作。
特别说明:
1.在批量解密过程中,如果有很多的异常产生,程序会运行非常慢。
2.所以异常处理尽可能自己过滤,比如:验证当前字符串是否是合法的Base64格式
3.再者经常出问题的是 stream2.FlushFinalBlock(); 方法,目前没有找到更好的避开当前异常的方案。
它抛出的异常:“不正确的数据。”
在 System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr) 在 System.Security.Cryptography.Utils._DecryptData(SafeKeyHandle hKey, Byte[] data, Int32 ib, Int32 cb, Byte[]& outputBuffer, Int32 outputOffset, PaddingMode PaddingMode, Boolean fDone) 在 System.Security.Cryptography.CryptoAPITransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount) 在 System.Security.Cryptography.CryptoStream.FlushFinalBlock() 在 System.Security.Cryptography.CryptoStream.Dispose(Boolean disposing) 在 System.IO.Stream.Close() 在 System.IO.Stream.Dispose() 在 Test1.Program.Decrypt(String decryptString, String decryptKey) 位置 E:\NewWork\原框架\MemberEncript\Test1\Program.cs:行号 75三、验证是否是Base64格式字符串
/// <summary> /// 是否是Base64字符串 /// </summary> /// <param name="eStr"></param> /// <returns></returns> public static bool IsBase64(string eStr) { if ((eStr.Length % 4) != 0) { return false; } if (!Regex.IsMatch(eStr, "^[A-Z0-9/+=]*$", RegexOptions.IgnoreCase)) { return false; } return true; }四、测试代码:
List<string> source = new List<string>(); for (int i = 0; i < 100; i++) { //可解密字符串 //source.Add("4fOnfsTx3lo="); //base64字符串(这是Md5的结果) source.Add("698D51A19D8A121CE581499D7B701668");//不进行try处理 4秒 //错误的base64字符串 //source.Add("11234"); //不进行base64验证,执行时间6秒,处理之后0秒 } int start = Environment.TickCount; foreach (var item in source) { string result = Decrypt(item, key); Console.WriteLine(result.Length); } int end = Environment.TickCount; Console.WriteLine("解密时间:{0}毫秒,约定于{1}秒", (end - start), (end - start) / 1000);显示结果:
如果有异常产生
如果没有异常产生
更多:
C#
Try/Catch性能测试
C#字符串连接和StringBuilder字符串拼接性能测试
相关文章推荐
- 类装入问题解密,第 2 部分: 基本的类装入异常
- 类装入问题解密,第 2 部分: 基本的类装入异常
- [转]C# DES 加密/解密类库,支持文件和中文/UNICODE字符,返回BASE64编码字符串
- [读书笔记]C# DES 加密/解密类库,支持文件和中文/UNICODE字符,返回BASE64编码字符串
- C# DES 加密/解密类库
- C#中的DES加解密方法
- 安全问题:C#做的一个加密/解密的类
- 用 Java 解密 C# 加密的数据(DES)
- 遭遇C# 运行数据库命令时connetion Timeout expired异常问题
- C#中使用DES和AES加密解密
- c# DES 加密解密
- Javascript和C#真正可以交互的DES加解密代码
- C# DES 加密/解密类库,支持文件和中文/UNICODE字符,返回BASE64编码字符串
- C# DES 加密/解密,支持文件和中文/UNICODE字符,返回BASE64编码字符串
- C#使用DES加解密数据
- 类装入问题解密(二)-基本的类装入异常
- c# des 加密解密
- C#中使用DES和AES加密解密
- 黄聪:C# DES 加密/解密类库,支持文件和中文/UNICODE字符,返回BASE64编码字符串
- DES的两个简单的加密、解密函数(C#中使用)