while(i<4*(Nr+1))//生成后几个字
{
for(j=0;j<4;j++)
temp[j]=w[j][i-1];
if(i%Nk==0)
{
tp=temp[0];
temp[0]=temp[1];
temp[1]=temp[2];
temp[2]=temp[3];
temp[3]=tp;
for(j=0;j<4;j++)
temp[j]=SBox[(temp[j]>>4)&0x0F][temp[j]&0x0F];
x=Rc[i/Nk];
temp[0]=temp[0]^x;
}
else
if(Nk>6&&(i%Nk==4))
for(j=0;j<4;j++)
temp[j]=SBox[(temp[j]>>4)&0x0F][temp[j]&0x0F];
for(j=0;j<4;j++)
w[j][i]=(w[j][i-Nk])^temp[j];
i++;
}
for(int k=0;k<=Nr;k++)//实现密钥的每16个字节为一个矩阵的矩阵转置(对字符串加密/解密有影响)
for(i=0;i<3;i++)
{
x=4*k;
for(j=i+1;j<4;j++)
{
tp=w[i][x+j];
w[i][x+j]=w[j][x+i];
w[j][x+i]=tp;
}
}
}
void CAES::InvShiftRows()//循环右移函数(0000000000)
{
BYTE4 temp[4];
for (int r = 0; r < 4; ++r)
{
for (int c = 0; c < 4; ++c)
{
temp[r].w[c] = this->State[r][c];
}
}
for (r = 1; r < 4; ++r)
{
for (int c = 0; c < 4; ++c)
{
this->State[r][ (c + r) % 4 ] = temp[r].w[c];
}
}
}
void CAES::InvSubBytes()//利用逆S盒InvSBox实现逆字节代替变换
{
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
State[i][j]=InvSBox[(State[i][j]>>4)&0x0F][State[i][j]&0x0F];
}
void CAES::InvMixColumns()
{
BYTE4 temp[4];
for (int r = 0; r < 4; ++r)
{
for (int c = 0; c < 4; ++c)
{
temp[r].w[c] = this->State[r][c];
}
}
for (int c = 0; c < 4; ++c)
{
this->State[0][c] = (BYTE) (
(int)GfCalc(temp[0].w[c],MODE0e) ^
(int)GfCalc(temp[1].w[c],MODE0b) ^
(int)GfCalc(temp[2].w[c],MODE0d) ^
(int)GfCalc(temp[3].w[c],MODE09) );
this->State[1][c] = (BYTE) (
(int)GfCalc(temp[0].w[c],MODE09) ^
(int)GfCalc(temp[1].w[c],MODE0e) ^
(int)GfCalc(temp[2].w[c],MODE0b) ^
(int)GfCalc(temp[3].w[c],MODE0d) );
this->State[2][c] = (BYTE) (
(int)GfCalc(temp[0].w[c],MODE0d) ^
(int)GfCalc(temp[1].w[c],
上一篇:
adxDlg.cpp
下一篇:
汽车电控发动机故障检测方法探究