
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
-
大麻の使用罪がなかった理由や法改正での変更点、他国との違いを弁護士が解説
ドイツで2024年4月に大麻が合法化され、その2ヶ月後にサッカーEURO2024が行われた。その際、ドイツ警察は大会運営における治安維持の一つの方針として「アルコールを飲んでいるグループと、大麻を吸っているグループ...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数桁10進数の*桁目だけを抽出...
-
「指定されたキャストは有効で...
-
【C++】関数ポインタの使い方
-
C言語での引数の省略方法
-
構造体の勉強中です 合計点の高...
-
#define _CRT_SECURE_NO_WARNIN...
-
(int *)の意味
-
実数の整数部,小数部の取得
-
入力された数字を大きい順に並...
-
Listの<Label>と<PictureBox>
-
int型の変数値をバイト列として...
-
fprintfでの文字化け
-
C言語でDxlibを使って3x3の奇数...
-
比較回数と交換回数表示について
-
C言語について教えてください。
-
ファイルから読みこむ方法
-
C言語初心者です、、、お助けく...
-
配列変数のポインターが勝手に...
-
ポインタによる関数への配列渡し
-
C言語、行列の積を求めるプログ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
C言語 エラーの原因がわからな...
-
#define _CRT_SECURE_NO_WARNIN...
-
ラップ関数とはどんなものですか?
-
【C++】関数ポインタの使い方
-
実数の整数部,小数部の取得
-
int型の変数値をバイト列として...
-
std::set<int> で、ある値が何...
-
PowerShellがうまくいかない
-
(int *)の意味
-
CStringの配列要素を関数で受け...
-
ColorをRGBで指定する方法
-
「{ } で囲むだけ」は正しい?
-
acceptをalarmでタイムアウトさ...
-
if と配列の組み合わせ
-
read関数をノンブロッキングで...
-
(マルチスレッド)_beginthrea...
-
int16_t の _t は何?
おすすめ情報