0

暗号化された部分文字列から生成される長い文字列を作成しようとしています。私が使用している暗号化AES128libmcrypt。コードは機能していますが、出力が短くなり、ビープ音が鳴ります。使っているからだとstrlen思いますが、どうすれば回避できるのかわかりません。私はいくつかの提案に非常に感謝します。これが私のコードです:

char *Encrypt( char *key, char *message){   
    static char *Res;
    MCRYPT mfd;
    char *IV;
    int i, blocks, key_size = 16, block_size = 16;
    blocks = (int) (strlen(message) / block_size) + 1;

    Res = calloc(1, (blocks * block_size));

    mfd = mcrypt_module_open(MCRYPT_RIJNDAEL_128, NULL, "ecb", NULL);
    mcrypt_generic_init(mfd, key, key_size, IV);

    strncpy(Res, message, strlen(message));
    mcrypt_generic(mfd, Res, block_size);
    //printf("the encrypted %s\n", Res);

    mcrypt_generic_deinit(mfd);
    mcrypt_module_close(mfd);

     return (Res);
}

char *mkline ( int cols) {
    int j;
    char seed[] = "thesecretmessage", key1[]="dontusethisinput", key2[]="abadinputforthis";

    char *encrypted, *encrypted2, *in = malloc(cols * 16);
    encrypted = Encrypt(key1, seed);
    sprintf(in, "%s", encrypted);
    encrypted2= Encrypt(key2, encrypted);
    printf("encrypted2 before for-loop %s\n", encrypted2);
    printf("encrypted2 before for loop len %d\n", strlen(encrypted2));
    for (j=1; j<cols; j++) {
        strcat(in, encrypted2);
        memmove(encrypted2, Encrypt(key2, encrypted2),strlen(seed));
        printf("encrypted2 %s on position %d\n" , encrypted2,j);
        printf("encrypted2 len %d\n", strlen(encrypted2));
    }
    free(encrypted);
    free(encrypted2);
    return in;
}

int main(int argc, char *argv[]) {
    char *line = mkline(15);
    printf("line %s\n", line);
    printf("line lenght %d\n", strlen(line));
    return 0;
}
4

4 に答える 4

1

印刷しようとしている暗号化された文字列には、個々のバイトの値が0〜255の範囲のバイトストリームが含まれています。暗号化された安全なアルゴリズムを使用しているため、値の分布は非常に均等になります。

暗号化された文字列をコンソールから印刷しようとしているため、コンソールは一部のバイトを印刷できない制御文字(ベル文字を参照)として解釈しますが、代わりにビープ音を鳴らすなどの他の効果があります。

さらに、strlen暗号化された文字列はnullで終了しておらず、代わりに他のバイトの中にゼロが含まれており、NULLで終了する文字列とは異なり、特別な意味がないため、思ったとおりに実行されていません。文字列の長さを別の場所に保存する必要があります。

于 2012-10-12T11:18:32.337 に答える
1

制御文字を印刷しているため、ビープ音が鳴ります。

またstrlen、最初の「\ 0」文字までのサイズを返します(文字列はゼロで終了するため)。暗号化されたメッセージにゼロが含まれている可能性があるため、予想よりも長さが短くなるのはそのためです。

次のようなことを実行して、結果の長さを返すことができます。

 char *Encrypt(const char *key, const char *message, int *result_len)
 {
   *result_len = blocks * block_size;
 }

また

memmove(encrypted2, Encrypt(key2, encrypted2),strlen(seed));

Encryptこの行は、呼び出すたびに(新しいメモリを割り当てる)呼び出しを行うため、メモリリークが発生するはずcallocです。これは、完了後に解放する必要があります。

おそらくmemcpyを使用する必要があります。宛先とソースが重複する可能性がある場合は、主にmemmoveが使用されます。

于 2012-10-12T11:25:37.197 に答える
0

単純です。バイナリ出力(任意のバイト値)を直接印刷可能なテキストとして扱っています。32(16進20)未満のコードポイントを持つ文字はそうではありません。たとえば、BELLのASCII値(調べてください)は、あなたにとって意味のあるものになる可能性があります。結果のバイトを16進数で出力すると、問題ないはずです。

于 2012-10-12T11:19:51.650 に答える
0

可能であれば、暗号化した後、プレーンテキスト/暗号化されていないメッセージを保持していたメモリをクリアすることをお勧めします。これは優れたコーディング手法ではありませんが、優れた暗号化手法です。

これは次の方法で実行できます:memset(buffer、0、length_of_buffer);

心配しないでください、それはあなたのコンパイラによって最適化されません。実際には、その領域を再び使用するかどうかを判断するのに十分なほど賢くはありません。

于 2012-10-12T11:39:18.030 に答える