deerchao的blog

Be and aware who you are.

用下面这种方式解密的数据,能不能得到它的加密方式?

        static string Password = "XXXXX";

        
public static string Decrypt(string source)
        {
            
string s;

            
if (String.IsNullOrEmpty(source))
                
throw new ArgumentException("No data given");
            
byte[] inputData = Convert.FromBase64String(source);
            
if (inputData.Length < 8)
                
throw new ArgumentException("Invalid input data");

            
byte[] salt = new byte[8];
            
for (int i = 0; i < salt.Length; i++)
            {
                salt[i] 
= inputData[i];
            }

            Rfc2898DeriveBytes rfc2898DeriveBytes 
= new Rfc2898DeriveBytes(Password, salt);
            Rijndael rijndael 
= Rijndael.Create();
            rijndael.Padding 
= PaddingMode.ISO10126;
            rijndael.IV 
= rfc2898DeriveBytes.GetBytes(rijndael.BlockSize / 8);
            rijndael.Key 
= rfc2898DeriveBytes.GetBytes(rijndael.KeySize / 8);
            
using (MemoryStream memoryStream = new MemoryStream())
            
using (
                CryptoStream cryptoStream 
=
                    
new CryptoStream(memoryStream, rijndael.CreateDecryptor(), CryptoStreamMode.Write))
            {
                cryptoStream.Write(inputData, 
8, inputData.Length - 8);
                cryptoStream.Close();
                
byte[] bytes = memoryStream.ToArray();
                s 
= Encoding.Unicode.GetString(bytes);
            }
            
return s;
        }
对加密解密这块不熟,请有经验的朋友解答,谢谢。
如果需要,我有几个样例数据与加密后的结果。

posted on 2007-05-06 00:01 deerchao 阅读(298) 评论(6)  编辑 收藏 网摘

评论

#1楼  2007-05-06 10:51 Edwin Liu      

加密字串的前8个字节就是salt,后面的就是加密数据,使用的是对称加密,由Salt与Password就能得到rfc2898DeriveBytes,后面的就可以解密了。

一般来说,对于对称加密,只要得到加密的源码,一定就能解密   回复  引用  查看    

#2楼 [楼主] 2007-05-06 14:42 deerchao      

@Edwin Liu
谢谢,已经搞定。

public static string Encrypt(string param)
{
byte[] salt = new byte[] { (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g', (byte)'h' };
byte[] bytes = Encoding.Unicode.GetBytes(param);

Rfc2898DeriveBytes deriveBytes = new Rfc2898DeriveBytes(Password, salt);
Rijndael rijndael = Rijndael.Create();
byte[] iv = deriveBytes.GetBytes(rijndael.BlockSize / 8);
byte[] key = deriveBytes.GetBytes(rijndael.KeySize / 8);
rijndael.Padding = PaddingMode.ISO10126;
rijndael.IV = iv;
rijndael.Key = key;

using (MemoryStream memStream = new MemoryStream())
using (CryptoStream cryptoStream = new CryptoStream(memStream, rijndael.CreateEncryptor(), CryptoStreamMode.Write))
{
cryptoStream.Write(bytes, 0, bytes.Length);
cryptoStream.Close();
byte[] outputData = memStream.ToArray();
byte[] result = new byte[outputData.Length + 8];

Array.Copy(salt,result,8);
Array.Copy(outputData, 0, result, 8, outputData.Length);
return Convert.ToBase64String(result);
}
}
  回复  引用  查看    

#3楼  2007-05-07 10:29 Edwin Liu      

salt一般都不是常量,否则也不称之为Salt了.可由.Net的加密类获取随机码.

另一种更安全的做法是:文件=Salt长度(8字节)+Salt+数据,而[Salt长度]指示了数据的起始位置,Salt由数据的簦名得到(解密时可验证该簦名,以决断数据是否被更改过),[Salt长度]可以是明文也可以是内定的一种对称加密方式加密的数据.

如果要求不是很严格,可以只对[Salt长度]加密而不对[数据]加密,这样速度要快很多,特别是处理大数据的情况.   回复  引用  查看    

#4楼 [楼主] 2007-05-07 14:58 deerchao      

@Edwin Liu
谢谢,我现在用System.Random生成salt.
  回复  引用  查看    

#5楼  2007-05-11 14:19 jlzhou [未注册用户]

这一段和CS2007注册机有关吗?   回复  引用    

#6楼 [楼主] 2007-05-11 14:49 deerchao      

很有关:)   回复  引用  查看    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-05-16 03:10 编辑过
Google站内搜索


China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!

相关文章:

相关链接:


 
<2007年5月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

导航

统计

公告

给网络添加价值,就是让自己增加价值.

本博客所有内容,均为原创或对互联网已有资源的再加工,希望对你有用.在声明原作者的前提下,你可以任意使用,但本人对其正确性,使用的后果等不做任何担保,也不负任何责任.

正则表达式30分钟入门教程 v2.21 2007-8-3

I Want Spec#!

与我联系

搜索

 

常用链接

留言簿(66)

我管理的小组

我的标签

随笔档案(127)

文章分类(9)

文章档案(9)

新闻档案(9)

Links

积分与排名

最新评论

评论排行榜