C言語でAESのEBCモードを実装しようとしています。
unsigned char key[32];
int w[60];
int data[NB];
int nk;
int nr;
int data2[32];
int Cipher(int *);
int invCipher(int *);
void encryptEBC(int *,int n);
void decryptEBC(int *,int n);
main(){
unsigned char keys[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};
unsigned char iv[]={0xcb,0x70,0x05,0x9e,0x27,0x2f,0x4e,0xd2,
0xd0,0xbe,0x0b,0x06,0xbf,0x16,0xec,0x5a};
unsigned char init2[]={'1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0',
'1','2','3','4','5','6','7','8','9','0',0x0a};
int isize = sizeof(init2)/sizeof(init2[0]);
int dsize2 = sizeof(data2)/sizeof(data2[0]);
printf("%d,%d\n",isize,dsize2);
FILE *fp;
char *fname = "test.txt";
unsigned char init[16];
int i = 0;
int c;
fp = fopen( fname, "r" );
if( fp == NULL ){
printf( "%sファイルが開けません\n", fname );
return -1;
}
while( (c = fgetc( fp )) != EOF ){
init[i] = c;
i = i+1;
}
fclose( fp );
memcpy(key,keys,16);
nk = 4;
nr = nk + 6;
KeyExpansion(key);
memcpy(data,init,16);
memcpy(data2,init2,isize);
datadump("PLAINTEXT: ",data,16);
datadump("KEY: ",key,16);
Cipher(data);
datadump("Cipher: ",data,16);
invCipher(data);
datadump("invCipher: ",data,16);
printf("\n");
datadump("PLAINTEXT: ",data2,dsize2);
encryptEBC(data2,dsize2);
datadump("EBCCipher: ",data2,dsize2);
decryptEBC(data2,dsize2);
datadump("invCipher: ",data2,dsize2);
printf("\n");
return 0;
}
void encryptEBC(int data[],int dsize){
int tmp[16];
int i,j,k;
printf("aiu%d\n",dsize);
KeyExpansion(key);
for (i = 0; i < dsize; i += 16) {
memcpy(tmp,&data[i],16);
Cipher(tmp);
memcpy(&data[i],tmp,16);
}
}
void decryptEBC(int data[],int dsize){
int tmp[16];
int i,j,k;
printf("eo%d\n",dsize);
KeyExpansion(key);
for (i = 0; i < dsize; i += 16) {
memcpy(tmp,&data[i],16);
invCipher(tmp);
memcpy(&data[i],tmp,16);
}
}
このようなプログラムでとりあえず2ブロック分の暗号化、復号を行おうと思っているのですが、1ブロック目しか行えません。
どなたかどこが悪いのかご教授いただけないでしょうか?
補足
すいませんコメントつけたほうがよかったんですね… そこは渡されたdataを16ワードごとに区切って一度tmpに入れて暗号化、それからもとのdataの位置にそれを戻してやるという動作をさせたくて書きました。