前几天发送的是在.Net2003下平台下封装的类,今天拿到2005下竟有错误发生。提示如:
"要解密的数据的长度无效。的错误信息 ", 经过跟踪调试发现,在加密返回字符串前的字节长度与解密字符变成字节数组的长度却不相等,开始百思不得其解,为什么在2003下面可以用却在2005下面出现这样的情况,于是继续查找关于编码方面的关相资料。问题原来确实出在编码方式上,原来2005下加密返回的是Base64编码(即简单讲是所谓3字节变4节的编码方式,即3*8变成4*8),我在加密返回字符串时用 Convert.ToBase64String(output);解密字符串前用 byte[] input = Convert.FromBase64String(password);问题得到完美解决(附代码如下:)
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Security.Cryptography;
using
System.IO;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
namespace
PV.BLL.Security
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 对称加密接口
/// </summary>
interface IEncrypt
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 加密
/// </summary>
/// <param name="password">需加密的字符串</param>
/// <returns>加密后的字符串</returns>
string Encrypt(string password);
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 解密
/// </summary>
/// <param name="password">需解密的字符串</param>
/// <returns>解密后的字符串</returns>
string Decrypt(string password);
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 字节数组加密
/// </summary>
/// <param name="passowrd">字节数组</param>
/// <returns>字节数组</returns>
byte[] Encrypt(ref byte[] passowrd);
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 字节数组解密
/// </summary>
/// <param name="password">字节数组</param>
/// <returns>字节数组</returns>
byte[] Decrypt(ref byte[] password);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 枚举
/// </summary>
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public enum EncryptType ...{ Rijndael = 0, SHA1 = 1, DES = 2,};
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 对称加密类
/// </summary>
public class RijndaelEncrypt : IEncrypt
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
//加密常量
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
private byte[] Key = ...{ 23, 81, 10, 23, 19, 46, 64, 32, 92, 144, 164, 01, 189, 76, 32, 16, 198, 110, 23, 27, 22, 163, 11, 28, 133, 122, 108, 24, 78, 67, 89, 16};
//加密密钥
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
private byte[] IV = ...{198,110,23,27,22,163,11,28,133,122,108,24,78,67,89,16};
//加密类成员
private RijndaelManaged _rijndael;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public RijndaelEncrypt()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
_rijndael = new RijndaelManaged();
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
IEncrypt 字符串成员#region IEncrypt 字符串成员
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 字符串加密
/// </summary>
/// <param name="password">密码</param>
/// <returns>加密字符串</returns>
public string Encrypt(string password)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
byte[] input = UTF8Encoding.UTF8.GetBytes(password);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
byte[] output = this.Encrypt(ref input);
//return UnicodeEncoding.UTF8.GetString(output);
return Convert.ToBase64String(output);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 字符串解密
/// </summary>
/// <param name="password">需解密的字符串</param>
/// <returns>返回明文</returns>
public string Decrypt(string password)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
//byte[] input = UTF8Encoding.UTF8.GetBytes(password);
byte[] input = Convert.FromBase64String(password);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
byte[] output = this.Decrypt(ref input);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
return UnicodeEncoding.UTF8.GetString(output);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
#endregion
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
IEncrypt 字节成员#region IEncrypt 字节成员
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 字节数组加密
/// </summary>
/// <param name="passowrd">输入字节数组</param>
/// <returns>返回加密后的数组</returns>
public byte[] Encrypt(ref byte[] passowrd)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
MemoryStream memStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(memStream, _rijndael.CreateEncryptor(Key, IV), CryptoStreamMode.Write);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
try
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
cStream.Write(passowrd, 0, passowrd.Length);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
cStream.FlushFinalBlock();
return memStream.ToArray();
}
catch (Exception ex)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
throw new Exception("加密发生错误:" + ex.Message);
}
finally
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
cStream.Close();
memStream.Close();
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 字节数组解密
/// </summary>
/// <param name="password">输入已加密的字节数组</param>
/// <returns>返回解密后的数组</returns>
public byte[] Decrypt(ref byte[] password)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
MemoryStream memStream = new MemoryStream(password, 0, password.Length);
CryptoStream cStream = new CryptoStream(memStream, _rijndael.CreateDecryptor(Key, IV), CryptoStreamMode.Read);
StreamReader sr = new StreamReader(cStream);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
try
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
byte[] result = UnicodeEncoding.UTF8.GetBytes(sr.ReadToEnd());
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
return result;
}
catch (Exception ex)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
throw new Exception("解密发生错误:" + ex.Message);
}
finally
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
sr.Close();
cStream.Close();
memStream.Close();
}
}
#endregion
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//// <summary>
/// 对应加解密类 采用策略模式
/// </summary>
public class PVEncrypt : IEncrypt
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
private IEncrypt _encrypt;
private RijndaelEncrypt _rijndael;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public PVEncrypt()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
_rijndael = new RijndaelEncrypt();
_encrypt = (IEncrypt)_rijndael;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public PVEncrypt(EncryptType type)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
switch (type)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
case EncryptType.SHA1:
throw new Exception("还未实现SHA1加密算法");
case EncryptType.DES:
throw new Exception("还未实现DES加密算法");
case EncryptType.Rijndael:
default:
_rijndael = new RijndaelEncrypt();
_encrypt = (IEncrypt)_rijndael;
break;
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
IEncrypt 成员#region IEncrypt 成员
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public string Encrypt(string password)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
return _encrypt.Encrypt(password);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public string Decrypt(string password)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
return _encrypt.Decrypt(password);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public byte[] Encrypt(ref byte[] passowrd)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
return _encrypt.Encrypt(ref passowrd);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public byte[] Decrypt(ref byte[] password)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
return _encrypt.Decrypt(ref password);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
#endregion
}
}