关于遇到的 C# DES 解密出现 "CryptographicException:不正确的数据"
2012-05-09 10:24
141 查看
tomcat中的加密程序需要换到iis中,用起了 C#中的 DESCryptoServiceProvider,上网找了些相关流程写了个类,感觉比java的程序精简。
但测试中发现异常,同一次测试中,加密,解密都正常。但把加密的base64字符串,再另外测试就出现“不正确的数据”的提示。
然后再上网对比了很多,没看到什么不对的地方。程序如下:
后来看了一下msdn关于 DESCryptoServiceProvider 的 成员,看到了一个IV的属性,里面有这一段描述:
若要解密使用其中一个 SymmetricAlgorithm 类加密的数据,必须将 Key 属性和 IV 属性设置为用于加密的相同值。
意思就是另外需要再设置一个IV,这个IV跟Key的长度要一致,默认是 8 个字节。
测试终于成功通过。
但测试中发现异常,同一次测试中,加密,解密都正常。但把加密的base64字符串,再另外测试就出现“不正确的数据”的提示。
然后再上网对比了很多,没看到什么不对的地方。程序如下:
using System; using System.Security.Cryptography; using System.Text; namespace Cproject.capp { public static class Crypt { private static DESCryptoServiceProvider crypt = new DESCryptoServiceProvider(); private static bool bInit = false; public static void init() { if (bInit == false) { bInit = true; //crypt.IV = Encoding.UTF8.GetBytes("87654321"); //这里需要添加一行 crypt.Key = Encoding.UTF8.GetBytes("12345678"); crypt.Mode = CipherMode.CBC; crypt.Padding = PaddingMode.PKCS7; } } public static String encrypt(String str) { init(); //用UTF-8编码,转为byte[] byte[] bysData = Encoding.UTF8.GetBytes(str); //因為PaddingMode.None的關係, byte[]的長度要是8的倍數 //byte[] bysFixSizeData = new byte[(int)Math.Ceiling(bysData.Length / 8.0) * 8]; //將資料複製到長度為8的倍數的byte[] //Array.Copy(bysData, bysFixSizeData, bysData.Length); //进行加密 byte[] bysEncrypted = crypt.CreateEncryptor().TransformFinalBlock(bysData, 0, bysData.Length); //將byte[]轉為Base64的字串 return Convert.ToBase64String(bysEncrypted); } public static String decrypt(String str) { init(); byte[] bysData = Convert.FromBase64String(str); //进行解密 byte[] bysDecrypted = crypt.CreateDecryptor().TransformFinalBlock(bysData, 0, bysData.Length); return Encoding.UTF8.GetString(bysDecrypted); } } }
后来看了一下msdn关于 DESCryptoServiceProvider 的 成员,看到了一个IV的属性,里面有这一段描述:
若要解密使用其中一个 SymmetricAlgorithm 类加密的数据,必须将 Key 属性和 IV 属性设置为用于加密的相同值。
意思就是另外需要再设置一个IV,这个IV跟Key的长度要一致,默认是 8 个字节。
测试终于成功通过。
相关文章推荐
- 加密解密时遇到的"不正确的数据"以及"要解密的数据长度无效"问题解决方案
- Discuz! 安装插件和风格出现错误提示"数据类型错误,请返回。 php xml 正确的解析方式
- 只有谷歌浏览器出现:"服务器已断开连接,且未发送任何数据。"
- 升级sp3后出现"一个问题阻止windows正确检测此机器许可证"解决方案
- <C#>关于string.Empty & "" & null 的讨论
- 解决解密时出现"要解密的数据的长度无效" 或 "填充无效无法被移除" 的错误
- 关于VC++6.0添加文件就出现“microsoft developer studio已停止工作"的解决办法
- FCKeditor关于图片上传出现错误“ 提示没有权限 Type=Image” 以及出现"this connector is disabled Please check the"editor/filemanager/connectors/aspx/conf
- 用imp命令导入数据表时出现了"只有DBA 才能导入由其它DBA 导出的文件"错误
- word2003保存时,出现"语音识别的数据丢失"的问题
- visual studio 2008安装出现"无法打开数据文件问题"
- Android中使用AlertDialog,使用函数setButton()出现的关于“new OnClickListener"错误
- 关于var body=document.getElementsByTagName("body")[0];出现的问题
- 关于LinerrLayout问题,总是出现"LinearLayout" must be followed by the ' = ' character.
- 用 Java 解密 C# 加密的数据(DES)
- 关于使用xcode7进行真机测试出现 "could not find developer disk image"
- 关于String a=new String("a")创建几个对象问题的正确答案
- 关于phpMyAdmin出现"#2000 无法登录 MySQL 服务器"的问题
- 加密解密时遇到的"不正确的数据"以及"要解密的数据长度无效"问题解决方案
- 关于安装.NET Framework 2.0时偶然碰到的问题(提示"Error 205015. 安装程序集..../System.EnterpriseServices.dll失败,原因是出现了系统错误:拒绝访问。")