私は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;
}