Professional Documents
Culture Documents
#define ENCRYPT 0
#define DECRYPT 1
#include "StdAfx.h"
#include "Resource.h"
#include "winaesDlg.h"
/* Function prototypes */
int KeyExpansion(CWinaesDlg* dlg, int nb,int nk, BYTE* key);
void Encrypt(CWinaesDlg* dlg, BYTE* buff, BYTE* result);
void InvDecrypt(CWinaesDlg* dlg, BYTE* buff, BYTE* result);
void EquDecrypt(CWinaesDlg* dlg, BYTE* buff, BYTE* result);
int blockEncrypt(CWinaesDlg* dlg, BYTE *input, int inputLen, BYTE* result, int cipher_mode);
int blockDecrypt(CWinaesDlg* dlg, BYTE *input, int inputLen, BYTE* result, int decrypt_mode, int
cipher_mode);
#endif
AES.CPP
#include <stdio.h>
#include <stdlib.h>
#include "Rijndael.h"
#include "service.h"
/* Fixed Data */
BYTE Co[4]={0x3,0x1,0x1,0x2}; /* Inverse Coefficients */
BYTE InvCo[4]={0xB,0xD,0x9,0xE}; /* Inverse Coefficients */
/* Parameter-dependent data */
DWORD fkey[120];
DWORD ikey[120]; // inverse key
DWORD ekey[120]; // equivalent key
BYTE subbytes[256];
BYTE invsubbytes[256];
BYTE shfts[3][4];
void ResetShifts()
{
for (int i=0; i<3; i++)
for (int j=0; j<4; j++)
if (i==2 && j==3) shfts[i][j]=4;
else shfts[i][j]=j;
}
62
void shiftrow(BYTE* row, int n, int direct)
{
BYTE t;
int j;
if (n)
{
for (int i=0; i<n; i++)
{
switch (direct)
{
case ENCRYPT:
t=row[0];
for (j=1; j<Nb; j++) row[j-1]=row[j];
row[Nb-1]=t;
break;
case DECRYPT:
t=row[Nb-1];
for (j = Nb-1; j>0; j--) row[j]=row[j-1];
row[0]=t;
break;
}
}
}
}
for (i=0;i<4;i++)
{
for (j=0;j<Nb;j++) temp[j]=s[j*4+i];
};
while (u)
{
if(u & 1) s^=t;
u>>=1;
t=xtime(t, mod);
63
}
return(s);
}
return result;
}
void ResetTables()
64
{
SBinvModulo = BPOLY;
SBmulModulo = MPOLY;
SBmulConst1 = 0x1f;
SBmulConst2 = 0x4a;
SBaddConst1 = 0x63;
SBaddConst2 = 0x05;
FillTables(3);
}
switch (direct)
{
case ENCRYPT:
m=pack(Co);
break;
case DECRYPT:
m=pack(InvCo);
break;
65
b[1]=product(m, s[i], BPOLY);
m=ROTL24(m);
s[i]=pack(b);
}
return;
}
N=Nb*(Nr+1);
for (i=0;i<Nk;i++)
{
fkey[i]=pack(&key[i*4]);
}
if (i % Nk == 0)
{
temp = SubDWord(ROTL24(temp)) ^ rcon;
rcon=(DWORD)xtime((BYTE)rcon, BPOLY );
}
Nb=nb; Nk=nk;
if(dlg->m_bRecalcKey) RecalcKeys(key);
return (Nr);
};
BOOL b_MixColumns;
BOOL b_AddRoundKey;
BOOL b_ShiftRows;
BOOL b_SubBytes;
i=0;
if (dlg->m_Start)
{
CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"enc[%02u].input %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
66
if (!b_AddRoundKey)
{
if (dlg->m_KSch)
{
CharStr2HexStr((BYTE*)&fkey[i*Nb], Tmp, Nb*4);
sprintf(strTmp, "enc[%02u].k_sch %s", i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
for (i=1;i<Nr;i++)
{
if (dlg->m_Start)
{
CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"enc[%02u].start %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
if (!b_SubBytes)
{
SubBytes((BYTE*)s, ENCRYPT);
if (dlg->m_SBox)
{
CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"enc[%02u].s_box %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
}
if (!b_ShiftRows)
{
ShifRows((BYTE*)s, ENCRYPT);
if (dlg->m_SRow)
{
CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"enc[%02u].s_row %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
}
if (!b_MixColumns)
{
MixCol(s, Nb, ENCRYPT);
if (dlg->m_M_Col)
{
CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"enc[%02u].m_col %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
}
if (!b_AddRoundKey)
{
if (dlg->m_KSch)
{
CharStr2HexStr((BYTE*)&fkey[i*Nb], Tmp, Nb*4);
sprintf(strTmp, "enc[%02u].k_sch %s", i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
if (dlg->m_Start)
{
CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"enc[%02u].start %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
if (!b_SubBytes)
{
SubBytes((BYTE*)s, ENCRYPT);
67
if (dlg->m_SBox)
{
CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"enc[%02u].s_box %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
}
if (!b_ShiftRows)
{
ShifRows((BYTE*)s, ENCRYPT);
if (dlg->m_SRow)
{
CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"enc[%02u].s_row %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
}
if (!b_AddRoundKey)
{
if (dlg->m_KSch)
{
CharStr2HexStr((BYTE*)&fkey[i*Nb], Tmp, Nb*4);
sprintf(strTmp, "enc[%02u].k_sch %s", i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
if (dlg->m_Start)
{
CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"enc[%02u].final %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
return;
}
i=0;
if (dlg->m_Start)
{
CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"inv[%02u].input %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
if (!b_AddRoundKey)
{
if (dlg->m_KSch)
{
CharStr2HexStr((BYTE*)&ikey[i*Nb], Tmp, Nb*4);
sprintf(strTmp,"inv[%02u].k_sch %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
for (i=1;i<Nr;i++)
{
if (dlg->m_Start)
{
CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"inv[%02u].start %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
68
}
if (!b_ShiftRows)
{
ShifRows((BYTE*)s, DECRYPT);
if (dlg->m_SRow)
{
CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"inv[%02u].s_row %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
}
if (!b_SubBytes)
{
SubBytes((BYTE*)s, DECRYPT);
if (dlg->m_SBox)
{
CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"inv[%02u].s_box %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
}
if (!b_AddRoundKey)
{
if (dlg->m_KSch)
{
CharStr2HexStr((BYTE*)&ikey[i*Nb], Tmp, Nb*4);
sprintf(strTmp,"inv[%02u].k_sch %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
if (dlg->m_KSch)
{
CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"inv[%02u].k_add %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
}
if (!b_MixColumns)
{
MixCol(s, Nb, DECRYPT);
if (dlg->m_M_Col)
{
CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"inv[%02u].m_col %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
}
}
if (!b_ShiftRows)
{
ShifRows((BYTE*)s, DECRYPT);
if (dlg->m_SRow)
{
CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"inv[%02u].s_row %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
}
if (!b_SubBytes)
{
SubBytes((BYTE*)s, DECRYPT);
if (dlg->m_SBox)
{
CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"inv[%02u].s_box %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
69
}
if (!b_AddRoundKey)
{
if (dlg->m_KSch)
{
CharStr2HexStr((BYTE*)&ikey[i*Nb], Tmp, Nb*4);
sprintf(strTmp,"inv[%02u].k_sch %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
if (dlg->m_Start)
{
CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"inv[%02u].final %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
return;
}
i=0;
if (dlg->m_Start)
{
CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"equ[%02u].input %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
if (!b_AddRoundKey)
{
if (dlg->m_KSch)
{
CharStr2HexStr((BYTE*)&ikey[i*Nb], Tmp, Nb*4);
sprintf(strTmp,"equ[%02u].k_sch %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
for (i=1;i<Nr;i++)
{
if (dlg->m_Start)
{
CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"equ[%02u].start %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
if (!b_SubBytes)
{
SubBytes((BYTE*)s, DECRYPT);
if (dlg->m_SBox)
{
CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"equ[%02u].s_box %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
}
if (!b_ShiftRows)
{
ShifRows((BYTE*)s, DECRYPT);
if (dlg->m_SRow)
{
70
CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"equ[%02u].s_row %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
}
if (!b_MixColumns)
{
MixCol(s, Nb, DECRYPT);
if (dlg->m_M_Col)
{
CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"equ[%02u].m_col %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
}
if (!b_AddRoundKey)
{
if (dlg->m_KSch)
{
CharStr2HexStr((BYTE*)&ikey[i*Nb], Tmp, Nb*4);
sprintf(strTmp,"equ[%02u].k_sch %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
if (dlg->m_KSch)
{
CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"equ[%02u].k_add %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
}
}
if (!b_SubBytes)
{
SubBytes((BYTE*)s, DECRYPT);
if (dlg->m_SBox)
{
CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"equ[%02u].s_box %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
}
if (!b_ShiftRows)
{
ShifRows((BYTE*)s, DECRYPT);
if (dlg->m_SRow)
{
CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"equ[%02u].s_row %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
}
if (!b_AddRoundKey)
{
if (dlg->m_KSch)
{
CharStr2HexStr((BYTE*)&ikey[i*Nb], Tmp, Nb*4);
sprintf(strTmp,"equ[%02u].k_sch %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
if (dlg->m_Start)
{
CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"equ[%02u].final %s",i, Tmp);
dlg->m_eDebug.AddString(strTmp);
}
71
for (i=j=0;i<Nb;i++,j+=4) unpack(s[i],(BYTE *)&result[j]);
return;
}
/* This function will add one to the given number (as a byte string).
* has been reached.
*/
static void increase_counter( BYTE *x, int x_size)
{
int i, y;
if (y==0) break;
}
return;
}
BYTE cipher_IV[32];
int CFB_bits = 1;
int OFB_bits = 1;
int blockEncrypt(CWinaesDlg* dlg, BYTE *input, int inputLen, BYTE* result, int cipher_mode)
{
int i, j, k, l, numBlocks;
numBlocks = inputLen/(Nb<<2);
switch (cipher_mode)
{
case MODE_ECB:
if (ECB_Debug)
{
CharStr2HexStr((BYTE*)input, Tmp, Nb*4);
sprintf(strTmp," in[%04u]=%s", i, Tmp);
dlg->m_eDebug.AddString(strTmp);
72
input += Nb<<2;
result += Nb<<2;
}
break;
case MODE_CBC:
iv = cipher_IV;
iv = result;
if (CBC_Debug)
{
CharStr2HexStr((BYTE*)input, Tmp, Nb*4);
sprintf(strTmp," in[%04u]=%s", i, Tmp);
dlg->m_eDebug.AddString(strTmp);
input += Nb<<2;
result += Nb<<2;
}
break;
case MODE_CFB1:
iv = (BYTE*) malloc(Nb<<2);
memcpy(iv, cipher_IV, Nb<<2);
if (CFB_Debug)
{
sprintf(strTmp,"= CFB AES Nb=%u Nk=%u, block %04u encrypt
=======================", Nb, Nk, i);
dlg->m_eDebug.AddString(strTmp);
73
iv[(Nb<<2)-1] = (iv[(Nb<<2)-1] << 1) | ((result[l >>
3] >> (7 - (l & 7))) & 1);
}
}
if (CFB_Debug)
{
CharStr2HexStr((BYTE*)input, Tmp, Nb*4);
sprintf(strTmp," in[%04u]=%s", i, Tmp);
dlg->m_eDebug.AddString(strTmp);
result += Nb<<2;
input += Nb<<2;
}
free(iv);
break;
case MODE_OFB:
iv = (BYTE*) malloc(Nb<<2);
memcpy(iv, cipher_IV, Nb<<2);
if (OFB_Debug)
{
//CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"= OFB AES Nb=%u Nk=%u, block %04u encrypt
=======================", Nb, Nk, i);
dlg->m_eDebug.AddString(strTmp);
result += Nb<<2;
input += Nb<<2;
}
free(iv);
break;
74
case MODE_CTR:
iv = (BYTE*) malloc(Nb<<2);
memcpy(iv, cipher_IV, Nb<<2);
if (CTR_Debug)
{
CharStr2HexStr((BYTE*)input, Tmp, Nb*4);
sprintf(strTmp," in[%04u]=%s", i, Tmp);
dlg->m_eDebug.AddString(strTmp);
input += Nb<<2;
result += Nb<<2;
}
free(iv);
break;
default:
return BAD_CIPHER_STATE;
}
return 128*numBlocks;
int blockDecrypt(CWinaesDlg* dlg, BYTE *input, int inputLen, BYTE* result, int decrypt_mode, int
cipher_mode)
{
int i, j, k, l, numBlocks;
numBlocks = inputLen/(Nb<<2);
switch (cipher_mode)
{
case MODE_ECB:
for (i = 1; i <= numBlocks; i++) {
switch (decrypt_mode)
{
case DIR_DECRYPTINV:
if (ECB_Debug)
{
//CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"= ECB AES Nb=%u Nk=%u, block
%04u inverse decrypt ===============", Nb, Nk, i);
dlg->m_eDebug.AddString(strTmp);
}
InvDecrypt(dlg, input, result);
break;
case DIR_DECRYPTEQU:
if (ECB_Debug)
75
{
//CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"= ECB AES Nb=%u Nk=%u, block
%04u equivalent decrypt ============", Nb, Nk, i);
dlg->m_eDebug.AddString(strTmp);
}
EquDecrypt(dlg, input, result);
break;
}
if (ECB_Debug)
{
CharStr2HexStr((BYTE*)input, Tmp, Nb*4);
sprintf(strTmp," in[%04u]=%s", i, Tmp);
dlg->m_eDebug.AddString(strTmp);
input += Nb<<2;
result += Nb<<2;
}
break;
case MODE_CBC:
iv = cipher_IV;
for (i = numBlocks; i > 0; i--) {
switch (decrypt_mode)
{
case DIR_DECRYPTINV:
if (CBC_Debug)
{
//CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"= CBC AES Nb=%u Nk=%u, block
%04u inverse decrypt ===============", Nb, Nk, i);
dlg->m_eDebug.AddString(strTmp);
case DIR_DECRYPTEQU:
if (ECB_Debug)
{
//CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"= CBC AES Nb=%u Nk=%u, block
%04u equivalent decrypt ============", Nb, Nk, i);
dlg->m_eDebug.AddString(strTmp);
if (CBC_Debug)
{
CharStr2HexStr((BYTE*)input, Tmp, Nb*4);
sprintf(strTmp," in[%04u]=%s", i, Tmp);
dlg->m_eDebug.AddString(strTmp);
76
}
break;
case MODE_CFB1:
iv = (BYTE*) malloc(Nb<<2);
memcpy(iv, cipher_IV, Nb<<2);
if (CFB_Debug)
{
//CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"= CFB AES Nb=%u Nk=%u, block %04u encrypt
=======================", Nb, Nk, i);
dlg->m_eDebug.AddString(strTmp);
case MODE_OFB:
iv = (BYTE*) malloc(Nb<<2);
memcpy(iv, cipher_IV, Nb<<2);
if (OFB_Debug)
{
//CharStr2HexStr((BYTE*)s, Tmp, Nb*4);
sprintf(strTmp,"= OFB AES Nb=%u Nk=%u, block %04u encrypt
=======================", Nb, Nk, i);
dlg->m_eDebug.AddString(strTmp);
77
Encrypt(dlg, iv, block);
result += Nb<<2;
input += Nb<<2;
}
free(iv);
break;
case MODE_CTR:
iv = (BYTE*) malloc(Nb<<2);
memcpy(iv, cipher_IV, Nb<<2);
if (CTR_Debug)
{
CharStr2HexStr((BYTE*)input, Tmp, Nb*4);
sprintf(strTmp," in[%04u]=%s", i, Tmp);
dlg->m_eDebug.AddString(strTmp);
return 128*numBlocks;
}
78