黑马程序员技术交流社区
标题:
DES加密,可以使用任意长度的密钥
[打印本页]
作者:
♂张耕明
时间:
2012-10-27 20:54
标题:
DES加密,可以使用任意长度的密钥
本帖最后由 ♂张耕明 于 2012-10-27 20:56 编辑
DES:数据加密标准(DES,Data Encryption Standard)是一种使用密钥加密的块密码,它基于使用56位密钥的对称算法。DES现在已经不被视为一种安全的加密算法,主要因为它使用的56位密钥过短。为了提供实用所需的安全性,可以使用DES的派生算法3DES来进行加密,在2001年,DES作为一个标准已经被高级加密标准(AES)所取代。
/// <summary>
/// 使用DES加密字符串
/// </summary>
/// <param name="source">要加密的字符串</param>
/// <param name="key">加密密匙</param>
/// <returns>加密后的字符串</returns>
private static string EncryptByDES(string source, string key)
{
byte[] input = Encoding.Default.GetBytes(key);
byte[] temp = new byte[16] { 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200 };
if (input.Length > 16)
{
Console.WriteLine("只能输入8个汉字或者16个字符!");
return null;
}
input.CopyTo(temp, 0);
DESCryptoServiceProvider cryptoService = new DESCryptoServiceProvider();//实例化DES加密服务类
cryptoService.Mode = CipherMode.CBC;//使用的加密模式
cryptoService.IV = temp.Take(8).ToArray();//定义偏移量
cryptoService.Key = temp.Skip(8).ToArray();//定义密钥
ICryptoTransform encryptor = cryptoService.CreateEncryptor();//使用加密服务对象创建一个对流执行加密转换的加密器
byte[] byteArr = Encoding.Default.GetBytes(source);//把源字符串放到字节数组中
return Convert.ToBase64String(encryptor.TransformFinalBlock(byteArr, 0, byteArr.Length));//使用加密器加密数据
}
/// <summary>
/// 使用DES解密字符串
/// </summary>
/// <param name="source">要解密的字符串</param>
/// <param name="key">解密密匙</param>
/// <returns>解密后的字符串</returns>
private static string DecryptByDES(string source, string key)
{
byte[] input = Encoding.Default.GetBytes(key);
byte[] temp = new byte[16] { 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200 };
if (input.Length > 16)
{
Console.WriteLine("错误的密匙");
return null;
}
input.CopyTo(temp, 0);
DESCryptoServiceProvider cryptoService = new DESCryptoServiceProvider();
cryptoService.Mode = CipherMode.CBC;
cryptoService.IV = temp.Take(8).ToArray();
cryptoService.Key = temp.Skip(8).ToArray();
byte[] byteArr = Convert.FromBase64String(source);//把源字符串放到字节数组中
ICryptoTransform decryptor = cryptoService.CreateDecryptor();//使用加密服务对象创建一个对流执行解密转换的解密器
return Encoding.Default.GetString(decryptor.TransformFinalBlock(byteArr, 0, byteArr.Length));//使用解密器解密数据,密匙错误会抛异常
}
3DES:(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。
/// <summary>
/// 使用DES加密字符串
/// </summary>
/// <param name="source">要加密的字符串</param>
/// <param name="key">加密密匙</param>
/// <returns>加密后的字符串</returns>
public static string EncryptBy3DES(string source, string key)
{
Regex reg = new Regex(@"[\w\W]{0,8}");
MatchCollection matchs = reg.Matches(key);
string result = source;
foreach (Match match in matchs)
{
result = EncryptByDES(result, match.ToString());
}
return result;
}
/// <summary>
/// 使用DES解密字符串
/// </summary>
/// <param name="source">要解密的字符串</param>
/// <param name="key">解密密匙</param>
/// <returns>解密后的字符串</returns>
public static string DecryptBy3DES(string source, string key)
{
Regex reg = new Regex(@"[\w\W]{0,8}");
MatchCollection matchs = reg.Matches(key);
string result = source;
for (int i = matchs.Count - 1; i >= 0; i--)
{
result = DecryptByDES(result, matchs
.ToString());
}
return result;
}
作者:
许庭洲
时间:
2012-10-28 08:01
1. AES密码是一个非对称密码体制,它的解密要比加密复杂和费时。
2. AES解密优化算法没有增加存储空间的基础上,以列变化为基础进行处理,程序比原始的要小,
3. 而且节约了时间。解密优化方法速度最快,效率最高,但要增加系统的存储空间,因此它的程序也是最大的一个.
作者:
郑鹏
时间:
2012-10-28 15:55
本帖最后由 郑鹏 于 2012-10-28 15:57 编辑
我这里有两个加密的类文件:
这个比较通用:
namespace 加密解密
{
class Program
{
static void Main(string[] args)
{
string s = "hello";
string miwen = DES.DESEncrypt(s);
Console.WriteLine(miwen);
string jiemi = DES.DESDecrypt(miwen);
Console.WriteLine(jiemi);
Console.ReadKey();
}
}
public class DES
{
/// <summary>
/// 获取密钥
/// </summary>
private static string Key
{
get { return @"P@+#wG+Z"; }
}
/// <summary>
/// 获取向量
/// </summary>
private static string IV
{
get { return @"L%n67}G\Mk@k%:~Y"; }
}
/// <summary>
/// DES加密
/// </summary>
/// <param name="plainStr">明文字符串</param>
/// <returns>密文</returns>
public static string DESEncrypt(string plainStr)
{
byte[] bKey = Encoding.UTF8.GetBytes(Key);
byte[] bIV = Encoding.UTF8.GetBytes(IV);
byte[] byteArray = Encoding.UTF8.GetBytes(plainStr);
string encrypt = null;
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
try
{
using (MemoryStream mStream = new MemoryStream())
{
using (CryptoStream cStream = new CryptoStream(mStream, des.CreateEncryptor(bKey, bIV), CryptoStreamMode.Write))
{
cStream.Write(byteArray, 0, byteArray.Length);
cStream.FlushFinalBlock();
encrypt = Convert.ToBase64String(mStream.ToArray());
}
}
}
catch { }
des.Clear();
return encrypt;
}
/// <summary>
/// DES解密
/// </summary>
/// <param name="encryptStr">密文字符串</param>
/// <returns>明文</returns>
public static string DESDecrypt(string encryptStr)
{
byte[] bKey = Encoding.UTF8.GetBytes(Key);
byte[] bIV = Encoding.UTF8.GetBytes(IV);
byte[] byteArray = Convert.FromBase64String(encryptStr);
string decrypt = null;
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
try
{
using (MemoryStream mStream = new MemoryStream())
{
using (CryptoStream cStream = new CryptoStream(mStream, des.CreateDecryptor(bKey, bIV), CryptoStreamMode.Write))
{
cStream.Write(byteArray, 0, byteArray.Length);
cStream.FlushFinalBlock();
decrypt = Encoding.UTF8.GetString(mStream.ToArray());
}
}
}
catch { }
des.Clear();
return decrypt;
}
}
}
这个比较简单(新手推荐,但无解密):
#region MD5加密字符串
/// <summary>
/// MD5加密字符串
/// </summary>
/// <param name="str">待加密字符串</param>
/// <param name="code">16/32</param>
/// <returns></returns>
public static string MD5(string str, int code)
{
if (code == 16) //16位MD5加密(取32位加密的9~25字符)
{
return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToUpper().Substring(8, 16);
}
else//32位加密
{
return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5");
}
}
#endregion
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2