重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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ブロック目しか行えません。

どなたかどこが悪いのかご教授いただけないでしょうか?

A 回答 (3件)

>すいませんコメントつけたほうがよかったんですね…



コメントを書かれいない場合、そこで何をやりたいのか他者には伝わりませんよ。

>そこは渡されたdataを16ワードごとに区切って一度tmpに入れて暗号化、それからもとのdataの位置にそれを戻してやるという動作をさせたくて書きました。

memcpyをちゃんと調べてみましょう。
第2引数にint *を渡してるからといって第3引数のintを指定した個数分(今回でいえばintを16個分)という意味になったりしません。
memcpyをちゃんと調べれば

>memcpy(data,init,16);
>memcpy(data2,init2,isize);

などもおかしいことがわかると思います。
    • good
    • 0

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;
}

ファイルが大きいと、暴走しますよ。

init[16];

16しかない所に何個入れますか
さらに、char に int を入れると、とっても窮屈ですよ。

http://www.amazon.co.jp/The-Design-Rijndael-Info …

をお勧めします。
この本の巻末にある、ソースコードに間違いが少しあるので自分で修正してね。
    • good
    • 0

とりあえずコメントを書け.



多分, 根本原因は
あなたがメモリ周りに関して十分な理解をしていないこと
だろう.

たとえばだが,
for (i = 0; i < dsize; i += 16) {
memcpy(tmp,&data[i],16);

Cipher(tmp);

memcpy(&data[i],tmp,16);
}
がどういう動作をするか日本語で説明してくれるかな?

この回答への補足

すいませんコメントつけたほうがよかったんですね…

そこは渡されたdataを16ワードごとに区切って一度tmpに入れて暗号化、それからもとのdataの位置にそれを戻してやるという動作をさせたくて書きました。

補足日時:2015/01/17 03:09
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

今、見られている記事はコレ!