飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4531|回复: 2

[C/C++] 按mov兄的建议,用C写成了个cm。贴上附件

[复制链接]

该用户从未签到

发表于 2009-6-10 19:21:26 | 显示全部楼层 |阅读模式
以前用vb写过,后来跟着老大学用c写,正好练练手,觉得代码简单的多了。这个加密的逻辑很简单,不过要是解密的话,就不是太容易了。因为在乘法加密的过程中,溢出的部分忽略了。有兴趣有时间的兄弟可以来一起讨论一下。

胡乱加了点点代码,写成个cm,高手就不要浪费时间了。


[hide]    long b[4]={0,0,0,0},t[4];                                   //初始化数组b,临时数组t
    long ab[4]={0x92e24749,0x49476b8b,0xb849b647,0x00d64fd1};   //加密串的异或因子(根据4位十六位字母计算)
    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(int a[4])                                                                                 //计算加密串
{
        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(a[4]);       
       
       
        printf("\nPut your password: ");
        //scanf("%s",a);
        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++)                                             //做6次加密算法
  {
    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");

}


[/hide]

[[i] 本帖最后由 sswater 于 2009-6-11 19:07 编辑 [/i]]

crackme.rar

40.96 KB, 下载次数: 6, 下载积分: 飘云币 -2 枚

PYG19周年生日快乐!
  • TA的每日心情
    开心
    2017-10-25 13:07
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2009-6-10 21:09:06 | 显示全部楼层
    /:001 可见 楼主有点底子啊
    SS兄  水平又进一步  恭喜恭喜

    [ 本帖最后由 MOV 于 2009-6-11 19:58 编辑 ]
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2017-4-20 22:12
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2009-6-11 10:34:18 | 显示全部楼层
    /:001
    如果加上一个矩阵,然后通过矩阵换算进行加密,效果应该更好
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表