急需大家帮忙!

时间:2022-12-28 05:05:34
出现这样的错误
error C2601: 'Step_Function' : local function definitions are illegal

error C2601: 'Compression_Function' : local function definitions are illegal
error C2601: 'main' : local function definitions are illegal
fatal error C1004: unexpected end of file found
执行 cl.exe 时出错.

代码如下:
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iomanip.h>
#include <ctime>
typedef unsigned int UINT;
#define TEST_FILE_NAME "D:\\multilist.txt"
//Delta Values
UINT delta[16]={0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4
,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174};
//n_bit Left Rotation
#define ROTR(x,n) ((x<<n)|(x>>(32-n)))
//The First Group Functions
#define g(x,a,c) ((~x)^(a&c))
//The Second Group Functions
#define h(x,b,c) ((x&b)^(x|(~c)))
#define l(x)  (x^(ROTR(x,15))^(ROTR(x,27)))
//The Third Group Functions
#define m(x,a,b,c) ((x&a)+(x&b)^(x&c))
//The Fourth Group Functions
#define p(x,b,d) ((x)^(b)^(d))
#define q(x,a,d) ((x&d)^((ROTR(a,7))+(ROTR(x,25))))
#define M 32
#define N 32
//Pseudo Hadamard Layer
#define PHT(A,B,C,D) B+=A;\
D+=C;\
A+=B;\
C+=D;


//Hamming Weight Function
Ham_Wei_Function(UINT x)
{
unsigned int v;
unsigned int c;
v=x;
for(c=0;v;v>>=1)
{
c+=v&1;
}
return c;
}
Multivariate_Function(unsigned int v0,unsigned int v1,unsigned int v2,unsigned int v3,unsigned int m0,unsigned int m1,unsigned int m2,unsigned int m3)
{
unsigned int x[32],a[N][M],c[M],d,f[4],b;
int i,j,l;
//get 32 variate
for(i=0;i<4;i++)
{
x[i]=(unsigned char)(v0>>8*i);
}
    for(i=4;i<8;i++)
{
x[i]=(unsigned char)(v1>>8*(i-4));
}
    for(i=8;i<12;i++)
{
x[i]=(unsigned char)(v2>>8*(i-8));
}
    for(i=12;i<16;i++)
{
x[i]=(unsigned char)(v3>>8*(i-12));
}
for(i=16;i<20;i++)
{
x[i]=(unsigned char)(m0>>8*(i-16));
}
for(i=20;i<24;i++)
{
x[i]=(unsigned char)(m1>>8*(i-20));
}
for(i=24;i<28;i++)
{
x[i]=(unsigned char)(m2>>8*(i-24));
}
for(i=28;i<32;i++)
{
x[i]=(unsigned char)(m3>>8*(i-28));
}
//read text to Table
FILE *fp = 0;
unsigned char Table[256][256]={0};
    fp=fopen(TEST_FILE_NAME,"rb");
if(fp==NULL)
{
printf("Sorry you give the wrong file name\n");
return 0;
}
fseek(fp,0L,SEEK_SET);

for(i=0;i<256;i++ )
{for(j=0;j<256;j++)
         fscanf(fp,"%x",&Table[i][j]);
        }
fclose(fp);
//get f[4]
 for(l=0;l<4;l++)
 {
 //get random coefficient
 srand(unsigned (time(NULL)));
 for(i=0;i<N;i++)
 {j=0;
  while(j<M)
  {
 a[i][j]=rand()%0xff;
     j++;
  }
 }
 for(i=0;i<M;i++)
 {
 c[i]=rand()%0xff;
 }
 d=rand()%0xff;
 //comput f[l]
 for(i=0;i<32;i++)
{ for(j=0;j<32;j++)
 {f[l]=Table[a[i][j]][x[i]];
  f[l]=Table[f[l]][x[j]];
 }

 for(i=0;i<32;i++)
 {f[l]^=Table[c[i]][x[i]];
 }
 f[l]^=d;
 }
 b=(f[0]<<24)|(f[1]<<16)|(f[2]<<8)|f[3];
 return b;
}

//Step Function
void Step_Function(UINT A,UINT B,UINT C,UINT D,UINT m0,UINT m1,UINT m2,UINT m3)
{
unsigned int V[4],temp[4];
unsigned int m[4];
int c[4]={0},i;
V[0]=A;
    V[1]=B;
V[2]=C;
V[3]=D;
m[0]=m0;
m[1]=m1;
m[2]=m2;
m[3]=m3;
    for(i=0;i<4;i++)
    {
 temp[i]=V[i]^m[i];
 c[i]=Ham_Wei_Function(temp[i]);
}
for(i=0;i<4;i++)
{
switch(c[i]%4)

{case 0: V[i]=g(temp[i],A,C);
     V[i]=Multivariate_Function(V[0],V[1],V[2],V[3],m[0],m[1],m[2],m[3]);
 break;
case 1:  V[i]=h(temp[i],B,C);
     V[i]=l(V[i]);
 break;
case 2:  V[i]=m(V[i],A,B,C);
     V[i]=Multivariate_Function(V[0],V[1],V[2],V[3],m[0],m[1],m[2],m[3]);
             break;
case 3:  V[i]=p(V[i],B,D);
     V[i]=q(V[i],A,D);
                 break;
}
}
PHT(V[0],V[1],V[2],V[3]);
    PHT(V[0],V[3],V[1],V[2]);
    PHT(V[1],V[2],V[0],V[3]);
    PHT(V[2],V[3],V[1],V[0]);
}
unsigned int Compression_Function(UINT *CV,UINT *Mes)
{
unsigned int V1[4],V2[4],V3[4],V4[4],M2[16],M3[16],M4[16],cv[4],M[16];
int i;
    cv=&CV;
M=&Mes;
for(i=0;i<4;i++)
{
   V1[i]=cv[i];
}
for(i=0;i<4;i++)
{
   V2[i]=cv[i];
}
    for(i=0;i<4;i++)
{
   V3[i]=cv[i];
}
for(i=0;i<4;i++)
{
   V4[i]=cv[i];
}
   

//Branch1(CV,M[16])
//STEP 1
Step_Function(V1[0],V1[1],V1[2],V1[3],M[0],M[1],M[2],M[3]);
//STEP 2
    Step_Function(V1[0],V1[1],V1[2],V1[3],M[4],M[5],M[6],M[7]);
//STEP 3
    Step_Function(V1[0],V1[1],V1[2],V1[3],M[8],M[9],M[10],M[11]);
//STEP 4
    Step_Function(V1[0],V1[1],V1[2],V1[3],M[12],M[13],M[14],M[15]);
    //Branch2(CV,M2[16])
for(i=0;i<16;i++)
{
M2[i]=~M[i];
}
//STEP 1
    Step_Function(V2[0],V2[1],V2[2],V2[3],M2[0],M2[1],M2[2],M2[3]);
//STEP 2
    Step_Function(V2[0],V2[1],V2[2],V2[3],M2[4],M2[5],M2[6],M2[7]);
//STEP 3
    Step_Function(V2[0],V2[1],V2[2],V2[3],M2[8],M2[9],M2[10],M2[11]);
//STEP 4
    Step_Function(V2[0],V2[1],V2[2],V2[3],M2[12],M2[13],M2[14],M2[15]);
//Branch3(CV,M3[16])
for(i=0;i<16;i++)
{ M3[i]=M[15-i];
}
//STEP 1
    Step_Function(V3[0],V3[1],V3[2],V3[3],M3[0],M3[1],M3[2],M3[3]);
//STEP 2
    Step_Function(V3[0],V3[1],V3[2],V3[3],M3[4],M3[5],M3[6],M3[7]);
//STEP 3
    Step_Function(V3[0],V3[1],V3[2],V3[3],M3[8],M3[9],M3[10],M3[11]);
//STEP 4
    Step_Function(V3[0],V3[1],V3[2],V3[3],M3[12],M3[13],M3[14],M3[15]);
//Branch4(CV,M[16])
for(i=0;i<16;i++)
{ M4[i]=M[i]+delta[i];
}
//STEP 1
    Step_Function(V4[0],V4[1],V4[2],V4[3],M4[0],M4[1],M4[2],M4[3]);
    //STEP 2
    Step_Function(V4[0],V4[1],V4[2],V4[3],M4[4],M4[5],M4[6],M4[7]);
//STEP 3
    Step_Function(V4[0],V4[1],V4[2],V4[3],M4[8],M4[9],M4[10],M4[11]);
//STEP 4
    Step_Function(V4[0],V4[1],V4[2],V4[3],M4[12],M4[13],M4[14],M4[15]);
//output
CV[0]=CV[0]^((V1[0]^V2[0])+(V3[0]^V4[0]));
    CV[1]=CV[1]^((V1[1]^V2[1])+(V3[1]^V4[1]));
    CV[2]=CV[2]^((V1[2]^V2[2])+(V3[2]^V4[2]));
    CV[3]=CV[3]^((V1[3]^V2[3])+(V3[3]^V4[3]));
return *cv;
}
void main()
{ int i;
  UINT h[4];
  UINT Message[16]={0x4105ba8c,0xd8423ce8,0xac484680,0x07ee1d40,0xbc18d07a,0x89fc027c,0x5ee37091,0xcd1824f0,
                    0x878de230,0xdbbaf0fc,0xda7e4408,0xc6c05bc0,0x33065020,0x80000000,0x1a000000,0x00000000};
  UINT CV[4]={0x01234567,0x89abcdef,0xfedcba98,0x76543210};
 h[4]=Compression_Function(CV,Message);
  for(i=0;i<4;i++)
  cout<<"0x"<<setfill('0')<<setw(8)<<hex<<h[i]<<" ";
  cout<<endl;
  return 0;
}

18 个解决方案

#1



检查一下你函数的 {  } 是否匹配, 主要是由于这个原因造成的

#2


你的函数都没有返回类型,但是又有返回值,还有你的主函数返回类型和返回值不一致

#3


Ham_Wei_Function

Multivariate_Function

函数没有返回值

void main()   return 0; //返回类型不一致吧

#4


给你整理下代码,看着真累眼啊

#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iomanip.h>
#include <ctime>
typedef unsigned int UINT;
#define TEST_FILE_NAME "D:\\multilist.txt"
//Delta Values
UINT delta[16]={0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4
,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174};
//n_bit Left Rotation
#define ROTR(x,n) ((x < <n)|(x>>(32-n)))
//The First Group Functions
#define g(x,a,c) ((~x)^(a&c))
//The Second Group Functions
#define h(x,b,c) ((x&b)^(x|(~c)))
#define l(x)  (x^(ROTR(x,15))^(ROTR(x,27)))
//The Third Group Functions
#define m(x,a,b,c) ((x&a)+(x&b)^(x&c))
//The Fourth Group Functions
#define p(x,b,d) ((x)^(b)^(d))
#define q(x,a,d) ((x&d)^((ROTR(a,7))+(ROTR(x,25))))
#define M 32
#define N 32
//Pseudo Hadamard Layer
#define PHT(A,B,C,D) B+=A;\
D+=C;\
A+=B;\
C+=D;


//Hamming Weight Function
Ham_Wei_Function(UINT x)
{
unsigned int v;
unsigned int c;
v=x;
for(c=0;v;v>>=1)
{
c+=v&1;
}
return c;
}
Multivariate_Function(unsigned int v0,unsigned int v1,unsigned int v2,unsigned int v3,unsigned int m0,unsigned int m1,unsigned int m2,unsigned int m3)
{
unsigned int x[32],a[N][M],c[M],d,f[4],b;
int i,j,l;
//get 32 variate
for(i=0;i <4;i++)
{
x[i]=(unsigned char)(v0>>8*i);
}
    for(i=4;i <8;i++)
{
x[i]=(unsigned char)(v1>>8*(i-4));
}
    for(i=8;i <12;i++)
{
x[i]=(unsigned char)(v2>>8*(i-8));
}
    for(i=12;i <16;i++)
{
x[i]=(unsigned char)(v3>>8*(i-12));
}
for(i=16;i <20;i++)
{
x[i]=(unsigned char)(m0>>8*(i-16));
}
for(i=20;i <24;i++)
{
x[i]=(unsigned char)(m1>>8*(i-20));
}
for(i=24;i <28;i++)
{
x[i]=(unsigned char)(m2>>8*(i-24));
}
for(i=28;i <32;i++)
{
x[i]=(unsigned char)(m3>>8*(i-28));
}
//read text to Table
FILE *fp = 0;
unsigned char Table[256][256]={0};
    fp=fopen(TEST_FILE_NAME,"rb");
if(fp==NULL)
{
printf("Sorry you give the wrong file name\n");
return 0;
}
fseek(fp,0L,SEEK_SET);

for(i=0;i <256;i++ )
{for(j=0;j <256;j++)
        fscanf(fp,"%x",&Table[i][j]);
        }
fclose(fp);
//get f[4]
for(l=0;l <4;l++)
{
//get random coefficient
srand(unsigned (time(NULL)));
for(i=0;i <N;i++)
{j=0;
  while(j <M)
  {
a[i][j]=rand()%0xff;
    j++;
  }
}
for(i=0;i <M;i++)
{
c[i]=rand()%0xff;
}
d=rand()%0xff;
//comput f[l]
for(i=0;i <32;i++)
{ for(j=0;j <32;j++)
{f[l]=Table[a[i][j]][x[i]];
  f[l]=Table[f[l]][x[j]];
}

for(i=0;i <32;i++)
{f[l]^=Table[c[i]][x[i]];
}
f[l]^=d;
}
b=(f[0] < <24)|(f[1] < <16)|(f[2] < <8)|f[3];
return b;
}

//Step Function
void Step_Function(UINT A,UINT B,UINT C,UINT D,UINT m0,UINT m1,UINT m2,UINT m3)
{
unsigned int V[4],temp[4];
unsigned int m[4];
int c[4]={0},i;
V[0]=A;
    V[1]=B;
V[2]=C;
V[3]=D;
m[0]=m0;
m[1]=m1;
m[2]=m2;
m[3]=m3;
    for(i=0;i <4;i++)
    {
temp[i]=V[i]^m[i];
c[i]=Ham_Wei_Function(temp[i]);
}
for(i=0;i <4;i++)
{
switch(c[i]%4)

{case 0: V[i]=g(temp[i],A,C);
    V[i]=Multivariate_Function(V[0],V[1],V[2],V[3],m[0],m[1],m[2],m[3]);
break;
case 1:  V[i]=h(temp[i],B,C);
    V[i]=l(V[i]);
break;
case 2:  V[i]=m(V[i],A,B,C);
    V[i]=Multivariate_Function(V[0],V[1],V[2],V[3],m[0],m[1],m[2],m[3]);
            break;
case 3:  V[i]=p(V[i],B,D);
    V[i]=q(V[i],A,D);
                break;
}
}
PHT(V[0],V[1],V[2],V[3]);
    PHT(V[0],V[3],V[1],V[2]);
    PHT(V[1],V[2],V[0],V[3]);
    PHT(V[2],V[3],V[1],V[0]);
}
unsigned int Compression_Function(UINT *CV,UINT *Mes)
{
unsigned int V1[4],V2[4],V3[4],V4[4],M2[16],M3[16],M4[16],cv[4],M[16];
int i;
    cv=&CV;
M=&Mes;
for(i=0;i <4;i++)
{
V1[i]=cv[i];
}
for(i=0;i <4;i++)
{
V2[i]=cv[i];
}
    for(i=0;i <4;i++)
{
V3[i]=cv[i];
}
for(i=0;i <4;i++)
{
V4[i]=cv[i];
}
 

//Branch1(CV,M[16])
//STEP 1
Step_Function(V1[0],V1[1],V1[2],V1[3],M[0],M[1],M[2],M[3]);
//STEP 2
    Step_Function(V1[0],V1[1],V1[2],V1[3],M[4],M[5],M[6],M[7]);
//STEP 3
    Step_Function(V1[0],V1[1],V1[2],V1[3],M[8],M[9],M[10],M[11]);
//STEP 4
    Step_Function(V1[0],V1[1],V1[2],V1[3],M[12],M[13],M[14],M[15]);
    //Branch2(CV,M2[16])
for(i=0;i <16;i++)
{
M2[i]=~M[i];
}
//STEP 1
    Step_Function(V2[0],V2[1],V2[2],V2[3],M2[0],M2[1],M2[2],M2[3]);
//STEP 2
    Step_Function(V2[0],V2[1],V2[2],V2[3],M2[4],M2[5],M2[6],M2[7]);
//STEP 3
    Step_Function(V2[0],V2[1],V2[2],V2[3],M2[8],M2[9],M2[10],M2[11]);
//STEP 4
    Step_Function(V2[0],V2[1],V2[2],V2[3],M2[12],M2[13],M2[14],M2[15]);
//Branch3(CV,M3[16])
for(i=0;i <16;i++)
{ M3[i]=M[15-i];
}
//STEP 1
    Step_Function(V3[0],V3[1],V3[2],V3[3],M3[0],M3[1],M3[2],M3[3]);
//STEP 2
    Step_Function(V3[0],V3[1],V3[2],V3[3],M3[4],M3[5],M3[6],M3[7]);
//STEP 3
    Step_Function(V3[0],V3[1],V3[2],V3[3],M3[8],M3[9],M3[10],M3[11]);
//STEP 4
    Step_Function(V3[0],V3[1],V3[2],V3[3],M3[12],M3[13],M3[14],M3[15]);
//Branch4(CV,M[16])
for(i=0;i <16;i++)
{ M4[i]=M[i]+delta[i];
}
//STEP 1
    Step_Function(V4[0],V4[1],V4[2],V4[3],M4[0],M4[1],M4[2],M4[3]);
    //STEP 2
    Step_Function(V4[0],V4[1],V4[2],V4[3],M4[4],M4[5],M4[6],M4[7]);
//STEP 3
    Step_Function(V4[0],V4[1],V4[2],V4[3],M4[8],M4[9],M4[10],M4[11]);
//STEP 4
    Step_Function(V4[0],V4[1],V4[2],V4[3],M4[12],M4[13],M4[14],M4[15]);
//output
CV[0]=CV[0]^((V1[0]^V2[0])+(V3[0]^V4[0]));
    CV[1]=CV[1]^((V1[1]^V2[1])+(V3[1]^V4[1]));
    CV[2]=CV[2]^((V1[2]^V2[2])+(V3[2]^V4[2]));
    CV[3]=CV[3]^((V1[3]^V2[3])+(V3[3]^V4[3]));
return *cv;
}
void main()
{ int i;
  UINT h[4];
  UINT Message[16]={0x4105ba8c,0xd8423ce8,0xac484680,0x07ee1d40,0xbc18d07a,0x89fc027c,0x5ee37091,0xcd1824f0,
                    0x878de230,0xdbbaf0fc,0xda7e4408,0xc6c05bc0,0x33065020,0x80000000,0x1a000000,0x00000000};
  UINT CV[4]={0x01234567,0x89abcdef,0xfedcba98,0x76543210};
h[4]=Compression_Function(CV,Message);
  for(i=0;i <4;i++)
  cout < <"0x" < <setfill('0') < <setw(8) < <hex < <h[i] < <" ";
  cout < <endl;
  return 0;
}

#5


void main()  return 0 这个我已经改了,去掉了void.
Ham_Wei_Function 有返回值是 return c;

Multivariate_Function 有返回值是 return b;

#6


char Ham_Wei_Function() 

char Multivariate_Function ()

加上函数返回类型

#7


unsigned int Ham_Wei_Function(UINT x)
unsigned int Multivariate_Function
UINT Compression_Function(UINT *CV,UINT *Mes)
int main()
 return 0;
这是我改了的,可是还有错啊
error C2601: 'Step_Function' : local function definitions are illegal
error C2601: 'Compression_Function' : local function definitions are illegal
error C2601: 'main' : local function definitions are illegal
fatal error C1004: unexpected end of file found
执行 cl.exe 时出错.

#8


你的Multivariate_Function丢了个},你查查在哪里丢的
还有<<中间的空格去掉

#9


cv=&CV;
这个也不对

#10


程序的成功  =  40%汗水 +  60%良好的代码风格

#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iomanip.h>
#include <ctime>
typedef unsigned int UINT;
#define TEST_FILE_NAME "D:\\multilist.txt"
//Delta Values
UINT delta[16]={0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4
,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174};
//n_bit Left Rotation
#define ROTR(x,n) ((x < <n)|(x>>(32-n)))
//The First Group Functions
#define g(x,a,c) ((~x)^(a&c))
//The Second Group Functions
#define h(x,b,c) ((x&b)^(x|(~c)))
#define l(x)  (x^(ROTR(x,15))^(ROTR(x,27)))
//The Third Group Functions
#define m(x,a,b,c) ((x&a)+(x&b)^(x&c))
//The Fourth Group Functions
#define p(x,b,d) ((x)^(b)^(d))
#define q(x,a,d) ((x&d)^((ROTR(a,7))+(ROTR(x,25))))
#define M 32
#define N 32
//Pseudo Hadamard Layer
#define PHT(A,B,C,D) B+=A;\
D+=C;\
A+=B;\
C+=D;


//Hamming Weight Function
Ham_Wei_Function(UINT x)
{
unsigned int v;
unsigned int c;
v=x;
for(c=0;v;v>>=1)
{
c+=v&1;
}
return c;
}
Multivariate_Function(unsigned int v0,unsigned int v1,unsigned int v2,unsigned int v3,unsigned int m0,unsigned int m1,unsigned int m2,unsigned int m3)
{
unsigned int x[32],a[N][M],c[M],d,f[4],b;
int i,j,l;
//get 32 variate
for(i=0;i <4;i++)
{
x[i]=(unsigned char)(v0>>8*i);
}
for(i=4;i <8;i++)
{
x[i]=(unsigned char)(v1>>8*(i-4));
}
for(i=8;i <12;i++)
{
x[i]=(unsigned char)(v2>>8*(i-8));
}
for(i=12;i <16;i++)
{
x[i]=(unsigned char)(v3>>8*(i-12));
}
for(i=16;i <20;i++)
{
x[i]=(unsigned char)(m0>>8*(i-16));
}
for(i=20;i <24;i++)
{
x[i]=(unsigned char)(m1>>8*(i-20));
}
for(i=24;i <28;i++)
{
x[i]=(unsigned char)(m2>>8*(i-24));
}
for(i=28;i <32;i++)
{
x[i]=(unsigned char)(m3>>8*(i-28));
}
//read text to Table
FILE *fp = 0;
unsigned char Table[256][256]={0};
fp=fopen(TEST_FILE_NAME,"rb");
if(fp==NULL)
{
printf("Sorry you give the wrong file name\n");
return 0;
}
fseek(fp,0L,SEEK_SET);

for(i=0;i <256;i++ )
{for(j=0;j <256;j++)
fscanf(fp,"%x",&Table[i][j]);
}
fclose(fp);
//get f[4]
for(l=0;l <4;l++)
{
//get random coefficient
srand(unsigned (time(NULL)));
for(i=0;i <N;i++)
{j=0;
while(j <M)
{
a[i][j]=rand()%0xff;
j++;
}
}
for(i=0;i <M;i++)
{
c[i]=rand()%0xff;
}
d=rand()%0xff;
//comput f[l]
for(i=0;i <32;i++)
{ for(j=0;j <32;j++)
{f[l]=Table[a[i][j]][x[i]];
f[l]=Table[f[l]][x[j]];
}

for(i=0;i <32;i++)
{f[l]^=Table[c[i]][x[i]];
}
f[l]^=d;
}
b=(f[0] < <24)|(f[1] < <16)|(f[2] < <8)|f[3];
return b;
}

//Step Function
void Step_Function(UINT A,UINT B,UINT C,UINT D,UINT m0,UINT m1,UINT m2,UINT m3)
{
unsigned int V[4],temp[4];
unsigned int m[4];
int c[4]={0},i;
V[0]=A;
V[1]=B;
V[2]=C;
V[3]=D;
m[0]=m0;
m[1]=m1;
m[2]=m2;
m[3]=m3;
for(i=0;i <4;i++)
{
temp[i]=V[i]^m[i];
c[i]=Ham_Wei_Function(temp[i]);
}
for(i=0;i <4;i++)
{
switch(c[i]%4)

{case 0: V[i]=g(temp[i],A,C);
V[i]=Multivariate_Function(V[0],V[1],V[2],V[3],m[0],m[1],m[2],m[3]);
break;
case 1:  V[i]=h(temp[i],B,C);
V[i]=l(V[i]);
break;
case 2:  V[i]=m(V[i],A,B,C);
V[i]=Multivariate_Function(V[0],V[1],V[2],V[3],m[0],m[1],m[2],m[3]);
break;
case 3:  V[i]=p(V[i],B,D);
V[i]=q(V[i],A,D);
break;
}
}
PHT(V[0],V[1],V[2],V[3]);
PHT(V[0],V[3],V[1],V[2]);
PHT(V[1],V[2],V[0],V[3]);
PHT(V[2],V[3],V[1],V[0]);
}
unsigned int Compression_Function(UINT *CV,UINT *Mes)
{
unsigned int V1[4],V2[4],V3[4],V4[4],M2[16],M3[16],M4[16],cv[4],M[16];
int i;
cv=&CV;
M=&Mes;
for(i=0;i <4;i++)
{
V1[i]=cv[i];
}
for(i=0;i <4;i++)
{
V2[i]=cv[i];
}
for(i=0;i <4;i++)
{
V3[i]=cv[i];
}
for(i=0;i <4;i++)
{
V4[i]=cv[i];
}


//Branch1(CV,M[16])
//STEP 1
Step_Function(V1[0],V1[1],V1[2],V1[3],M[0],M[1],M[2],M[3]);
//STEP 2
Step_Function(V1[0],V1[1],V1[2],V1[3],M[4],M[5],M[6],M[7]);
//STEP 3
Step_Function(V1[0],V1[1],V1[2],V1[3],M[8],M[9],M[10],M[11]);
//STEP 4
Step_Function(V1[0],V1[1],V1[2],V1[3],M[12],M[13],M[14],M[15]);
//Branch2(CV,M2[16])
for(i=0;i <16;i++)
{
M2[i]=~M[i];
}
//STEP 1
Step_Function(V2[0],V2[1],V2[2],V2[3],M2[0],M2[1],M2[2],M2[3]);
//STEP 2
Step_Function(V2[0],V2[1],V2[2],V2[3],M2[4],M2[5],M2[6],M2[7]);
//STEP 3
Step_Function(V2[0],V2[1],V2[2],V2[3],M2[8],M2[9],M2[10],M2[11]);
//STEP 4
Step_Function(V2[0],V2[1],V2[2],V2[3],M2[12],M2[13],M2[14],M2[15]);
//Branch3(CV,M3[16])
for(i=0;i <16;i++)
{ M3[i]=M[15-i];
}
//STEP 1
Step_Function(V3[0],V3[1],V3[2],V3[3],M3[0],M3[1],M3[2],M3[3]);
//STEP 2
Step_Function(V3[0],V3[1],V3[2],V3[3],M3[4],M3[5],M3[6],M3[7]);
//STEP 3
Step_Function(V3[0],V3[1],V3[2],V3[3],M3[8],M3[9],M3[10],M3[11]);
//STEP 4
Step_Function(V3[0],V3[1],V3[2],V3[3],M3[12],M3[13],M3[14],M3[15]);
//Branch4(CV,M[16])
for(i=0;i <16;i++)
{ M4[i]=M[i]+delta[i];
}
//STEP 1
Step_Function(V4[0],V4[1],V4[2],V4[3],M4[0],M4[1],M4[2],M4[3]);
//STEP 2
Step_Function(V4[0],V4[1],V4[2],V4[3],M4[4],M4[5],M4[6],M4[7]);
//STEP 3
Step_Function(V4[0],V4[1],V4[2],V4[3],M4[8],M4[9],M4[10],M4[11]);
//STEP 4
Step_Function(V4[0],V4[1],V4[2],V4[3],M4[12],M4[13],M4[14],M4[15]);
//output
CV[0]=CV[0]^((V1[0]^V2[0])+(V3[0]^V4[0]));
CV[1]=CV[1]^((V1[1]^V2[1])+(V3[1]^V4[1]));
CV[2]=CV[2]^((V1[2]^V2[2])+(V3[2]^V4[2]));
CV[3]=CV[3]^((V1[3]^V2[3])+(V3[3]^V4[3]));
return *cv;
}
void main()
{ int i;
UINT h[4];
UINT Message[16]={0x4105ba8c,0xd8423ce8,0xac484680,0x07ee1d40,0xbc18d07a,0x89fc027c,0x5ee37091,0xcd1824f0,
0x878de230,0xdbbaf0fc,0xda7e4408,0xc6c05bc0,0x33065020,0x80000000,0x1a000000,0x00000000};
UINT CV[4]={0x01234567,0x89abcdef,0xfedcba98,0x76543210};
h[4]=Compression_Function(CV,Message);
for(i=0;i <4;i++)
cout < <"0x" < <setfill('0') < <setw(8) < <hex < <h[i] < <" ";
cout < <endl;
return 0;
}

#11


同理,M=&Mes;也不对

#12


汗个。。。格式化后才发现有好多的{}是不匹配的。。。

#13


可是我的返回值c,b类型都是unsigned int啊

#14



1 我用的是vs2005,里面可能对M宏定义了,所以我把你的M都改成了MM
2 你传递数组那是没办法那样赋值的,只有字符数组才可以
3 风格很乱,返回值之类的有问题



#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <iomanip>
#include <ctime>
typedef unsigned int UINT;
using namespace std;
#define TEST_FILE_NAME "D:\\multilist.txt"
//Delta Values
UINT delta[16]={0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4
,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174};
//n_bit Left Rotation
#define ROTR(x,n) ((x <<n)|(x>>(32-n)))
//The First Group Functions
#define g(x,a,c) ((~x)^(a&c))
//The Second Group Functions
#define h(x,b,c) ((x&b)^(x|(~c)))
#define l(x)  (x^(ROTR(x,15))^(ROTR(x,27)))
//The Third Group Functions
#define m(x,a,b,c) ((x&a)+(x&b)^(x&c))
//The Fourth Group Functions
#define p(x,b,d) ((x)^(b)^(d))
#define q(x,a,d) ((x&d)^((ROTR(a,7))+(ROTR(x,25))))
#define M 32
#define N 32
//Pseudo Hadamard Layer
#define PHT(A,B,C,D) B+=A;\
D+=C;\
A+=B;\
C+=D;


//Hamming Weight Function
unsigned int Ham_Wei_Function(UINT x)
{
unsigned int v;
unsigned int c;
v=x;
for(c=0;v;v>>=1)
{
c+=v&1;
}
return c;
}
unsigned int Multivariate_Function(unsigned int v0,unsigned int v1,unsigned int v2,unsigned int v3,unsigned int m0,unsigned int m1,unsigned int m2,unsigned int m3)
{
unsigned int x[32],a[N][M],c[M],d,f[4],b;
int i,j,l;
//get 32 variate
for(i=0;i <4;i++)
{
x[i]=(unsigned char)(v0>>8*i);
}
for(i=4;i <8;i++)
{
x[i]=(unsigned char)(v1>>8*(i-4));
}
for(i=8;i <12;i++)
{
x[i]=(unsigned char)(v2>>8*(i-8));
}
for(i=12;i <16;i++)
{
x[i]=(unsigned char)(v3>>8*(i-12));
}
for(i=16;i <20;i++)
{
x[i]=(unsigned char)(m0>>8*(i-16));
}
for(i=20;i <24;i++)
{
x[i]=(unsigned char)(m1>>8*(i-20));
}
for(i=24;i <28;i++)
{
x[i]=(unsigned char)(m2>>8*(i-24));
}
for(i=28;i <32;i++)
{
x[i]=(unsigned char)(m3>>8*(i-28));
}
//read text to Table
FILE *fp = 0;
unsigned char Table[256][256]={0};
fp=fopen(TEST_FILE_NAME,"rb");
if(fp==NULL)
{
printf("Sorry you give the wrong file name\n");
return 0;
}
fseek(fp,0L,SEEK_SET);

for(i=0;i <256;i++ )
{for(j=0;j <256;j++)
fscanf(fp,"%x",&Table[i][j]);
}
fclose(fp);
//get f[4]
for(l=0;l <4;l++)
{
//get random coefficient
srand(unsigned (time(NULL)));
for(i=0;i <N;i++)
{j=0;
while(j <M)
{
a[i][j]=rand()%0xff;
j++;
}
}
for(i=0;i <M;i++)
{
c[i]=rand()%0xff;
}
d=rand()%0xff;
//comput f[l]
for(i=0;i <32;i++)
{ for(j=0;j <32;j++)
{f[l]=Table[a[i][j]][x[i]];
f[l]=Table[f[l]][x[j]];
}

for(i=0;i <32;i++)
{f[l]^=Table[c[i]][x[i]];
}
f[l]^=d;
}
b=(f[0] <<24)|(f[1] <<16)|(f[2] <<8)|f[3];
return b;
}
}
//Step Function
void Step_Function(UINT A,UINT B,UINT C,UINT D,UINT m0,UINT m1,UINT m2,UINT m3)
{
unsigned int V[4],temp[4];
unsigned int m[4];
int c[4]={0},i;
V[0]=A;
V[1]=B;
V[2]=C;
V[3]=D;
m[0]=m0;
m[1]=m1;
m[2]=m2;
m[3]=m3;
for(i=0;i <4;i++)
{
temp[i]=V[i]^m[i];
c[i]=Ham_Wei_Function(temp[i]);
}
for(i=0;i <4;i++)
{
switch(c[i]%4)
{
case 0: 
V[i]=g(temp[i],A,C);
V[i]=Multivariate_Function(V[0],V[1],V[2],V[3],m[0],m[1],m[2],m[3]);
break;
case 1:  
V[i]=h(temp[i],B,C);
V[i]=l(V[i]);
break;
case 2:  
V[i]=m(V[i],A,B,C);
V[i]=Multivariate_Function(V[0],V[1],V[2],V[3],m[0],m[1],m[2],m[3]);
break;
case 3:  
V[i]=p(V[i],B,D);
V[i]=q(V[i],A,D);
break;
}
}
PHT(V[0],V[1],V[2],V[3]);
PHT(V[0],V[3],V[1],V[2]);
PHT(V[1],V[2],V[0],V[3]);
PHT(V[2],V[3],V[1],V[0]);
}
unsigned int Compression_Function(UINT *CV,UINT cvLen, UINT *Mes, UINT mesLen)
{
        unsigned int V1[4],V2[4],V3[4],V4[4],M2[16],M3[16],M4[16],cv[4],MM[16];
int i;
for (UINT ui = 0; ui < cvLen; ui++)
{
cv[ui] = CV[ui];
}
for (UINT ui = 0; ui < mesLen; ui++)
{
MM[ui] = Mes[ui];
}
for(i=0;i <4;i++)
{
V1[i]=cv[i];
}
for(i=0;i <4;i++)
{
V2[i]=cv[i];
}
for(i=0;i <4;i++)
{
V3[i]=cv[i];
}
for(i=0;i <4;i++)
{
V4[i]=cv[i];
}


//Branch1(CV,M[16])
//STEP 1
Step_Function(V1[0],V1[1],V1[2],V1[3],MM[0],MM[1],MM[2],MM[3]);
//STEP 2
Step_Function(V1[0],V1[1],V1[2],V1[3],MM[4],MM[5],MM[6],MM[7]);
//STEP 3
Step_Function(V1[0],V1[1],V1[2],V1[3],MM[8],MM[9],MM[10],MM[11]);
//STEP 4
Step_Function(V1[0],V1[1],V1[2],V1[3],MM[12],MM[13],MM[14],MM[15]);
//Branch2(CV,M2[16])
for(i=0;i <16;i++)
{
M2[i]=~MM[i];
}
//STEP 1
Step_Function(V2[0],V2[1],V2[2],V2[3],M2[0],M2[1],M2[2],M2[3]);
//STEP 2
Step_Function(V2[0],V2[1],V2[2],V2[3],M2[4],M2[5],M2[6],M2[7]);
//STEP 3
Step_Function(V2[0],V2[1],V2[2],V2[3],M2[8],M2[9],M2[10],M2[11]);
//STEP 4
Step_Function(V2[0],V2[1],V2[2],V2[3],M2[12],M2[13],M2[14],M2[15]);
//Branch3(CV,M3[16])
for(i=0;i <16;i++)
{ M3[i]=MM[15-i];
}
//STEP 1
Step_Function(V3[0],V3[1],V3[2],V3[3],M3[0],M3[1],M3[2],M3[3]);
//STEP 2
Step_Function(V3[0],V3[1],V3[2],V3[3],M3[4],M3[5],M3[6],M3[7]);
//STEP 3
Step_Function(V3[0],V3[1],V3[2],V3[3],M3[8],M3[9],M3[10],M3[11]);
//STEP 4
Step_Function(V3[0],V3[1],V3[2],V3[3],M3[12],M3[13],M3[14],M3[15]);
//Branch4(CV,M[16])
for(i=0;i <16;i++)
{ M4[i]=MM[i]+delta[i];
}
//STEP 1
Step_Function(V4[0],V4[1],V4[2],V4[3],M4[0],M4[1],M4[2],M4[3]);
//STEP 2
Step_Function(V4[0],V4[1],V4[2],V4[3],M4[4],M4[5],M4[6],M4[7]);
//STEP 3
Step_Function(V4[0],V4[1],V4[2],V4[3],M4[8],M4[9],M4[10],M4[11]);
//STEP 4
Step_Function(V4[0],V4[1],V4[2],V4[3],M4[12],M4[13],M4[14],M4[15]);
//output
CV[0]=CV[0]^((V1[0]^V2[0])+(V3[0]^V4[0]));
CV[1]=CV[1]^((V1[1]^V2[1])+(V3[1]^V4[1]));
CV[2]=CV[2]^((V1[2]^V2[2])+(V3[2]^V4[2]));
CV[3]=CV[3]^((V1[3]^V2[3])+(V3[3]^V4[3]));
return *cv;
}
void main()

int i;
UINT h[4];
UINT Message[16]={0x4105ba8c,0xd8423ce8,0xac484680,0x07ee1d40,0xbc18d07a,0x89fc027c,0x5ee37091,0xcd1824f0,
0x878de230,0xdbbaf0fc,0xda7e4408,0xc6c05bc0,0x33065020,0x80000000,0x1a000000,0x00000000};
UINT CV[4]={0x01234567,0x89abcdef,0xfedcba98,0x76543210};
h[4]=Compression_Function(CV,4,Message,16);
for(i=0;i <4;i++)
cout <<"0x" <<setfill('0') <<setw(8) <<hex <<h[i] <<" ";
cout <<endl;
return ;
}


#15


错误如下
1.Step_Function函数定义前加个“}”, 上一个函数的大括号没匹配
2.函数定义的返回值类型和实际返回值类型不一致。这个很多,不一一说了。注意C++中函数必须有返回值,哪怕是void
3.变量重名的问题, M既是个宏,又是个int数组,还有CV, Mes也重定义了
4.不知所云的操作,如cv=&CV; 

改完这些编译通过了,但运行还有错误。不清楚你的程序要干嘛,因此懒得调了

PS:LZ应该属于编程还没入门。建议你多从小处着眼,注意代码风格和命名规则。很多是后,变量取个又意义的名字就不可能出现那个bug

#16


#define ROTR(x,n) ((x < <n)|(x>>(32-n)))中的那个空格真恶心,害我找了半天,都快信不着编译器了

#17


我刚才根据你给我改的,我改了,确实编译通过了,但是运行有错误啊。我是VC++6.0.
我是新手,所以麻烦大家了。我在看看怎么给你们分啊。太感谢你们了

#18


大家现在按14楼的帖子中的程序帮我看看还是什么错误啊

#1



检查一下你函数的 {  } 是否匹配, 主要是由于这个原因造成的

#2


你的函数都没有返回类型,但是又有返回值,还有你的主函数返回类型和返回值不一致

#3


Ham_Wei_Function

Multivariate_Function

函数没有返回值

void main()   return 0; //返回类型不一致吧

#4


给你整理下代码,看着真累眼啊

#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iomanip.h>
#include <ctime>
typedef unsigned int UINT;
#define TEST_FILE_NAME "D:\\multilist.txt"
//Delta Values
UINT delta[16]={0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4
,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174};
//n_bit Left Rotation
#define ROTR(x,n) ((x < <n)|(x>>(32-n)))
//The First Group Functions
#define g(x,a,c) ((~x)^(a&c))
//The Second Group Functions
#define h(x,b,c) ((x&b)^(x|(~c)))
#define l(x)  (x^(ROTR(x,15))^(ROTR(x,27)))
//The Third Group Functions
#define m(x,a,b,c) ((x&a)+(x&b)^(x&c))
//The Fourth Group Functions
#define p(x,b,d) ((x)^(b)^(d))
#define q(x,a,d) ((x&d)^((ROTR(a,7))+(ROTR(x,25))))
#define M 32
#define N 32
//Pseudo Hadamard Layer
#define PHT(A,B,C,D) B+=A;\
D+=C;\
A+=B;\
C+=D;


//Hamming Weight Function
Ham_Wei_Function(UINT x)
{
unsigned int v;
unsigned int c;
v=x;
for(c=0;v;v>>=1)
{
c+=v&1;
}
return c;
}
Multivariate_Function(unsigned int v0,unsigned int v1,unsigned int v2,unsigned int v3,unsigned int m0,unsigned int m1,unsigned int m2,unsigned int m3)
{
unsigned int x[32],a[N][M],c[M],d,f[4],b;
int i,j,l;
//get 32 variate
for(i=0;i <4;i++)
{
x[i]=(unsigned char)(v0>>8*i);
}
    for(i=4;i <8;i++)
{
x[i]=(unsigned char)(v1>>8*(i-4));
}
    for(i=8;i <12;i++)
{
x[i]=(unsigned char)(v2>>8*(i-8));
}
    for(i=12;i <16;i++)
{
x[i]=(unsigned char)(v3>>8*(i-12));
}
for(i=16;i <20;i++)
{
x[i]=(unsigned char)(m0>>8*(i-16));
}
for(i=20;i <24;i++)
{
x[i]=(unsigned char)(m1>>8*(i-20));
}
for(i=24;i <28;i++)
{
x[i]=(unsigned char)(m2>>8*(i-24));
}
for(i=28;i <32;i++)
{
x[i]=(unsigned char)(m3>>8*(i-28));
}
//read text to Table
FILE *fp = 0;
unsigned char Table[256][256]={0};
    fp=fopen(TEST_FILE_NAME,"rb");
if(fp==NULL)
{
printf("Sorry you give the wrong file name\n");
return 0;
}
fseek(fp,0L,SEEK_SET);

for(i=0;i <256;i++ )
{for(j=0;j <256;j++)
        fscanf(fp,"%x",&Table[i][j]);
        }
fclose(fp);
//get f[4]
for(l=0;l <4;l++)
{
//get random coefficient
srand(unsigned (time(NULL)));
for(i=0;i <N;i++)
{j=0;
  while(j <M)
  {
a[i][j]=rand()%0xff;
    j++;
  }
}
for(i=0;i <M;i++)
{
c[i]=rand()%0xff;
}
d=rand()%0xff;
//comput f[l]
for(i=0;i <32;i++)
{ for(j=0;j <32;j++)
{f[l]=Table[a[i][j]][x[i]];
  f[l]=Table[f[l]][x[j]];
}

for(i=0;i <32;i++)
{f[l]^=Table[c[i]][x[i]];
}
f[l]^=d;
}
b=(f[0] < <24)|(f[1] < <16)|(f[2] < <8)|f[3];
return b;
}

//Step Function
void Step_Function(UINT A,UINT B,UINT C,UINT D,UINT m0,UINT m1,UINT m2,UINT m3)
{
unsigned int V[4],temp[4];
unsigned int m[4];
int c[4]={0},i;
V[0]=A;
    V[1]=B;
V[2]=C;
V[3]=D;
m[0]=m0;
m[1]=m1;
m[2]=m2;
m[3]=m3;
    for(i=0;i <4;i++)
    {
temp[i]=V[i]^m[i];
c[i]=Ham_Wei_Function(temp[i]);
}
for(i=0;i <4;i++)
{
switch(c[i]%4)

{case 0: V[i]=g(temp[i],A,C);
    V[i]=Multivariate_Function(V[0],V[1],V[2],V[3],m[0],m[1],m[2],m[3]);
break;
case 1:  V[i]=h(temp[i],B,C);
    V[i]=l(V[i]);
break;
case 2:  V[i]=m(V[i],A,B,C);
    V[i]=Multivariate_Function(V[0],V[1],V[2],V[3],m[0],m[1],m[2],m[3]);
            break;
case 3:  V[i]=p(V[i],B,D);
    V[i]=q(V[i],A,D);
                break;
}
}
PHT(V[0],V[1],V[2],V[3]);
    PHT(V[0],V[3],V[1],V[2]);
    PHT(V[1],V[2],V[0],V[3]);
    PHT(V[2],V[3],V[1],V[0]);
}
unsigned int Compression_Function(UINT *CV,UINT *Mes)
{
unsigned int V1[4],V2[4],V3[4],V4[4],M2[16],M3[16],M4[16],cv[4],M[16];
int i;
    cv=&CV;
M=&Mes;
for(i=0;i <4;i++)
{
V1[i]=cv[i];
}
for(i=0;i <4;i++)
{
V2[i]=cv[i];
}
    for(i=0;i <4;i++)
{
V3[i]=cv[i];
}
for(i=0;i <4;i++)
{
V4[i]=cv[i];
}
 

//Branch1(CV,M[16])
//STEP 1
Step_Function(V1[0],V1[1],V1[2],V1[3],M[0],M[1],M[2],M[3]);
//STEP 2
    Step_Function(V1[0],V1[1],V1[2],V1[3],M[4],M[5],M[6],M[7]);
//STEP 3
    Step_Function(V1[0],V1[1],V1[2],V1[3],M[8],M[9],M[10],M[11]);
//STEP 4
    Step_Function(V1[0],V1[1],V1[2],V1[3],M[12],M[13],M[14],M[15]);
    //Branch2(CV,M2[16])
for(i=0;i <16;i++)
{
M2[i]=~M[i];
}
//STEP 1
    Step_Function(V2[0],V2[1],V2[2],V2[3],M2[0],M2[1],M2[2],M2[3]);
//STEP 2
    Step_Function(V2[0],V2[1],V2[2],V2[3],M2[4],M2[5],M2[6],M2[7]);
//STEP 3
    Step_Function(V2[0],V2[1],V2[2],V2[3],M2[8],M2[9],M2[10],M2[11]);
//STEP 4
    Step_Function(V2[0],V2[1],V2[2],V2[3],M2[12],M2[13],M2[14],M2[15]);
//Branch3(CV,M3[16])
for(i=0;i <16;i++)
{ M3[i]=M[15-i];
}
//STEP 1
    Step_Function(V3[0],V3[1],V3[2],V3[3],M3[0],M3[1],M3[2],M3[3]);
//STEP 2
    Step_Function(V3[0],V3[1],V3[2],V3[3],M3[4],M3[5],M3[6],M3[7]);
//STEP 3
    Step_Function(V3[0],V3[1],V3[2],V3[3],M3[8],M3[9],M3[10],M3[11]);
//STEP 4
    Step_Function(V3[0],V3[1],V3[2],V3[3],M3[12],M3[13],M3[14],M3[15]);
//Branch4(CV,M[16])
for(i=0;i <16;i++)
{ M4[i]=M[i]+delta[i];
}
//STEP 1
    Step_Function(V4[0],V4[1],V4[2],V4[3],M4[0],M4[1],M4[2],M4[3]);
    //STEP 2
    Step_Function(V4[0],V4[1],V4[2],V4[3],M4[4],M4[5],M4[6],M4[7]);
//STEP 3
    Step_Function(V4[0],V4[1],V4[2],V4[3],M4[8],M4[9],M4[10],M4[11]);
//STEP 4
    Step_Function(V4[0],V4[1],V4[2],V4[3],M4[12],M4[13],M4[14],M4[15]);
//output
CV[0]=CV[0]^((V1[0]^V2[0])+(V3[0]^V4[0]));
    CV[1]=CV[1]^((V1[1]^V2[1])+(V3[1]^V4[1]));
    CV[2]=CV[2]^((V1[2]^V2[2])+(V3[2]^V4[2]));
    CV[3]=CV[3]^((V1[3]^V2[3])+(V3[3]^V4[3]));
return *cv;
}
void main()
{ int i;
  UINT h[4];
  UINT Message[16]={0x4105ba8c,0xd8423ce8,0xac484680,0x07ee1d40,0xbc18d07a,0x89fc027c,0x5ee37091,0xcd1824f0,
                    0x878de230,0xdbbaf0fc,0xda7e4408,0xc6c05bc0,0x33065020,0x80000000,0x1a000000,0x00000000};
  UINT CV[4]={0x01234567,0x89abcdef,0xfedcba98,0x76543210};
h[4]=Compression_Function(CV,Message);
  for(i=0;i <4;i++)
  cout < <"0x" < <setfill('0') < <setw(8) < <hex < <h[i] < <" ";
  cout < <endl;
  return 0;
}

#5


void main()  return 0 这个我已经改了,去掉了void.
Ham_Wei_Function 有返回值是 return c;

Multivariate_Function 有返回值是 return b;

#6


char Ham_Wei_Function() 

char Multivariate_Function ()

加上函数返回类型

#7


unsigned int Ham_Wei_Function(UINT x)
unsigned int Multivariate_Function
UINT Compression_Function(UINT *CV,UINT *Mes)
int main()
 return 0;
这是我改了的,可是还有错啊
error C2601: 'Step_Function' : local function definitions are illegal
error C2601: 'Compression_Function' : local function definitions are illegal
error C2601: 'main' : local function definitions are illegal
fatal error C1004: unexpected end of file found
执行 cl.exe 时出错.

#8


你的Multivariate_Function丢了个},你查查在哪里丢的
还有<<中间的空格去掉

#9


cv=&CV;
这个也不对

#10


程序的成功  =  40%汗水 +  60%良好的代码风格

#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iomanip.h>
#include <ctime>
typedef unsigned int UINT;
#define TEST_FILE_NAME "D:\\multilist.txt"
//Delta Values
UINT delta[16]={0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4
,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174};
//n_bit Left Rotation
#define ROTR(x,n) ((x < <n)|(x>>(32-n)))
//The First Group Functions
#define g(x,a,c) ((~x)^(a&c))
//The Second Group Functions
#define h(x,b,c) ((x&b)^(x|(~c)))
#define l(x)  (x^(ROTR(x,15))^(ROTR(x,27)))
//The Third Group Functions
#define m(x,a,b,c) ((x&a)+(x&b)^(x&c))
//The Fourth Group Functions
#define p(x,b,d) ((x)^(b)^(d))
#define q(x,a,d) ((x&d)^((ROTR(a,7))+(ROTR(x,25))))
#define M 32
#define N 32
//Pseudo Hadamard Layer
#define PHT(A,B,C,D) B+=A;\
D+=C;\
A+=B;\
C+=D;


//Hamming Weight Function
Ham_Wei_Function(UINT x)
{
unsigned int v;
unsigned int c;
v=x;
for(c=0;v;v>>=1)
{
c+=v&1;
}
return c;
}
Multivariate_Function(unsigned int v0,unsigned int v1,unsigned int v2,unsigned int v3,unsigned int m0,unsigned int m1,unsigned int m2,unsigned int m3)
{
unsigned int x[32],a[N][M],c[M],d,f[4],b;
int i,j,l;
//get 32 variate
for(i=0;i <4;i++)
{
x[i]=(unsigned char)(v0>>8*i);
}
for(i=4;i <8;i++)
{
x[i]=(unsigned char)(v1>>8*(i-4));
}
for(i=8;i <12;i++)
{
x[i]=(unsigned char)(v2>>8*(i-8));
}
for(i=12;i <16;i++)
{
x[i]=(unsigned char)(v3>>8*(i-12));
}
for(i=16;i <20;i++)
{
x[i]=(unsigned char)(m0>>8*(i-16));
}
for(i=20;i <24;i++)
{
x[i]=(unsigned char)(m1>>8*(i-20));
}
for(i=24;i <28;i++)
{
x[i]=(unsigned char)(m2>>8*(i-24));
}
for(i=28;i <32;i++)
{
x[i]=(unsigned char)(m3>>8*(i-28));
}
//read text to Table
FILE *fp = 0;
unsigned char Table[256][256]={0};
fp=fopen(TEST_FILE_NAME,"rb");
if(fp==NULL)
{
printf("Sorry you give the wrong file name\n");
return 0;
}
fseek(fp,0L,SEEK_SET);

for(i=0;i <256;i++ )
{for(j=0;j <256;j++)
fscanf(fp,"%x",&Table[i][j]);
}
fclose(fp);
//get f[4]
for(l=0;l <4;l++)
{
//get random coefficient
srand(unsigned (time(NULL)));
for(i=0;i <N;i++)
{j=0;
while(j <M)
{
a[i][j]=rand()%0xff;
j++;
}
}
for(i=0;i <M;i++)
{
c[i]=rand()%0xff;
}
d=rand()%0xff;
//comput f[l]
for(i=0;i <32;i++)
{ for(j=0;j <32;j++)
{f[l]=Table[a[i][j]][x[i]];
f[l]=Table[f[l]][x[j]];
}

for(i=0;i <32;i++)
{f[l]^=Table[c[i]][x[i]];
}
f[l]^=d;
}
b=(f[0] < <24)|(f[1] < <16)|(f[2] < <8)|f[3];
return b;
}

//Step Function
void Step_Function(UINT A,UINT B,UINT C,UINT D,UINT m0,UINT m1,UINT m2,UINT m3)
{
unsigned int V[4],temp[4];
unsigned int m[4];
int c[4]={0},i;
V[0]=A;
V[1]=B;
V[2]=C;
V[3]=D;
m[0]=m0;
m[1]=m1;
m[2]=m2;
m[3]=m3;
for(i=0;i <4;i++)
{
temp[i]=V[i]^m[i];
c[i]=Ham_Wei_Function(temp[i]);
}
for(i=0;i <4;i++)
{
switch(c[i]%4)

{case 0: V[i]=g(temp[i],A,C);
V[i]=Multivariate_Function(V[0],V[1],V[2],V[3],m[0],m[1],m[2],m[3]);
break;
case 1:  V[i]=h(temp[i],B,C);
V[i]=l(V[i]);
break;
case 2:  V[i]=m(V[i],A,B,C);
V[i]=Multivariate_Function(V[0],V[1],V[2],V[3],m[0],m[1],m[2],m[3]);
break;
case 3:  V[i]=p(V[i],B,D);
V[i]=q(V[i],A,D);
break;
}
}
PHT(V[0],V[1],V[2],V[3]);
PHT(V[0],V[3],V[1],V[2]);
PHT(V[1],V[2],V[0],V[3]);
PHT(V[2],V[3],V[1],V[0]);
}
unsigned int Compression_Function(UINT *CV,UINT *Mes)
{
unsigned int V1[4],V2[4],V3[4],V4[4],M2[16],M3[16],M4[16],cv[4],M[16];
int i;
cv=&CV;
M=&Mes;
for(i=0;i <4;i++)
{
V1[i]=cv[i];
}
for(i=0;i <4;i++)
{
V2[i]=cv[i];
}
for(i=0;i <4;i++)
{
V3[i]=cv[i];
}
for(i=0;i <4;i++)
{
V4[i]=cv[i];
}


//Branch1(CV,M[16])
//STEP 1
Step_Function(V1[0],V1[1],V1[2],V1[3],M[0],M[1],M[2],M[3]);
//STEP 2
Step_Function(V1[0],V1[1],V1[2],V1[3],M[4],M[5],M[6],M[7]);
//STEP 3
Step_Function(V1[0],V1[1],V1[2],V1[3],M[8],M[9],M[10],M[11]);
//STEP 4
Step_Function(V1[0],V1[1],V1[2],V1[3],M[12],M[13],M[14],M[15]);
//Branch2(CV,M2[16])
for(i=0;i <16;i++)
{
M2[i]=~M[i];
}
//STEP 1
Step_Function(V2[0],V2[1],V2[2],V2[3],M2[0],M2[1],M2[2],M2[3]);
//STEP 2
Step_Function(V2[0],V2[1],V2[2],V2[3],M2[4],M2[5],M2[6],M2[7]);
//STEP 3
Step_Function(V2[0],V2[1],V2[2],V2[3],M2[8],M2[9],M2[10],M2[11]);
//STEP 4
Step_Function(V2[0],V2[1],V2[2],V2[3],M2[12],M2[13],M2[14],M2[15]);
//Branch3(CV,M3[16])
for(i=0;i <16;i++)
{ M3[i]=M[15-i];
}
//STEP 1
Step_Function(V3[0],V3[1],V3[2],V3[3],M3[0],M3[1],M3[2],M3[3]);
//STEP 2
Step_Function(V3[0],V3[1],V3[2],V3[3],M3[4],M3[5],M3[6],M3[7]);
//STEP 3
Step_Function(V3[0],V3[1],V3[2],V3[3],M3[8],M3[9],M3[10],M3[11]);
//STEP 4
Step_Function(V3[0],V3[1],V3[2],V3[3],M3[12],M3[13],M3[14],M3[15]);
//Branch4(CV,M[16])
for(i=0;i <16;i++)
{ M4[i]=M[i]+delta[i];
}
//STEP 1
Step_Function(V4[0],V4[1],V4[2],V4[3],M4[0],M4[1],M4[2],M4[3]);
//STEP 2
Step_Function(V4[0],V4[1],V4[2],V4[3],M4[4],M4[5],M4[6],M4[7]);
//STEP 3
Step_Function(V4[0],V4[1],V4[2],V4[3],M4[8],M4[9],M4[10],M4[11]);
//STEP 4
Step_Function(V4[0],V4[1],V4[2],V4[3],M4[12],M4[13],M4[14],M4[15]);
//output
CV[0]=CV[0]^((V1[0]^V2[0])+(V3[0]^V4[0]));
CV[1]=CV[1]^((V1[1]^V2[1])+(V3[1]^V4[1]));
CV[2]=CV[2]^((V1[2]^V2[2])+(V3[2]^V4[2]));
CV[3]=CV[3]^((V1[3]^V2[3])+(V3[3]^V4[3]));
return *cv;
}
void main()
{ int i;
UINT h[4];
UINT Message[16]={0x4105ba8c,0xd8423ce8,0xac484680,0x07ee1d40,0xbc18d07a,0x89fc027c,0x5ee37091,0xcd1824f0,
0x878de230,0xdbbaf0fc,0xda7e4408,0xc6c05bc0,0x33065020,0x80000000,0x1a000000,0x00000000};
UINT CV[4]={0x01234567,0x89abcdef,0xfedcba98,0x76543210};
h[4]=Compression_Function(CV,Message);
for(i=0;i <4;i++)
cout < <"0x" < <setfill('0') < <setw(8) < <hex < <h[i] < <" ";
cout < <endl;
return 0;
}

#11


同理,M=&Mes;也不对

#12


汗个。。。格式化后才发现有好多的{}是不匹配的。。。

#13


可是我的返回值c,b类型都是unsigned int啊

#14



1 我用的是vs2005,里面可能对M宏定义了,所以我把你的M都改成了MM
2 你传递数组那是没办法那样赋值的,只有字符数组才可以
3 风格很乱,返回值之类的有问题



#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <iomanip>
#include <ctime>
typedef unsigned int UINT;
using namespace std;
#define TEST_FILE_NAME "D:\\multilist.txt"
//Delta Values
UINT delta[16]={0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4
,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174};
//n_bit Left Rotation
#define ROTR(x,n) ((x <<n)|(x>>(32-n)))
//The First Group Functions
#define g(x,a,c) ((~x)^(a&c))
//The Second Group Functions
#define h(x,b,c) ((x&b)^(x|(~c)))
#define l(x)  (x^(ROTR(x,15))^(ROTR(x,27)))
//The Third Group Functions
#define m(x,a,b,c) ((x&a)+(x&b)^(x&c))
//The Fourth Group Functions
#define p(x,b,d) ((x)^(b)^(d))
#define q(x,a,d) ((x&d)^((ROTR(a,7))+(ROTR(x,25))))
#define M 32
#define N 32
//Pseudo Hadamard Layer
#define PHT(A,B,C,D) B+=A;\
D+=C;\
A+=B;\
C+=D;


//Hamming Weight Function
unsigned int Ham_Wei_Function(UINT x)
{
unsigned int v;
unsigned int c;
v=x;
for(c=0;v;v>>=1)
{
c+=v&1;
}
return c;
}
unsigned int Multivariate_Function(unsigned int v0,unsigned int v1,unsigned int v2,unsigned int v3,unsigned int m0,unsigned int m1,unsigned int m2,unsigned int m3)
{
unsigned int x[32],a[N][M],c[M],d,f[4],b;
int i,j,l;
//get 32 variate
for(i=0;i <4;i++)
{
x[i]=(unsigned char)(v0>>8*i);
}
for(i=4;i <8;i++)
{
x[i]=(unsigned char)(v1>>8*(i-4));
}
for(i=8;i <12;i++)
{
x[i]=(unsigned char)(v2>>8*(i-8));
}
for(i=12;i <16;i++)
{
x[i]=(unsigned char)(v3>>8*(i-12));
}
for(i=16;i <20;i++)
{
x[i]=(unsigned char)(m0>>8*(i-16));
}
for(i=20;i <24;i++)
{
x[i]=(unsigned char)(m1>>8*(i-20));
}
for(i=24;i <28;i++)
{
x[i]=(unsigned char)(m2>>8*(i-24));
}
for(i=28;i <32;i++)
{
x[i]=(unsigned char)(m3>>8*(i-28));
}
//read text to Table
FILE *fp = 0;
unsigned char Table[256][256]={0};
fp=fopen(TEST_FILE_NAME,"rb");
if(fp==NULL)
{
printf("Sorry you give the wrong file name\n");
return 0;
}
fseek(fp,0L,SEEK_SET);

for(i=0;i <256;i++ )
{for(j=0;j <256;j++)
fscanf(fp,"%x",&Table[i][j]);
}
fclose(fp);
//get f[4]
for(l=0;l <4;l++)
{
//get random coefficient
srand(unsigned (time(NULL)));
for(i=0;i <N;i++)
{j=0;
while(j <M)
{
a[i][j]=rand()%0xff;
j++;
}
}
for(i=0;i <M;i++)
{
c[i]=rand()%0xff;
}
d=rand()%0xff;
//comput f[l]
for(i=0;i <32;i++)
{ for(j=0;j <32;j++)
{f[l]=Table[a[i][j]][x[i]];
f[l]=Table[f[l]][x[j]];
}

for(i=0;i <32;i++)
{f[l]^=Table[c[i]][x[i]];
}
f[l]^=d;
}
b=(f[0] <<24)|(f[1] <<16)|(f[2] <<8)|f[3];
return b;
}
}
//Step Function
void Step_Function(UINT A,UINT B,UINT C,UINT D,UINT m0,UINT m1,UINT m2,UINT m3)
{
unsigned int V[4],temp[4];
unsigned int m[4];
int c[4]={0},i;
V[0]=A;
V[1]=B;
V[2]=C;
V[3]=D;
m[0]=m0;
m[1]=m1;
m[2]=m2;
m[3]=m3;
for(i=0;i <4;i++)
{
temp[i]=V[i]^m[i];
c[i]=Ham_Wei_Function(temp[i]);
}
for(i=0;i <4;i++)
{
switch(c[i]%4)
{
case 0: 
V[i]=g(temp[i],A,C);
V[i]=Multivariate_Function(V[0],V[1],V[2],V[3],m[0],m[1],m[2],m[3]);
break;
case 1:  
V[i]=h(temp[i],B,C);
V[i]=l(V[i]);
break;
case 2:  
V[i]=m(V[i],A,B,C);
V[i]=Multivariate_Function(V[0],V[1],V[2],V[3],m[0],m[1],m[2],m[3]);
break;
case 3:  
V[i]=p(V[i],B,D);
V[i]=q(V[i],A,D);
break;
}
}
PHT(V[0],V[1],V[2],V[3]);
PHT(V[0],V[3],V[1],V[2]);
PHT(V[1],V[2],V[0],V[3]);
PHT(V[2],V[3],V[1],V[0]);
}
unsigned int Compression_Function(UINT *CV,UINT cvLen, UINT *Mes, UINT mesLen)
{
        unsigned int V1[4],V2[4],V3[4],V4[4],M2[16],M3[16],M4[16],cv[4],MM[16];
int i;
for (UINT ui = 0; ui < cvLen; ui++)
{
cv[ui] = CV[ui];
}
for (UINT ui = 0; ui < mesLen; ui++)
{
MM[ui] = Mes[ui];
}
for(i=0;i <4;i++)
{
V1[i]=cv[i];
}
for(i=0;i <4;i++)
{
V2[i]=cv[i];
}
for(i=0;i <4;i++)
{
V3[i]=cv[i];
}
for(i=0;i <4;i++)
{
V4[i]=cv[i];
}


//Branch1(CV,M[16])
//STEP 1
Step_Function(V1[0],V1[1],V1[2],V1[3],MM[0],MM[1],MM[2],MM[3]);
//STEP 2
Step_Function(V1[0],V1[1],V1[2],V1[3],MM[4],MM[5],MM[6],MM[7]);
//STEP 3
Step_Function(V1[0],V1[1],V1[2],V1[3],MM[8],MM[9],MM[10],MM[11]);
//STEP 4
Step_Function(V1[0],V1[1],V1[2],V1[3],MM[12],MM[13],MM[14],MM[15]);
//Branch2(CV,M2[16])
for(i=0;i <16;i++)
{
M2[i]=~MM[i];
}
//STEP 1
Step_Function(V2[0],V2[1],V2[2],V2[3],M2[0],M2[1],M2[2],M2[3]);
//STEP 2
Step_Function(V2[0],V2[1],V2[2],V2[3],M2[4],M2[5],M2[6],M2[7]);
//STEP 3
Step_Function(V2[0],V2[1],V2[2],V2[3],M2[8],M2[9],M2[10],M2[11]);
//STEP 4
Step_Function(V2[0],V2[1],V2[2],V2[3],M2[12],M2[13],M2[14],M2[15]);
//Branch3(CV,M3[16])
for(i=0;i <16;i++)
{ M3[i]=MM[15-i];
}
//STEP 1
Step_Function(V3[0],V3[1],V3[2],V3[3],M3[0],M3[1],M3[2],M3[3]);
//STEP 2
Step_Function(V3[0],V3[1],V3[2],V3[3],M3[4],M3[5],M3[6],M3[7]);
//STEP 3
Step_Function(V3[0],V3[1],V3[2],V3[3],M3[8],M3[9],M3[10],M3[11]);
//STEP 4
Step_Function(V3[0],V3[1],V3[2],V3[3],M3[12],M3[13],M3[14],M3[15]);
//Branch4(CV,M[16])
for(i=0;i <16;i++)
{ M4[i]=MM[i]+delta[i];
}
//STEP 1
Step_Function(V4[0],V4[1],V4[2],V4[3],M4[0],M4[1],M4[2],M4[3]);
//STEP 2
Step_Function(V4[0],V4[1],V4[2],V4[3],M4[4],M4[5],M4[6],M4[7]);
//STEP 3
Step_Function(V4[0],V4[1],V4[2],V4[3],M4[8],M4[9],M4[10],M4[11]);
//STEP 4
Step_Function(V4[0],V4[1],V4[2],V4[3],M4[12],M4[13],M4[14],M4[15]);
//output
CV[0]=CV[0]^((V1[0]^V2[0])+(V3[0]^V4[0]));
CV[1]=CV[1]^((V1[1]^V2[1])+(V3[1]^V4[1]));
CV[2]=CV[2]^((V1[2]^V2[2])+(V3[2]^V4[2]));
CV[3]=CV[3]^((V1[3]^V2[3])+(V3[3]^V4[3]));
return *cv;
}
void main()

int i;
UINT h[4];
UINT Message[16]={0x4105ba8c,0xd8423ce8,0xac484680,0x07ee1d40,0xbc18d07a,0x89fc027c,0x5ee37091,0xcd1824f0,
0x878de230,0xdbbaf0fc,0xda7e4408,0xc6c05bc0,0x33065020,0x80000000,0x1a000000,0x00000000};
UINT CV[4]={0x01234567,0x89abcdef,0xfedcba98,0x76543210};
h[4]=Compression_Function(CV,4,Message,16);
for(i=0;i <4;i++)
cout <<"0x" <<setfill('0') <<setw(8) <<hex <<h[i] <<" ";
cout <<endl;
return ;
}


#15


错误如下
1.Step_Function函数定义前加个“}”, 上一个函数的大括号没匹配
2.函数定义的返回值类型和实际返回值类型不一致。这个很多,不一一说了。注意C++中函数必须有返回值,哪怕是void
3.变量重名的问题, M既是个宏,又是个int数组,还有CV, Mes也重定义了
4.不知所云的操作,如cv=&CV; 

改完这些编译通过了,但运行还有错误。不清楚你的程序要干嘛,因此懒得调了

PS:LZ应该属于编程还没入门。建议你多从小处着眼,注意代码风格和命名规则。很多是后,变量取个又意义的名字就不可能出现那个bug

#16


#define ROTR(x,n) ((x < <n)|(x>>(32-n)))中的那个空格真恶心,害我找了半天,都快信不着编译器了

#17


我刚才根据你给我改的,我改了,确实编译通过了,但是运行有错误啊。我是VC++6.0.
我是新手,所以麻烦大家了。我在看看怎么给你们分啊。太感谢你们了

#18


大家现在按14楼的帖子中的程序帮我看看还是什么错误啊