首页
社区
课程
招聘
[讨论]vb做的某算法,并做了个逆向,求算法优化
发表于: 2009-4-27 20:22 3918

[讨论]vb做的某算法,并做了个逆向,求算法优化

2009-4-27 20:22
3918
跟踪某程序的加密算法,并用vb成功写了个算法加密器,并试图写个解密器,无奈写的太暴力,根本就没有办法跑出来。放上源程序,请大大们谈论分析下,看是否有可能解密算法。

加密算法基本思路如下:
1.获取基本串。用四位随机hex数字生成基本串。如“1111”,通过按钮4得到“11118888eeee111111EE11EE77117700”。
2.第三排文本框输入字符,右边得到加密串。如“wwww”得到“1D1D6D32C1C61EE9597C554AC4EA7213”。此算法过程为获取字符的ascii码转化为hex,并加0补充至32位,与基本串异或,然后分成8位一组与固定的八位十六进制代码相乘,结果取低八位字节,通过一些比较和异或,软后再与基本串异或,与固定双字相乘取低双字,比较异或,这样一共做六次操作。

附件是我写的加密算法和解密算法。写的比较烂。而且根本没有办法跑出来。寻求是否有更优化的解密算法!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 215
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
用c重写了一下代码,vb写的太乱。只写了加密部分的。解密的慢慢完善。
#include <stdio.h>
    long b[4]={0,0,0,0},t[4];                                   //初始化数组b,临时数组t
    long ab[4]={0x92e24749,0x49476b8b,0xb849b647,0x00d64fd1};  //加密串的异或因子 4947e292 8b6b4749 47B649B8 d14Fd600
    long ac[4]={0x25f1cdb,0x4be39b6,0x12f8e6d8,0x2f8e6d80};   //乘法因子
        unsigned char a[16],*c1,*c2,sc[4];                              // 输入密码,加密前数据
        int i,j;
       
        int as[16]={0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15};
        int am[4]={4,9,4,7};
        int mima[32];
    unsigned char cc[32];
void mimacuan()
{
        for (i=0;i<32;i++) mima[i]=0;
        for (i=0;i<4;i++)  mima[i]=am[i];
        for (i=0;i<4;i++)  mima[i+4]=as[am[3-i]];
    for (i=0;i<4;i++)  mima[i+8]=as[15-mima[4+i]];       
        mima[12]=mima[2];
        mima[13]=mima[3];
        mima[14]=mima[0];
        mima[15]=mima[1];       
        mima[16]=mima[2];
        mima[17]=mima[3];
        mima[18]=mima[11];
        mima[19]=mima[10];       
        mima[20]=mima[0];
        mima[21]=mima[1];
        mima[22]=mima[9];
        mima[23]=mima[8];       
                mima[24]=as[15-mima[2]];
        mima[25]=as[15-mima[3]];
        for (i=0;i<32;i++)  cc[i]=mima[i];
        mima[26]=cc[0]|cc[2];
        mima[27]=cc[1]|cc[3];       
        mima[28]=as[15-mima[0]];
        mima[29]=as[15-mima[1]];
        mima[30]=0;
        mima[31]=0;       
        for (i=0;i<16;i++)  cc[i]=mima[2*i]*0x10+mima[2*i+1];       
     memcpy(ab, cc, 16);   
     printf("密码串:");   
     for (i=0;i<4;i++)  printf ("%08lx  ",ab[i]);       
}

main()
{   
        printf("输入四位十六进制数字生成密码串: ");
        scanf("%s",sc);
        if(strlen(sc)==4 )
        {
                for (i=0;i<4;i++)
                {
                        if (sc[i]<='9'&&sc[i]>='0')  am[i]=sc[i]-0x30;
                        else
                        {  if (sc[i]<='f'&&sc[i]>='a')  am[i]=sc[i]-'a'+10;
                          else if (sc[i]<='F'&&sc[i]>='A')  am[i]=sc[i]-'A'+10;
                              else  {
                                              printf("输入不正确,用默认4947\n");
                                              break;
                                    }
                        }
                }
        }else  printf("输入不正确,用默认4947\n");
        mimacuan();       
        printf("\nPut your password: ");
        getchar();
        gets(a);
        memcpy(b, a, strlen(a));                                 //密码进数组b                    
        for (i=0;i<4;i++) printf("%08lx  ",*(b+i));
        printf("\n");
       
  for(j=0;j<6;j++)                                         //做5次加密算法
  {
                for (i=0;i<4;i++) b[i]=b[i] ^ ab[i];                   //与异或因子做异或
        for (i=0;i<4;i++) b[i]=b[i] * ac[i];                   //与乘法因子做乘法,四位乘四位,积取低四位
        c1=b;
        c2=b+3;       
        if (*c1==0x01)  b[0]=b[0] ^ 0x2aaaaaaa;         //比较b[0],b[3]的低位,相等做异或
        if (*c2==0x00)  b[3]=b[3] ^ 0x2aaaaaaa;      
        t[0]=b[0] ^ b[1] ^ b[3];                              //b的四个元素做异或
        t[1]=b[0] ^ b[2] ^ b[3];
        b[2]=b[0];
        b[3]=b[1];
        b[0]=t[0];
        b[1]=t[1];
  }
        c1=b;
        printf("\n密文:");
        for (i=0;i<16;i++) printf("%02x ",*(c1+i));             //打印密文
        printf("\n");
                getch();
}
2009-7-20 11:42
0
游客
登录 | 注册 方可回帖
返回
//