3

学校のプロジェクトのために、フグの暗号化 (復号化ではなく暗号化のみ) を作成しています。暗号化自体は完了したので、楽しみのために復号化を行うことにしました (Blowfish では簡単です)。

バイトを表すために unsigned char を使用しました (ただし、uint8_t の方が移植性が高いと思います)。復号化されたバイトを印刷しようとしているときに、私が持っている質問が出てきます。プレーン テキスト メッセージを暗号化しています。暗号化した実際のテキスト メッセージを印刷することができましたが、非常に特定の場所でしか印刷できませんでした。同じ正確なコードは、他の場所では機能しないようです。ここにあります:

int n;
for(n = 0; n < numBlocks; n++) // Blocks are 32-bit unsigned ints (unsigned long)
{
     // uchar is just a typedef for unsigned char
     // message is an array of uchars
     message[n] = (uchar) ((blocks[n]>>24));
     message[n+1] = (uchar) ((blocks[n]>>16));
     message[n+2] = (uchar) ((blocks[n]>>8));
     message[n+3] = (uchar) ((blocks[n]));
     // Printing works here; exact message comes back
     printf("%c%c%c%c", message[n], message[n+1], message[n+2], message[n+3]); 
}

しかし、2 行後にまったく同じコードを使用しようとすると、機能しません

for(n = 0; n < numBlocks; n++)
{
     // Printing doesn't work here.
     // Actually, the first letter works, but none of the others
     printf("%c%c%c%c", message[n], message[n+1], message[n+2], message[n+3]); 
}

文字を数値形式でも出力してみましたが、実際に変わっていることがわかります。

ここで何が起こっているのですか?これは未定義の動作ですか?誰にも信頼できる解決策はありますか?2 つの呼び出しの間にメッセージ配列の値を変更することは何もしていません。

これを、sparc プロセッサを搭載した Sun 5.10 で実行およびコンパイルしています。

4

1 に答える 1

9
for(n = 0; n < numBlocks; n++) // Blocks are 32-bit unsigned ints (unsigned long)
{
     message[n] = (uchar) ((blocks[n]>>24));
     message[n+1] = (uchar) ((blocks[n]>>16));
     message[n+2] = (uchar) ((blocks[n]>>8));
     message[n+3] = (uchar) ((blocks[n]));
}

このループを通過するたびに、 に設定message[n]message[n+3]n を 1 ずつ増やします。これは、最初の反復で 、 、および が設定message[0]され、次に 、、およびが設定message[1]message[2]れることを意味します。したがって、基本的には、反復ごとにメッセージの最初の文字を除くすべてを上書きします。message[3]message[1]message[2]message[3]message[4]

messageほとんどの場合、 4 倍大きくしてから次のようにする必要があります。

message[n*4] = ...
message[n*4 + 1] = ...
于 2012-07-06T17:30:35.787 に答える