首页
社区
课程
招聘
我在国外密码学课上的project
发表于: 2005-11-27 05:27 6598

我在国外密码学课上的project

2005-11-27 05:27
6598
#include <stdio.h>

void encode(short* v, short* k)  {              
unsigned short n=32, y=v[0],z=v[1], sum=0,
delta=0x9e37; /* a key schedule constant */
while (n-->0)
{                     
          sum += delta ;
    y += ((z<<2)+k[0]) ^ (z+sum) ^ ((z>>3)+k[1]) ;
    z += ((y<<2)+k[0]) ^ (y+sum) ^ ((y>>3)+k[1]) ;
}
v[0]=y ; v[1]=z ; }

void decode(short* v,short* k)  {
unsigned short n=32, sum, y=v[0], z=v[1],
delta=0x9e37 ;
sum=delta<<5;
while (n-->0)
{
    z-= ((y<<2)+k[0]) ^ (y+sum) ^ ((y>>3)+k[1]) ;
    y-= ((z<<2)+k[0]) ^ (z+sum) ^ ((z>>3)+k[1]) ;
           sum-=delta ;  
}
v[0]=y ; v[1]=z ;  }

int main(int argc, char *argv[])
{
    unsigned short k1[2],k2[2];
    unsigned short p[2],c[2];

    k1[0]=0x00XX;// X是要 求的
    k1[1]=0xXXXX;// X是要 求的

    k2[0]=0x00XX;// X是要 求的
    k2[1]=0xXXXX;// X是要 求的

    p[0]=0x0001;
    p[1]=0x0002;

    printf("Plaintext (%4x,%4x)",p[0],p[1]);

/* double encrypt */

    encode(p,k1);
    encode(p,k2);
   
    printf("  Encoded= ");
    printf("(%4x,%4x)",p[0],p[1]);

/* double decrypt */

    decode(p,k2);
    decode(p,k1);

    printf("  Decoded= ");
    printf("(%4x,%4x)\n",p[0],p[1]);

   
    p[0]=0x1234;
    p[1]=0x5678;

    printf("Plaintext (%4x,%4x)",p[0],p[1]);

    encode(p,k1);
    encode(p,k2);

    printf("  Encoded= ");
    printf("(%4x,%4x)",p[0],p[1]);

    decode(p,k2);
    decode(p,k1);

    printf("  Decoded= ");
    printf("(%4x,%4x)\n",p[0],p[1]);

    p[0]=0x6789;
    p[1]=0xDABC;

    printf("Plaintext (%4x,%4x)",p[0],p[1]);

    encode(p,k1);
    encode(p,k2);
   
    printf("  Encoded= ");
    printf("(%4x,%4x)",p[0],p[1]);

    decode(p,k2);
    decode(p,k1);

    printf("  Decoded= ");
    printf("(%4x,%4x)\n",p[0],p[1]);

    p[0]=0x9ABC;
    p[1]=0xDEFF;

    printf("Plaintext (%4x,%4x)",p[0],p[1]);

    encode(p,k1);
    encode(p,k2);

    printf("  Encoded= ");
    printf("(%4x,%4x)",p[0],p[1]);

    decode(p,k2);
    decode(p,k1);

    printf("  Decoded= ");
    printf("(%4x,%4x)\n",p[0],p[1]);

    return 0;
}

输出:
plaintext( 1, 2) encoded=(c6db,4caf) decoded=( 1, 2)
plaintext(1234,5678) encoded=(1390,1704) decoded=(1234,5678)
plaintext(6789,dabc) encoded=(fbee,dd8b) decoded=(6789,dabc)
plaintext(9abc,deff) encoded=(67ef,6600) decoded=(9abc,deff)
求k1,k2

知道怎么解的跟帖

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 254
活跃值: (126)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
第二组怎么回事?
程序里写:
    p[0]=0x1234;
    p[1]=0x5678;

    printf("Plaintext (%4x,%4x)",p[0],p[1]);

对应输出:
plaintext(1234,4678)

5678=4678 ?
2005-11-27 11:08
0
雪    币: 313
活跃值: (440)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
3
int main()
{
        unsigned short k1[2],k2[2];
    unsigned short p[2]={0x1,0x2};

        for(k1[0]=0;k1[0]<=0xFF;k1[0]++)
        {
                for(k1[1]=0;k1[1]<=0xFFFF;k1[1]++)
                {                       
                        for(k2[0]=0;k2[0]<=0xFF;k2[0]++)
                        {
                                printf("%0.6f%%\n",(float)(k1[0]*0xffff*0xff+k1[1]*0xff+k2[0])/(float)(0xff*0xff)/(float)0xffff*100);
                                for(k2[1]=0;k2[1]<=0xFFFF;k2[1]++)
                                {
                                        encode(p,k1);
                                        encode(p,k2);

                                        if(p[0]==0xc6db && p[1]==0x4caf)
                                        {
                                                printf("k1[0]=%4x\nk1[2]=%4x\nk2[0]=%4x\nk2[1]=%4x",k1[0],k1[2],k2[0],k2[1]);
                                                break;
                                        }
                                        p[0]=0x1;
                                        p[1]=0x2;
                                }
                        }
                }
        }
        getch();
        return 0;
}

呵呵,我只会穷举
2005-11-27 11:26
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
最初由 heXer 发布
第二组怎么回事?
程序里写:
p[0]=0x1234;
p[1]=0x5678;

........

sorry,是5678,打错了。。。
2005-11-27 22:52
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
提示:用到DES
2005-11-27 22:55
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
最初由 4nil 发布
int main()
{
unsigned short k1[2],k2[2];
unsigned short p[2]={0x1,0x2};

........

兄弟这个方法有没有编译过?答案不对的。
2005-12-4 08:36
0
雪    币: 313
活跃值: (440)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
7
呵呵,只是一个思路,具体我没实践过
2005-12-4 14:15
0
雪    币: 313
活跃值: (440)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
8
而且速度也无法接受的
2005-12-4 14:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
呵呵
2005-12-5 03:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
看错了,呵呵,不好意思
2005-12-5 03:20
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
很好,学习中
2005-12-5 11:57
0
游客
登录 | 注册 方可回帖
返回
//