プロが教える店舗&オフィスのセキュリティ対策術

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ブロック目が元の値に戻りません。
どこが間違っているかどなたか教えていただけないでしょうか?

A 回答 (1件)

あまり自信は無いですが、



tmp[j]^=iv[j]

ここで使う iv[j];
の値は、暗号化のときと復号化のときでは、
違った値になっていませんか?

iv1[]、 iv2[] を用意して
復号化と暗号化で別の領域を使ったらどうでしょうか。

 
    • good
    • 0

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