一、C#DES解密操作定义

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字符串拼接性能测试

C# DES解密异常问题相关推荐

  1. Linux下运行java DES解密失败,报javax.crypto.BadPaddingException:Given final block not properly padded

    参考:http://blog.csdn.net/rj042/article/details/8196125 单点登录:https://github.com/ebnew/ki4so redis客户端操作 ...

  2. python des解密_python实现DES加密解密方法实例详解

    本文实例讲述了python实现DES加密解密方法.分享给大家供大家参考.具体分析如下: 实现功能:加密中文等字符串 密钥与明文可以不等长 这里只贴代码,加密过程可以自己百度,此处python代码没有优 ...

  3. des解密不完整,前面几位是乱码的解决办法

    在工作中遇到的Des解密问题,第三方发来的数据需要我们进行des解密,但是解密的结果前几位始终是乱码.废了半天劲,终于找到了问题所在. 下面先介绍一下des,了解des的同学可以直接看下面的解决办法. ...

  4. 对称加密-DES解密

    使用 ctrl + alt + m 快捷键抽取代码 package com.leon.desaes;import com.sun.org.apache.xml.internal.security.ut ...

  5. 微信小程序 php解密,微信小程序des加密、PHP des解密

    最近在做对小程序传输数据进行加密,加密方法有很多,使用的是des对称加密 采用的是CBC模式, 需要传入内容,密钥,初始化向量3个参数 var server = require('../../util ...

  6. des加密+base64编码,base64解码+des解密

    des加密+base64编码,base64解码+des解密 des简单介绍 base64简单介绍 运行效果图 TestActivity.java DataEncryptionUtil.java des ...

  7. 证明:DES解密算法是DES加密算法的逆

    证明: 由于DES算法是在Feistel网络结构的输入和输出阶段分别初始置换IP和初始逆置换IP-1而构成的,其余DES和Feistel相同,IP和IP–1互逆.所以只需证明Feistel解密算法和加 ...

  8. iOS 当使用DES解密遇到和解密不一致或者为空的时候问题

    当使用DES解密遇到和加密不一致或者为空的时候,但是又没写错算法 NSString *plaintext = nil; NSData *cipherdata = [GTMBase64decodeStr ...

  9. java des解密乱码_des解密不完整,前面几位是乱码的解决办法

    在工作中遇到的Des解密问题,第三方发来的数据需要我们进行des解密,但是解密的结果前几位始终是乱码.废了半天劲,终于找到了问题所在. 下面先介绍一下des,了解des的同学可以直接看下面的解决办法. ...

最新文章

  1. 与HTTP关系密切的协议:IP、TCP、DNS
  2. 最大权值闭合子图的证明详解
  3. rust腐蚀 木制窗户怎么修_冬天装修后怎么去除甲醛?紧闭门窗和准备一盆水,轻松教你解决!...
  4. C++ : 返回两个字符串的最长公共字符串
  5. [Android学习系列14]聊天通信的实现
  6. Sping boot系列--redis之2 -- RedisKeyValueTemplate处理Model对象
  7. Android Studio中获取SHA1或MD5的方法
  8. 【NLP_Stanford课堂】语言模型1
  9. 域名实名认证多长时间_域名如何选择有利于网站优化?
  10. 【BZOJ 2301】[HAOI2011]Problem b
  11. sql复制表结构和数据_SQL复制表
  12. java 8下载_java8下载-java8 64位官方版下载最新免费版-乡巴佬
  13. Linux下Linpack测试CPU性能的相关参数配置以及执行命令
  14. 老师对计算机课的评语,信息技术课堂教学评价与反思
  15. range在python中什么意思_python中range什么意思?
  16. Tektronix TBS1102B 示波器
  17. UI5:创建.yaml文件报错:无法加载文件 C:\Users\86178\AppData\Roaming\npm\ui5.ps1
  18. 年度规划复盘及一些收获
  19. 利用百度AI接口实现车牌识别功能(一)
  20. java 与 c gzip_zlib和gzip生成不同的数据

热门文章

  1. Linux内核2:中断代码分析
  2. k8s 1.25学习8 - 使用Ratel工具部署应用
  3. 21世纪七大数学难题
  4. Python3脚本抢票
  5. 使用Vue+Bootstrap开发在线音乐网站
  6. 经验分享:半桥电路的工作原理及注意问题(转载)
  7. HDU 1847 ——Good Luck in CET-4 Everybody!
  8. 回望过去,感觉现在的自己十分功利
  9. Eclipse启动时闪退问题解决方案
  10. ubuntu中共享文件夹看不到