
void encryptCBC(int data[],int dsize,int iv[]){ //暗号化
int tmp[4];
int i,j;
KeyExpansion(key);
for (i = 0; i < dsize; i += 4) {
memcpy(tmp,&data[i],16);
for(j=0;j<4;j++){
tmp[j]^=iv[j]; //16バイトごとに区切ったデータとベクタの排他的論理和
}
Cipher(tmp); //暗号化
memcpy(&data[i],tmp,16);
memcpy(iv,tmp,16); //ベクタの更新
}
}
void decryptCBC(int data[],int dsize,int iv[]){ //復号
int tmp[4];
int v[4];
int i,j;
KeyExpansion(key);
for (i = 0; i < dsize; i += 4) {
memcpy(tmp,&data[i],16);
invCipher(tmp); //復号
if(i==0){ //初期ベクタとの排他的論理和
for(j=0;j<4;j++){
tmp[j]^=iv[j];
}
}else{ //更新したベクタとの排他的論理和
for (j=0;j<4;j++){
tmp[j]^=v[j];
}
}
memcpy(v,&data[i],16); //ベクタの更新
memcpy(&data[i],tmp,16);
}
}
AESのCBCモードでの暗号化、復号を実装しようとしています。
2ブロック目以降は正しく復号できているのですが、1ブロック目が元の値に戻りません。
どこが間違っているかどなたか教えていただけないでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語での引数の省略方法
-
「指定されたキャストは有効で...
-
複数桁10進数の*桁目だけを抽出...
-
if と配列の組み合わせ
-
C#で配列の分割
-
(int *)の意味
-
acceptをalarmでタイムアウトさ...
-
プログラミング(C言語)につい...
-
入力を待たずにstdinの監視をし...
-
異なる文字列のマッチングを、D...
-
構造体の勉強中です 合計点の高...
-
n進数を10進数に変換するプログ...
-
C言語で分からないところがあり...
-
ビットフィールドをクリアした...
-
c/c++でのファイルの上書き保存...
-
CStringの配列要素を関数で受け...
-
C++でvectorにテキストファイル...
-
【C++】関数ポインタの使い方
-
double型の値を、一桁ずつint型...
マンスリーランキングこのカテゴリの人気マンスリー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 は何?
おすすめ情報