匿名结构不在命名类型内
Anonymous struct not inside named type
我在使用 DES 算法时遇到了问题。如何解决?
(我正在使用 DevC++ v5.11)
我不是很明白什么是DES。我应该 do/try 做什么?
// Triple DES (3DES)
void DES::inital_key(const char key[64],char ekey[16][48],bool is_crypt)
{
union{ //Error here
char pkey[56];
struct{char l[28],r[28];};
};
permute(key,pkey,_DES::perm1,56);
for(uint n=0; n<16; n++) {
lshift(l,_DES::sc[n]);
lshift(r,_DES::sc[n]);
permute(pkey,ekey[is_crypt?n:15-n],_DES::perm2,48);
}
}
/////////////////////////////////////////////////////////////////////////////
void DES::work(const char in[64],char out[64],const char key[64],bool is_crypt)
{
char ekey[16][48];
union{ //And here
char pin[64];
struct{char l[32],r[32];};
};
inital_key(key,ekey,is_crypt);
permute(in,pin,_DES::perm3,64);
for(uint n=0; n<16;) round(l,r,ekey[n++]),round(r,l,ekey[n++]);
permute(pin,out,_DES::perm6,64);
}
此代码依赖于a Microsoft extension。
你的编译器 GCC 不理解它。
除非将其设为标准 C++ 或切换编译器,否则不能使用此代码。
您在未命名的 union
中声明了匿名的 struct
,就像编译器错误所说的那样。您需要为 union
分配名称(为了便于携带,您也应该命名 struct
):
void DES::inital_key(const char key[64], char ekey[16][48], bool is_crypt)
{
union {
char pkey[56];
struct { char l[28], r[28]; } s;
} u;
permute(key, u.pkey, _DES::perm1, 56);
for(uint n = 0; n < 16; n++) {
lshift(u.s.l, _DES::sc[n]);
lshift(u.s.r, _DES::sc[n]);
permute(u.pkey, ekey[is_crypt ? n : 15-n], _DES::perm2, 48);
}
}
void DES::work(const char in[64], char out[64], const char key[64], bool is_crypt)
{
char ekey[16][48];
union {
char pin[64];
struct { char l[32], r[32]; } s;
} u;
inital_key(key, ekey, is_crypt);
permute(in, u.pin, _DES::perm3, 64);
for(uint n = 0; n < 16;) round(u.s.l, u.s.r, ekey[n++]), round(u.s.r, u.s.l, ekey[n++]);
permute(u.pin, out, _DES::perm6, 64);
}
我在使用 DES 算法时遇到了问题。如何解决?
(我正在使用 DevC++ v5.11)
我不是很明白什么是DES。我应该 do/try 做什么?
// Triple DES (3DES)
void DES::inital_key(const char key[64],char ekey[16][48],bool is_crypt)
{
union{ //Error here
char pkey[56];
struct{char l[28],r[28];};
};
permute(key,pkey,_DES::perm1,56);
for(uint n=0; n<16; n++) {
lshift(l,_DES::sc[n]);
lshift(r,_DES::sc[n]);
permute(pkey,ekey[is_crypt?n:15-n],_DES::perm2,48);
}
}
/////////////////////////////////////////////////////////////////////////////
void DES::work(const char in[64],char out[64],const char key[64],bool is_crypt)
{
char ekey[16][48];
union{ //And here
char pin[64];
struct{char l[32],r[32];};
};
inital_key(key,ekey,is_crypt);
permute(in,pin,_DES::perm3,64);
for(uint n=0; n<16;) round(l,r,ekey[n++]),round(r,l,ekey[n++]);
permute(pin,out,_DES::perm6,64);
}
此代码依赖于a Microsoft extension。
你的编译器 GCC 不理解它。
除非将其设为标准 C++ 或切换编译器,否则不能使用此代码。
您在未命名的 union
中声明了匿名的 struct
,就像编译器错误所说的那样。您需要为 union
分配名称(为了便于携带,您也应该命名 struct
):
void DES::inital_key(const char key[64], char ekey[16][48], bool is_crypt)
{
union {
char pkey[56];
struct { char l[28], r[28]; } s;
} u;
permute(key, u.pkey, _DES::perm1, 56);
for(uint n = 0; n < 16; n++) {
lshift(u.s.l, _DES::sc[n]);
lshift(u.s.r, _DES::sc[n]);
permute(u.pkey, ekey[is_crypt ? n : 15-n], _DES::perm2, 48);
}
}
void DES::work(const char in[64], char out[64], const char key[64], bool is_crypt)
{
char ekey[16][48];
union {
char pin[64];
struct { char l[32], r[32]; } s;
} u;
inital_key(key, ekey, is_crypt);
permute(in, u.pin, _DES::perm3, 64);
for(uint n = 0; n < 16;) round(u.s.l, u.s.r, ekey[n++]), round(u.s.r, u.s.l, ekey[n++]);
permute(u.pin, out, _DES::perm6, 64);
}