📄 aes.cpp
字号:
void Aes::invByteSub(Block *pBlk)
{
int i;
for(i = 0; i < BLK_SIZE; i++)
{
pBlk->blkByte[i] = SBoxInv[pBlk->blkByte[i]];
}
}
/**************************
* FUNCTION: shiftRow
*
* PARAMETERS:
*
* DESCRIPTION:
**************************/
void Aes::shiftRow(Block *pBlk)
{
Block tmp;
tmp.blkByte[0] = pBlk->blkByte[0];
tmp.blkByte[1] = pBlk->blkByte[5];
tmp.blkByte[2] = pBlk->blkByte[10];
tmp.blkByte[3] = pBlk->blkByte[15];
tmp.blkByte[4] = pBlk->blkByte[4];
tmp.blkByte[5] = pBlk->blkByte[9];
tmp.blkByte[6] = pBlk->blkByte[14];
tmp.blkByte[7] = pBlk->blkByte[3];
tmp.blkByte[8] = pBlk->blkByte[8];
tmp.blkByte[9] = pBlk->blkByte[13];
tmp.blkByte[10] = pBlk->blkByte[2];
tmp.blkByte[11] = pBlk->blkByte[7];
tmp.blkByte[12] = pBlk->blkByte[12];
tmp.blkByte[13] = pBlk->blkByte[1];
tmp.blkByte[14] = pBlk->blkByte[6];
tmp.blkByte[15] = pBlk->blkByte[11];
memcpy(pBlk, &tmp, sizeof(Block));
}
/**************************
* FUNCTION: invShiftRow
*
* PARAMETERS:
*
* DESCRIPTION:
**************************/
void Aes::invShiftRow(Block *pBlk)
{
Block tmp;
tmp.blkByte[0] = pBlk->blkByte[0];
tmp.blkByte[1] = pBlk->blkByte[13];
tmp.blkByte[2] = pBlk->blkByte[10];
tmp.blkByte[3] = pBlk->blkByte[7];
tmp.blkByte[4] = pBlk->blkByte[4];
tmp.blkByte[5] = pBlk->blkByte[1];
tmp.blkByte[6] = pBlk->blkByte[14];
tmp.blkByte[7] = pBlk->blkByte[11];
tmp.blkByte[8] = pBlk->blkByte[8];
tmp.blkByte[9] = pBlk->blkByte[5];
tmp.blkByte[10] = pBlk->blkByte[2];
tmp.blkByte[11] = pBlk->blkByte[15];
tmp.blkByte[12] = pBlk->blkByte[12];
tmp.blkByte[13] = pBlk->blkByte[9];
tmp.blkByte[14] = pBlk->blkByte[6];
tmp.blkByte[15] = pBlk->blkByte[3];
memcpy(pBlk, &tmp, sizeof(Block));
}
/**************************
* FUNCTION: mixColumn
*
* PARAMETERS:
*
* DESCRIPTION:
**************************/
void Aes::mixColumn(Block *pBlk)
{
Block tmp;
int i;
for(i = 0; i < 4; i++)
{
tmp.blkByte[i*4] = f2(pBlk->blkByte[4*i]) ^ f3(pBlk->blkByte[4*i+1]) ^
pBlk->blkByte[4*i+2] ^ pBlk->blkByte[4*i+3];
tmp.blkByte[i*4+1] = pBlk->blkByte[4*i] ^ f2(pBlk->blkByte[4*i+1]) ^
f3(pBlk->blkByte[4*i+2]) ^ pBlk->blkByte[4*i+3];
tmp.blkByte[i*4+2] = pBlk->blkByte[4*i] ^ pBlk->blkByte[4*i+1] ^
f2(pBlk->blkByte[4*i+2]) ^ f3(pBlk->blkByte[4*i+3]);
tmp.blkByte[i*4+3] = f3(pBlk->blkByte[4*i]) ^ pBlk->blkByte[4*i+1] ^
pBlk->blkByte[4*i+2] ^ f2(pBlk->blkByte[4*i+3]);
}
memcpy(pBlk, &tmp, sizeof(Block));
}
/**************************
* FUNCTION: invMixColumn
*
* PARAMETERS:
*
* DESCRIPTION:
**************************/
void Aes::invMixColumn(Block *pBlk)
{
Block tmp;
int i;
for(i = 0; i < 4; i++)
{
tmp.blkByte[4*i] = fe(pBlk->blkByte[4*i]) ^ fb(pBlk->blkByte[4*i+1]) ^
fd(pBlk->blkByte[4*i+2]) ^ f9(pBlk->blkByte[4*i+3]);
tmp.blkByte[4*i+1] = f9(pBlk->blkByte[4*i]) ^ fe(pBlk->blkByte[4*i+1]) ^
fb(pBlk->blkByte[4*i+2]) ^ fd(pBlk->blkByte[4*i+3]);
tmp.blkByte[4*i+2] = fd(pBlk->blkByte[4*i]) ^ f9(pBlk->blkByte[4*i+1]) ^
fe(pBlk->blkByte[4*i+2]) ^ fb(pBlk->blkByte[4*i+3]);
tmp.blkByte[4*i+3] = fb(pBlk->blkByte[4*i]) ^ fd(pBlk->blkByte[4*i+1]) ^
f9(pBlk->blkByte[4*i+2]) ^ fe(pBlk->blkByte[4*i+3]);
}
memcpy(pBlk, &tmp, sizeof(Block));
}
/**************************
* FUNCTION: makeKeys
*
* PARAMETERS:
*
* DESCRIPTION:
**************************/
void Aes::makeKeys(Block key)
{
int i, j, k;
Uint32 tmp, wi_4, wi_1;
Uint8 *pTmp;
Uint32 rndCnst[11] = {0x00, 0x01, 0x02,
0x04, 0x08, 0x10,
0x20, 0x40, 0x80,
0x1b, 0x36};
memcpy(&rndKeys[0], &key, sizeof(Block)); // copy the master key to block 0
//rndKeys[0].pBlkWord = (Uint32 *)&rndKeys[0].blkByte + 3;
for(i = 1; i < NUM_RND; i++)
{
// do transformation
rndKeys[i-1].pBlkWord = (Uint32 *)&rndKeys[i-1].blkByte + 3;
rndKeys[i].pBlkWord = (Uint32 *)&rndKeys[i].blkByte; // set address
//shift bytes
tmp = (*rndKeys[i-1].pBlkWord << 24) |
((*rndKeys[i-1].pBlkWord & 0xffffff00) >> 8);
tmp = tmp;
pTmp = (Uint8 *)&tmp;
// SBox substitution
for(k = 0; k<4; k++)
{
*pTmp = SBox[*pTmp];
pTmp++;
}
// result
rndKeys[i-1].pBlkWord = (Uint32 *)&rndKeys[i-1].blkByte;
*rndKeys[i].pBlkWord = tmp ^ rndCnst[i] ^ *rndKeys[i-1].pBlkWord;
rndKeys[i].pBlkWord ++;
rndKeys[i-1].pBlkWord ++;
for(j = 1; j<4; j++)
{
wi_4 = *(rndKeys[i].pBlkWord - 1);
wi_1 = *rndKeys[i-1].pBlkWord;
*rndKeys[i].pBlkWord = wi_1 ^ wi_4;
rndKeys[i].pBlkWord += 1;
rndKeys[i-1].pBlkWord ++;
}
rndKeys[i].pBlkWord = (Uint32 *)&rndKeys[i].blkByte; // reset address
rndKeys[i-1].pBlkWord = (Uint32 *)&rndKeys[i-1].blkByte;
}
}
/**************************
* FUNCTION: getRndKeys
*
* PARAMETERS:
*
* DESCRIPTION:
**************************/
void Aes::getRndKeys(int rndNum, Block *pKey)
{
memcpy(pKey, &rndKeys[rndNum], sizeof(Block));
}
//-----------------------------------------------
#if 0
/**************************
* FUNCTION: shiftRow
*
* PARAMETERS:
*
* DESCRIPTION:
**************************/
void Aes::shiftRow(Block *pBlk)
{
//Uint32 tmp;
pBlk->pBlkWord = (unsigned int *)pBlk->blkByte;
pBlk->pBlkWord ++; // shift second row
*pBlk->pBlkWord = (*pBlk->pBlkWord << 24) |
((*pBlk->pBlkWord & 0xffffff00) >> 8); // shift second row
pBlk->pBlkWord ++; // shift third row
*pBlk->pBlkWord = (*pBlk->pBlkWord << 16) |
((*pBlk->pBlkWord & 0xffff0000) >> 16); // shift third row
pBlk->pBlkWord ++; // shift fourth row
*pBlk->pBlkWord = (*pBlk->pBlkWord << 8) |
((*pBlk->pBlkWord & 0xffffff00) >> 24); // shift fourth row
}
/**************************
* FUNCTION: invShiftRow
*
* PARAMETERS:
*
* DESCRIPTION:
**************************/
void Aes::invShiftRow(Block *pBlk)
{
//Uint32 tmp;
pBlk->pBlkWord = (unsigned int *)pBlk->blkByte;
pBlk->pBlkWord ++; // shift second row
*pBlk->pBlkWord = (*pBlk->pBlkWord << 8) |
((*pBlk->pBlkWord & 0xffffff00) >> 24); // shift second row
pBlk->pBlkWord ++; // shift third row
*pBlk->pBlkWord = (*pBlk->pBlkWord << 16) |
((*pBlk->pBlkWord & 0xffff0000) >> 16); // shift third row
pBlk->pBlkWord ++; // shift fourth row
*pBlk->pBlkWord = (*pBlk->pBlkWord << 24) |
((*pBlk->pBlkWord & 0xffffff00) >> 8); // shift fourth row
}
/**************************
* FUNCTION: mixColumn
*
* PARAMETERS:
*
* DESCRIPTION:
**************************/
void Aes::mixColumn(Block *pBlk)
{
Block tmp;
int i;
for(i = 0; i < 4; i++)
{
tmp.blkByte[i] = f2(pBlk->blkByte[i]) ^ f3(pBlk->blkByte[4+i]) ^
pBlk->blkByte[8+i] ^ pBlk->blkByte[12+i];
tmp.blkByte[4+i] = pBlk->blkByte[i] ^ f2(pBlk->blkByte[4+i]) ^
f3(pBlk->blkByte[8+i]) ^ pBlk->blkByte[12+i];
tmp.blkByte[8+i] = pBlk->blkByte[i] ^ pBlk->blkByte[4+i] ^
f2(pBlk->blkByte[8+i]) ^ f3(pBlk->blkByte[12+i]);
tmp.blkByte[12+i] = f3(pBlk->blkByte[i]) ^ pBlk->blkByte[4+i] ^
pBlk->blkByte[8+i] ^ f2(pBlk->blkByte[12+i]);
}
memcpy(pBlk, &tmp, sizeof(Block));
}
/**************************
* FUNCTION: invMixColumn
*
* PARAMETERS:
*
* DESCRIPTION:
**************************/
void Aes::invMixColumn(Block *pBlk)
{
Block tmp;
int i;
for(i = 0; i < 4; i++)
{
tmp.blkByte[i] = fe(pBlk->blkByte[i]) ^ fb(pBlk->blkByte[4+i]) ^
fd(pBlk->blkByte[8+i]) ^ f9(pBlk->blkByte[12+i]);
tmp.blkByte[4+i] = f9(pBlk->blkByte[i]) ^ fe(pBlk->blkByte[4+i]) ^
fb(pBlk->blkByte[8+i]) ^ fd(pBlk->blkByte[12+i]);
tmp.blkByte[8+i] = fd(pBlk->blkByte[i]) ^ f9(pBlk->blkByte[4+i]) ^
fe(pBlk->blkByte[8+i]) ^ fb(pBlk->blkByte[12+i]);
tmp.blkByte[12+i] = fb(pBlk->blkByte[i]) ^ fd(pBlk->blkByte[4+i]) ^
f9(pBlk->blkByte[8+i]) ^ fe(pBlk->blkByte[12+i]);
}
memcpy(pBlk, &tmp, sizeof(Block));
}
#endif
/**************************
* FUNCTION:
*
* PARAMETERS:
*
* DESCRIPTION:
**************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -