
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ブロック目しか行えません。
どなたかどこが悪いのかご教授いただけないでしょうか?
No.3ベストアンサー
- 回答日時:
>すいませんコメントつけたほうがよかったんですね…
コメントを書かれいない場合、そこで何をやりたいのか他者には伝わりませんよ。
>そこは渡されたdataを16ワードごとに区切って一度tmpに入れて暗号化、それからもとのdataの位置にそれを戻してやるという動作をさせたくて書きました。
memcpyをちゃんと調べてみましょう。
第2引数にint *を渡してるからといって第3引数のintを指定した個数分(今回でいえばintを16個分)という意味になったりしません。
memcpyをちゃんと調べれば
>memcpy(data,init,16);
>memcpy(data2,init2,isize);
などもおかしいことがわかると思います。
No.2
- 回答日時:
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 …
をお勧めします。
この本の巻末にある、ソースコードに間違いが少しあるので自分で修正してね。
No.1
- 回答日時:
とりあえずコメントを書け.
多分, 根本原因は
あなたがメモリ周りに関して十分な理解をしていないこと
だろう.
たとえばだが,
for (i = 0; i < dsize; i += 16) {
memcpy(tmp,&data[i],16);
Cipher(tmp);
memcpy(&data[i],tmp,16);
}
がどういう動作をするか日本語で説明してくれるかな?
この回答への補足
すいませんコメントつけたほうがよかったんですね…
そこは渡されたdataを16ワードごとに区切って一度tmpに入れて暗号化、それからもとのdataの位置にそれを戻してやるという動作をさせたくて書きました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数桁10進数の*桁目だけを抽出...
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
C言語 エラーの原因がわからな...
-
線形補間 2次元テーブル C言語...
-
c言語 文字化けします
-
return 1L
-
CStringの配列要素を関数で受け...
-
プログラミングがわかりません
-
int型の変数値をバイト列として...
-
n × n の二次元配列の各要素に ...
-
std::set<int> で、ある値が何...
-
【C++】関数ポインタの使い方
-
#define _CRT_SECURE_NO_WARNIN...
-
int16_t の _t は何?
-
c言語の問題です 課題1 (二分探...
-
数字列を3桁ごとにカンマで区切...
-
足して100になるような乱数のア...
-
if文について
-
C言語の関数で戻り値を返す必要...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数桁10進数の*桁目だけを抽出...
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
ラップ関数とはどんなものですか?
-
【C++】関数ポインタの使い方
-
if と配列の組み合わせ
-
(int *)の意味
-
ColorをRGBで指定する方法
-
未解決の外部シンボル _printf...
-
構造体の勉強中です 合計点の高...
-
商と剰余を同時に求める(C言語)
-
C言語で分からないところがあり...
-
式は定数値が必要です」という...
-
C言語での奇数の和
-
std::set<int> で、ある値が何...
-
課題でつまってます・・・
-
int16_t の _t は何?
-
比較回数と交換回数表示について
おすすめ情報