首页
社区
课程
招聘
[求助]请会C语言的朋友帮忙写这样一个算法DLL
发表于: 2010-6-20 23:23 6141

[求助]请会C语言的朋友帮忙写这样一个算法DLL

2010-6-20 23:23
6141
这是linux下的C请高人帮忙转成一个Windows下的DLL函数,输出函数为DES,伪代码如下,有不清楚的回复。做出来的朋友发我邮箱[sungon%163.com]最好了,谢谢
int __cdecl DES(int a1, int a2, int a3, int a4)
{
  signed int v4; // esi@6
  signed int v5; // esi@8
  int v6; // eax@9
  int v7; // edx@9
  signed int v8; // ecx@9
  signed int v9; // ecx@11
  unsigned __int8 v10; // bl@11
  int v11; // edx@12
  char v12; // al@12
  signed int v13; // esi@14
  int result; // eax@18
  int v15; // [sp+Ch] [bp-1Ch]@5
  int v16; // [sp+10h] [bp-18h]@8
  signed int v17; // [sp+18h] [bp-10h]@1
  signed int v18; // [sp+18h] [bp-10h]@3
  signed int v19; // [sp+18h] [bp-10h]@5
  signed int v20; // [sp+18h] [bp-10h]@17

  v17 = 0;
  do
  {
    deskey[v17] = *(_BYTE *)(v17 + a3);
    ++v17;
  }
  while ( v17 <= 7 );
  DES_setkey(deskey);
  v18 = 0;
  do
  {
    LR0[v18] = getbit(a1, (unsigned __int8)IIP[v18]);
    ++v18;
  }
  while ( v18 <= 63 );
  v19 = 0;
  v15 = 3 * ((((a4 != 1) - 1) & 0xFFFFFFF1) + 15);
  do
  {
    memcpy(LR1, &LR0[32], 0x20u);
    memset(&LR1[32], 0, 0x20u);
    v4 = 0;
    do
    {
      bit48[v4] = *(&SUBKEY[16 * v15] + v4) != LR0[(unsigned __int8)E[v4]];
      ++v4;
    }
    while ( v4 <= 47 );
    v5 = 0;
    v16 = 0;
    do
    {
      v6 = 2 * v5;
      v7 = 0;
      v8 = 5;
      do
      {
        LOBYTE(v6) = *(&bit48[v8--] + (unsigned __int8)(6 * v5));
        v7 = v6 + 2 * v7;
      }
      while ( v8 >= 0 );
      v10 = *(&S[(unsigned __int8)v7] + v16);
      v9 = 0;
      do
      {
        v11 = (unsigned __int8)(4 * v5 + 3) - v9++;
        v12 = v10 & 1;
        v10 >>= 1;
        bit32[v11] = v12;
      }
      while ( v9 <= 3 );
      ++v5;
      v16 += 64;
    }
    while ( v5 <= 7 );
    v13 = 0;
    do
    {
      LR1[v13 + 32] = LR0[v13] != bit32[(unsigned __int8)P[v13]];
      ++v13;
    }
    while ( v13 <= 31 );
    memcpy(LR0, LR1, 0x40u);
    ++v19;
    v15 += 3 * a4;
  }
  while ( v19 <= 15 );
  memcpy(LR1, &LR0[32], 0x20u);
  memcpy(&LR1[32], LR0, 0x20u);
  *(_DWORD *)a2 = 0;
  *(_DWORD *)(a2 + 4) = 0;
  v20 = 0;
  do
  {
    result = (unsigned __int8)IIP_1[v20];
    if ( LR1[result] )
      result = setbit(a2, v20);
    ++v20;
  }
  while ( v20 <= 63 );
  return result;
}

int __cdecl DES_setkey(int a1)
{
  signed int v1; // ebx@1

  v1 = 0;
  do
  {
    KEY[v1] = getbit(a1, v1);
    ++v1;
  }
  while ( v1 <= 63 );
  return getsubkey(a1);
}

bool __cdecl getbit(int a1, signed int a2)
{
  return (*((_BYTE *)&bitmask + (a2 & 7)) & *(_BYTE *)((a2 >> 3) + a1)) != 0;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 547
活跃值: (2200)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
输出另外一个函数,Xor
__int16 __cdecl Xor(int a1, int a2, unsigned __int16 a3)
{
  int v3; // edx@1
  int v4; // ecx@1
  int v5; // ebx@1
  __int16 result; // ax@2

  v5 = 0;
  v3 = a1;
  v4 = a2;
  if ( a3 )
  {
    do
    {
      ++v5;
      *(_BYTE *)v3 ^= *(_BYTE *)v4;
      result = (unsigned __int8)v5;
      ++v3;
      ++v4;
    }
    while ( (unsigned __int8)v5 < a3 );
  }
  return result;
}
2010-6-20 23:24
0
雪    币: 67
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
getsubkey缺少声明
2010-6-20 23:28
0
雪    币: 547
活跃值: (2200)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
4
int __cdecl getsubkey()
{
  signed int v0; // esi@1
  signed int v1; // esi@3
  int v2; // eax@4
  int v3; // edx@4
  int v4; // ecx@4
  char v5; // di@4
  char v6; // al@4
  char v7; // al@7
  int v8; // edx@8
  char i; // di@8
  char v10; // al@11
  signed int v11; // edx@12
  int result; // eax@13
  int v13; // [sp+0h] [bp-18h]@3
  char v14; // [sp+7h] [bp-11h]@4
  char v15; // [sp+8h] [bp-10h]@4
  char v16; // [sp+8h] [bp-10h]@8

  v0 = 0;
  do
  {
    CDD[v0] = KEY[(unsigned __int8)PC_1[v0]];
    ++v0;
  }
  while ( v0 <= 55 );
  v1 = 0;
  v13 = 0;
  do
  {
    v15 = CDD[1];
    v6 = Shift[v1];
    v4 = (unsigned __int8)v6;
    v14 = Shift[v1];
    v3 = 0;
    v2 = 28 - (unsigned __int8)v6;
    v5 = CDD[0];
    if ( v2 > 0 )
    {
      do
      {
        CDD[v3] = *(&CDD[v4] + v3);
        ++v3;
      }
      while ( v3 < v2 );
    }
    if ( v14 == 2 )
    {
      CDD[26] = v5;
      v7 = v15;
    }
    else
    {
      v7 = v5;
    }
    CDD[27] = v7;
    v16 = CDD[29];
    v8 = 28;
    for ( i = CDD[28]; v8 < 56 - (unsigned __int8)v14; ++v8 )
      CDD[v8] = *(&CDD[(unsigned __int8)v14] + v8);
    if ( v14 == 2 )
    {
      CDD[54] = i;
      v10 = v16;
    }
    else
    {
      v10 = i;
    }
    CDD[55] = v10;
    v11 = 0;
    do
    {
      result = (unsigned __int8)PC_2[v11];
      LOBYTE(result) = CDD[result];
      *(&SUBKEY[v11++] + v13) = result;
    }
    while ( v11 <= 47 );
    ++v1;
    v13 += 48;
  }
  while ( v1 <= 15 );
  return result;
}
2010-6-20 23:48
0
雪    币: 547
活跃值: (2200)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
5
请问这个DES中的算法和标准的DES算法一样吗?
2010-6-20 23:50
0
雪    币: 547
活跃值: (2200)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
6
这个DES算法能反向吗
2010-6-20 23:57
0
雪    币: 107
活跃值: (1693)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
7
逆DES?标准与不标准的地方,在那几个置换表,SBOX。自己去找个标准的表一一比对。
2010-6-21 09:03
0
雪    币: 547
活跃值: (2200)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
8
这个DES函数第四个参数是1,我猜这个是不是加密模式,为0是就是解密的?
2010-6-21 10:19
0
雪    币: 107
活跃值: (1693)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
9
以前见过这个样子的函数 。DES加密跟解密有一部分是相同的,只是后面的置换顺序不同。
2010-6-21 13:38
0
雪    币:
能力值: (RANK: )
在线值:
发帖
回帖
粉丝
10
如果你能跟踪函数的输入输出的话, 把Key找出来, 用标准的DES加/解密同一段数据, 看看结果是不是一致就知道是不是标准的DES实现了.
2010-6-22 21:46
0
游客
登录 | 注册 方可回帖
返回
//