1

私はcでlibmcryptを使用しており、選択したアルゴリズムとしてrijndael-256を使用して、暗号化と復号化の簡単なテストを実装しようとしています。このテストの実装は、選択したアルゴリズムとは対照的に、rijndaelを使用したmanページの例に非常によく似ています。文字列gcc-oencoding_test main.c -lmcryptを使用してコンパイルすると、次のソースコードは次のような出力を生成します。暗号化されたメッセージバッファにはj��A��8�qj��%`��jh���=ZЁが含まれます �j元の文字列は��m"�C��D�����Y�G�v6��s��zh�</p>でした

明らかに、復号化部分は失敗していますが、これは単一の関数呼び出しであるため、暗号化スキームも正しく動作していないと私は信じています。あなたが私を正しい方向に向けることができれば、私はそこにあるlibmcryptの達人にいくつか質問があります。

まず、このコードがこの壊れた出力を生成する原因は何ですか?

次に、キーサイズやブロックサイズなどの必須の固定サイズを処理する場合、たとえば256ビットキーは、32バイトのキー+末尾のnullバイト、31バイトのキー+末尾のnullを予期しますか?バイト、または33バイトが無関係な32バイトのキー?同じ質問がブロックサイズにも当てはまります。

最後に、私が指摘した例の1つは、暗号化呼び出しに提供するキーテキストのハッシュを生成するためにmhashを使用しました。これはもちろん望ましいですが、コメントアウトされており、mhashでのリンクは失敗しているようです。libmcryptを使用するときに、このタイプのキー変換を処理するために受け入れられている方法は何ですか?すでに壊れているコードがさらに複雑になるのを防ぐために、このような複雑さを省くことを選択しましたが、これを最終的な設計に組み込みたいと思います。問題のソースコードは次のとおりです。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <mcrypt.h>

int main(int argc, char *argv[])
{
MCRYPT mfd;
char *key;
char *plaintext;
char *IV;
unsigned char *message, *buffered_message, *ptr;
int i, blocks, key_size = 32, block_size = 32;

message = "Test Message";

/** Buffer message for encryption */    
blocks              = (int) (strlen(message) / block_size) + 1;
buffered_message    = calloc(1, (blocks * block_size));

key = calloc(1, key_size);
strcpy(key, "&*GHLKPK7G1SD4CF%6HJ0(IV#X6f0(PK");

mfd = mcrypt_module_open(MCRYPT_RIJNDAEL_256, NULL, "cbc", NULL);

if(mfd == MCRYPT_FAILED)
{
    printf("Mcrypt module open failed.\n");
    return 1;
}

/** Generate random IV */
srand(time(0));
IV = malloc(mcrypt_enc_get_iv_size(mfd));
for(i = 0; i < mcrypt_enc_get_iv_size(mfd); i++)
{
    IV[i] = rand();
}

/** Initialize cipher with key and IV */
i = mcrypt_generic_init(mfd, key, key_size, IV);
if(i < 0)
{
    mcrypt_perror(i);
    return 1;
}

strncpy(buffered_message, message, strlen(message));    
mcrypt_generic(mfd, buffered_message, block_size);
printf("The encrypted message buffer contains %s\n", buffered_message);
mdecrypt_generic(mfd, buffered_message, block_size);
printf("The original string was %s\n", buffered_message);
mcrypt_generic_deinit(mfd);
mcrypt_module_close(mfd);
return 0;
}
4

1 に答える 1

1

復号化のために記述子を再初期化する必要がありmfdます。暗号化と復号化の両方に同じ記述子を使用することはできません。

于 2011-10-18T15:21:50.303 に答える