2012-03-11 11 views
1

Cipher Block Chaining(CBC)モードを使用してAESをコード化しようとしています。私はかなり構造が正しいと確信しています(以前の暗号文をAESに送る前に新しい平文をxoringし、逆に暗号を解除すると元の平文に暗号化されたファイルを復号化することが問題です。それは、それがxoredされている方法と関係があるかもしれません。私は私のAESアルゴリズムが正しいことを知っています。私は2つの文字の配列を一緒にxor私はあなたが2つのものを一緒にxoringの結果を取るし、私はその機能を確認したときに答えて、あなたが戻ってもう一方のオペランドを取得する必要があります。しかし、それはそのように動作しません。Cでのxoringに関する問題

私は平文でそれを読んで、前の暗号文と

//THERE IS A RANDOM INITIALIZATION VECTOR BEFORE GETTING INTO THE WHILE LOOP 
    while ((bytes_in = (read(fin, plaintext, AES_BLOCK)))) 
    { 
     for (count = 0; count < AES_BLOCK; count++){ 
     xor[count] = (plaintext[count])^(ciphertext[count]); 
     } 
     //AES STUFF NOT SHOWN SO THERE ISN'T MUCH CODE 
     status = write (fdsk, ciphertext, strlen (ciphertext)); 
     for (count =0; count < AES_BLOCK; count++) 
     plaintext[count] = '0'; 
    } 
それをXORどこ

解読一部:

bytes = read(fin, previous_CT, AES_BLOCK); //reads in the initialization vector 
while(total_bytes < aes_length) 
{ 
bytes = read(fin, ciphertext, AES_BLOCK); 
for(count = 0; count < AES_BLOCK; count++){ 
    plaintext[count] = (xor[count])^(previous_CT[count]); 
    printf("plaintext %d", plaintext[count]); 
} 
} 

は私の問題/質問をまとめると:私は私が行う必要がある知りません文字をXORするものがあれば 私は思ったんだけど。私は正しい方法でやっているようですが、何らかの理由で正しい結果が得られません。私はそれが私のプログラムを台無しにしている情報を読んでいる方法かもしれないかどうかも疑問に思っています。私を助けてください! ありがとう!

+0

1つのデバッグ手法は、コードからすべてのAESを削除し、それを試みることです。あなたのコードは、それぞれのブロックを前のブロック(またはIV)とxoringするだけです。これはデバッガで簡単に実行できるようになり、おそらく問題がどこにあるのかを簡単に確認することができます。それがうまくいくと、AESコードを取り戻すことができます。 –

+0

復号化中になぜ「フィン」から2行ずつ読んでいるのでしょうか。 – Elalfer

+0

これはどのようなシステムですか?バイナリモードでファイルをオープンしていましたか?(UNIXシステムでは問題ありません) 'xor'、' plaintext'、ciphertext'、 'previous_CT'の種類は何ですか? –

答えて

0

私に飛び出しバグは、この行にある:私はあなたが本当にしたいかなり確信している

status = write (fdsk, ciphertext, strlen (ciphertext)); // bug here 

status = write (fdsk, ciphertext, AES_BLOCK); 

どちらのバージョンでも同じ結果が得られることがありますが、時には暗号が '\ 0'という文字列を生成することがありますeを暗号文の途中に置き、最初のバグのあるバージョンは書き込みをあなたが望むよりも短いものに切り詰めます。 (同じ問題がXORing "Hello World!" cuts off stringで発生します)。あなたは正確に左に同じ値とXOR演算の右側を持っている場合のみ発生

私はXOR演算から

を全て0年代を取得します。 誤って間違ったバッファにデータをコピーしてしまったり、後で使用するためにデータを早期にコピーしたりすると、左右のデータが重複してコピーされてしまいますか?

0

質問内のコードが実際に使用しているコードの場合、問題は解読するときに暗号テキストで実際にxoringしていないことです。ファイルからciphertextに読み込みますが、previous_CTでxor演算を実行します。以下の追加されたコメントで

ルック:

// NOTE - here you read into `previous_CT` 
bytes = read(fin, previous_CT, AES_BLOCK); //reads in the initialization vector 

while(total_bytes < aes_length) 
{ 
bytes = read(fin, ciphertext, AES_BLOCK); // NOTE: here you read into `ciphertext` 
for(count = 0; count < AES_BLOCK; count++){ 
    plaintext[count] = (xor[count])^(previous_CT[count]); // NOTE: using `previous_CT` 
    printf("plaintext %d", plaintext[count]); 
} 
} 
+0

私は同じことに気付きましたが、 'read()'と 'for'ループの間に' ciphertext'を 'xor'に復号化したAESコードがないと仮定しました。 –

+0

@GregHewgillあなたは正しいです。 xor変数に解読されるAESコードがあります。 xor変数を暗号文に変更しても、動作しません。私はxor操作からすべて0を得ます。 – tpar44

+0

これは、somethign( 'xor'または' ciphertext 'であるかどうかわからない)を 'previous_CT'に移動するようには表示されていないコードもあるはずですか?それは起こっていますか? –

関連する問題