有什么办法可以实现以下操作:
把字符串str1加密或者压缩或者其他什么的,得到一个字符串str2,
要求:
1,str1为不定长度字符串,但是长度范围确定且不会很长,比如15到30个字符
2,str2长度要求确定,比如20位,但是不能太长
3,str2可以反向解出str1
把字符串str1加密或者压缩或者其他什么的,得到一个字符串str2,
要求:
1,str1为不定长度字符串,但是长度范围确定且不会很长,比如15到30个字符
2,str2长度要求确定,比如20位,但是不能太长
3,str2可以反向解出str1
2.using System.Collections.Generic;
3.using System.Linq;
4.using System.Text;
5.using System.IO;
6.using System.Security.Cryptography;
7.
8.namespace BLL
9.{
10. public class md5Manger
11. {
12. #region MD5加密
13. /// <summary>
14. /// MD5加密
15. /// </summary>
16. /// <param name="strSource">需要加密的字符串</param>
17. /// <returns>MD5加密后的字符串</returns>
18. public static string Md5Encrypt(string strSource)
19. {
20. //把字符串放到byte数组中
21. byte[] bytIn = System.Text.Encoding.Default.GetBytes(strSource);
22. //建立加密对象的密钥和偏移量
23. byte[] iv = { 102, 16, 93, 156, 78, 4, 218, 32 };//定义偏移量
24. byte[] key = { 55, 103, 246, 79, 36, 99, 167, 3 };//定义密钥
25. //实例DES加密类
26. DESCryptoServiceProvider mobjCryptoService = new DESCryptoServiceProvider();
27. mobjCryptoService.Key = iv;
28. mobjCryptoService.IV = key;
29. ICryptoTransform encrypto = mobjCryptoService.CreateEncryptor();
30. //实例MemoryStream流加密密文件
31. System.IO.MemoryStream ms = new System.IO.MemoryStream();
32. CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write);
33. cs.Write(bytIn, 0, bytIn.Length);
34. cs.FlushFinalBlock();
35. return System.Convert.ToBase64String(ms.ToArray());
36. }
37. #endregion
38.
39. #region MD5解密
40. /// <summary>
41. /// MD5解密
42. /// </summary>
43. /// <param name="Source">需要解密的字符串</param>
44. /// <returns>MD5解密后的字符串</returns>
45. public static string Md5Decrypt(string Source)
46. {
47. //将解密字符串转换成字节数组
48. byte[] bytIn = System.Convert.FromBase64String(Source);
49. //给出解密的密钥和偏移量,密钥和偏移量必须与加密时的密钥和偏移量相同
50. byte[] iv = { 102, 16, 93, 156, 78, 4, 218, 32 };//定义偏移量
51. byte[] key = { 55, 103, 246, 79, 36, 99, 167, 3 };//定义密钥
52. DESCryptoServiceProvider mobjCryptoService = new DESCryptoServiceProvider();
53. mobjCryptoService.Key = iv;
54. mobjCryptoService.IV = key;
55. //实例流进行解密
56. System.IO.MemoryStream ms = new System.IO.MemoryStream(bytIn, 0, bytIn.Length);
57. ICryptoTransform encrypto = mobjCryptoService.CreateDecryptor();
58. CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read);
59. StreamReader strd = new StreamReader(cs, Encoding.Default);
60. return strd.ReadToEnd();
61. }
62. #endregion
63. }
64.
65.}
http://blog.csdn.net/asxinyu_usst/archive/2009/12/02/4924207.aspx还可以更简单的 不用流的 自己搜搜看
str2固定范围放宽到64把
可以解密的(对称加密)1楼的 那个不叫MD5啊
加密常用的算法为AES和DES,在System.Net.Security.Cryptography名字空间下可以找到
如果想用定长的输出,那么我首先告诉你,这样的加密函数不是单射的函数,也就是不可能做到明文和密文的一对一,比如MD5算法就是这样做的。不是单射函数那么也就没有可逆的方法。
如果按你说的输入长度有范围的话,那么这样的可逆算法还是可以考虑的,比如输入20-30个字符,不够30个字符用0补齐30个,做到定长输入,然后用DES或AES加密,输出的是30个。
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Security.Cryptography;namespace myEncrypt
{
public class EncryptAndDencrypt
{
#region "定义加密字串变量"
private SymmetricAlgorithm mCSP; //声明对称算法变量
private const string CIV = "Mi9l/+7Zujhy12se6Yjy111A"; //初始化向量
private const string CKEY = "jkHuIy9D/9i="; //密钥(常量)
#endregion
/// <summary>
/// 实例化
/// </summary>
public EncryptAndDencrypt()
{
mCSP = new DESCryptoServiceProvider(); //定义访问数据加密标准 (DES) 算法的加密服务提供程序 (CSP)版本的包装对象,此类是SymmetricAlgorithm的派生类
}
/// <summary>
/// 加密字符串
/// </summary>
/// <param name="Value">需加密的字符串</param>
/// <returns></returns>
public string EncryptString(string Value)
{
ICryptoTransform ct; //定义基本的加密转换运算
MemoryStream ms; //定义内存流
CryptoStream cs; //定义将内存流链接到加密转换的流
byte[] byt;
//CreateEncryptor创建(对称数据)加密对象
ct = mCSP.CreateEncryptor(Convert.FromBase64String(CKEY), Convert.FromBase64String(CIV)); //用指定的密钥和初始化向量创建对称数据加密标准
byt = Encoding.UTF8.GetBytes(Value); //将Value字符转换为UTF-8编码的字节序列
ms = new MemoryStream(); //创建内存流
cs = new CryptoStream(ms, ct, CryptoStreamMode.Write); //将内存流链接到加密转换的流
cs.Write(byt, 0, byt.Length); //写入内存流
cs.FlushFinalBlock(); //将缓冲区中的数据写入内存流,并清除缓冲区
cs.Close(); //释放内存流
return Convert.ToBase64String(ms.ToArray()); //将内存流转写入字节数组并转换为string字符
}
/// <summary>
/// 解密字符串
/// </summary>
/// <param name="Value">要解密的字符串</param>
/// <returns>string</returns>
public string DecryptString(string Value)
{
ICryptoTransform ct; //定义基本的加密转换运算
MemoryStream ms; //定义内存流
CryptoStream cs; //定义将数据流链接到加密转换的流
byte[] byt;
ct = mCSP.CreateDecryptor(Convert.FromBase64String(CKEY), Convert.FromBase64String(CIV)); //用指定的密钥和初始化向量创建对称数据解密标准
byt = Convert.FromBase64String(Value); //将Value(Base 64)字符转换成字节数组
ms = new MemoryStream();
cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
cs.Write(byt, 0, byt.Length);
cs.FlushFinalBlock();
cs.Close();
return Encoding.UTF8.GetString(ms.ToArray()); //将字节数组中的所有字符解码为一个字符串
}
}
}
AES:http://hi.baidu.com/aidfan/blog/item/55d3438135c421dcbd3e1e5b.html