2011-10-18 15 views
1

私はcでlibmcryptを使い、選択アルゴリズムとしてrijndael-256を使って暗号化と復号化の簡単なテストを実装しようとしています。私は、このテスト実装を、選択されたアルゴリズムとは対照的に、rijndaelのマニュアルページの例に非常に密接に関連させています。 gcc -o encryption_test main.c -lmcryptという文字列でコンパイルすると、次のようなソースコードが生成されます。 暗号化されたメッセージバッファには、j A 8 qj % ` jh = ZЁ j 元の文字列は「 C D Y G v6 s zhC Libmcryptは暗号化/復号化に成功しません

です。明らかに、復号化パートは失敗していますが、そのままです暗号化方式が正しく動作していないと私は信じています。正しい方向に私を指し示すことができるなら、libmcrypt gurusにいくつか質問があります。

まず、この壊れた出力を生成するコード?

第2に、キーサイズやブロックサイズなどの必須の固定サイズを扱う場合、たとえば256ビットのキーでは、32バイトのキー+末尾のヌルバイト、31バイトのキー+末尾のヌルバイト、または32バイトのキーで、33バイト目は無関係ですか?ブロックサイズについても同様の問題があります。

最後に、私が指摘した例の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; 
} 

答えて

1

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

+0

ありがとう、私の問題を解決しました! –