1

数週間前、私が興味を持っていた暗号化の仕事への応募の一環として、いくつかのコードを受け取りました。彼らは私にコードを送ってきて、基本的に私がそれを理解し、それを改善できるかどうかを知りたがっていました。

私は最善を尽くしましたが、すべてのコードが私にとって真新しいものであり、それが何をするのか理解できませんでした. 他にやるべきことがあったので、最終的にはそれを失われた原因としてあきらめました。しかし、知識のためだけに、私はまだそれについて学ぶことに非常に興味があります. このタイプのプログラミングについて、またはこれが具体的に何をするのかを学ぶのを手伝ってくれる人はいますか?

私はそれを切り詰めて、私の印象を与えようとします。

これは、実際の暗号化を行う部分です。XOR暗号化を使用して、私が理解できることから。これは正しいです?また、input_2 と input_1 が誤って切り替えられていると思います。

typedef int int32;
typedef char int8;

void change_it(int8 *output, int8 *input_1, const int8 *input_2, int32 length)
{
    int32 i = 0;

    for(i=0; i<length; i++)
    {
        output[i] = (int8)(input_1[i] ^ input_2[i]);
    }
    return;
}

ここではitoa、文字列を 10 進数または 16 進数にするために an をオーバーロードしましたが、その目的は不明です。

void itoa( int32 num, int8  *alpha, int32 radix )
{
    if( radix == 10 )
    {
        sprintf(alpha, "%i", num);
    }
    else if( radix == 16 )
    {
        sprintf(alpha, "%X", num);
    }
}

これは、main が呼び出すメインの実行中の関数です。いくつかの奇妙なビット単位の処理を行ってから、change_it を 4 回呼び出します。これは私を最も困惑させた部分でした。

int8 *modify_it(int32 modifier, const int8  *input_1, int32 length)
{
    int8  leading[3];
    int32 i_leading;
    int8 * temp_string = NULL;
    int8 * ret;
    int32 i = 0;

    itoa(modifier/2, leading, 10);
    i_leading = atoi(leading);

    temp_string = (int8 *) malloc(8);
    ret = (int8 *) malloc(length);
    memset(temp_string, 0, 8);
    temp_string[0] = 0;

    if( (modifier+1)%2 == 0 ) {
        temp_string[0] = (int8)((i_leading<<4) + 8);
    }
    else {
        temp_string[0] = (int8)(i_leading<<4);
    }

    for(i=0; i<(length>>3); i++)
    {
        change_it(ret+i*8, temp_string, input_1+i*8, 8);
    }
    free(temp_string);

    return ret;
}

最後になりましたが、それを開始するための main 関数です。

int main(int argc, char **argv) {

    int8 data[32];
    memset(data, 0x0A, sizeof(data));

    int8 *resp = modify_it(0xFF, data, sizeof(data));

    free(resp);
    system("PAUSE");
    return 0;
}
4

2 に答える 2

5

基本的に、これが行うことは、より良い用語の裏で、入力を難読化することです。

これは誰かによる非常にアマチュアな試みであり、データの保護と保存の両方でかなり失敗します。

配列のクリア (calloc による割り当て中に実行できた可能性があります) のような多くのエラーがあり、その一部を「手動で」クリアして再度クリアすることを「確認」します。これには非常に多くの間違ったことがあり、吐き出したり笑ったりしたくなります。

これが宿題でないなら、捨ててください。そこから学ぼうとしないでください。このコードについて正しいことや良いことは何もありません。

于 2012-05-24T01:39:56.287 に答える
4

コードを批評するレベルはたくさんあります。

  1. 入力も出力もないため、関数が存在しない可能性があります。
  2. 出力を追加すると、暗号化されるデータは固定されます (32 個の改行)。
  3. 「暗号化」は脆弱なメカニズムで行われます (正しく行われた XOR 暗号化は ROT-13 よりも強力ですが、それほどではありません。
  4. 0xFF「キー」は、関数に渡された値に基づく 1 つの固定バイトとmodify_it()7 つのゼロ バイトです。
  5. 0 との XOR は何も隠蔽しないため、各 8 の 1 バイトのみがコードによって変更されます。
  6. 最も基本的なECB (電子コードブック) モードを使用し、より複雑なスキーム (CBC など) ではなく、各 8 バイトブロックを個別に暗号化します。
  7. コードは復号化を示していません。
  8. このコードは、暗号化された素材を復号化すると元の素材が残ることを示していません。
  9. などの呼び出しはエラーチェックしませんmalloc()
  10. へのフォーマット時にバッファ オーバーフローが発生127leadingます。
  11. 本格的な暗号化コードでは、キーの使用が終了したらキーを上書きする必要があります。

等。

全体として、「このコードを無視する」というアドバイスは適切です。でも、あなたに送った会社は、それがゴミであることを十分に認識していたのでしょう。彼らは、どのような問題が発生するのか、それをどのように分析するのか、改善策を提供する場合はどのような改善策を提供するのかを知りたがっていました。

悪い C コードの単純な部分として扱ってください。というように分析します。知識があれば暗号化に注意してください。ただし、暗号化についてよく知らなくても批判すべき点はたくさんあります。

Before:
0x0000: 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A   ................
0x0010: 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A   ................
After:
0x0000: F2 0A 0A 0A 0A 0A 0A 0A F2 0A 0A 0A 0A 0A 0A 0A   ................
0x0010: F2 0A 0A 0A 0A 0A 0A 0A F2 0A 0A 0A 0A 0A 0A 0A   ................
Decrypt:
0x0000: 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A   ................
0x0010: 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A   ................
于 2012-05-24T02:45:06.880 に答える