-1

我有以下算法,我想在bash.

void wepkey64(char *passphrase, unsigned char k64[4][5])
{
    unsigned char pseed[4] = {0};
    unsigned int randNumber, tmp;
    int i, j;

    for(i = 0; i < strlen(passphrase); i++)
    {
        pseed[i%4] ^= (unsigned char) passphrase[i];
    }

    randNumber = pseed[0] | (pseed[1] << 8) | (pseed[2] << 16) | (pseed[3] << 24);

    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < 5; j++)
        {
            randNumber = (randNumber * 0x343fd + 0x269ec3) & 0xffffffff;
            tmp = (randNumber >> 16) & 0xff;
            k64[i][j] = (unsigned char) tmp;
        }
    }
}

这个函数的等价物是什么bash

4

2 回答 2

1

您确定系统上的 /bin/sh 实际上是 Bourne Shell 吗?在许多系统上 /bin/sh 实际上是 Boune-Again SHell (bash).. 你可以检查:

sh --version

如果您可以访问gawk,它具有此处描述的位运算符:http ://www.gnu.org/software/gawk/manual/html_node/Bitwise-Functions.html

我想原来awk可能缺少这些运算符。但同样,和 一样shbash通常awkgawk许多系统上。

于 2013-05-09T18:11:01.087 回答
0

这是一个 awk 解决方案

wepkey.awk

BEGIN{for(n=0;n<256;n++)ord[sprintf("%c",n)]=n}{print ord[$1]}

{
  passphrase=$1

  pseed[0]=0
  pseed[1]=0
  pseed[2]=0
  pseed[3]=0

  for (i=0; i<length(passphrase); i++)
  {
    pseed[i%4] = xor(pseed[i%4], ord[substr(passphrase,i+1,1)])
  }

  randNumber = or( or( or(pseed[0], lshift(pseed[1],8)), lshift(pseed[2],16)), lshift(pseed[3], 24))

  for (i=0; i<4; i++)
  {
    for (j=0; j<5; j++)
    {
      randNumber=and(randNumber * 0x343fd + 0x269ec3, 0xffffffff)
      tmp=and(rshift(randNumber, 16), 0xff)
      printf "%02X", tmp
    }
    printf "\n"
  }
}

运行它

echo passphrase | awk -f wepkey.awk 
于 2013-05-10T14:23:07.077 回答