2011-05-03 80 views
3

我试图将加密数据写入文件。但是,当它重新读入程序并尝试解密时,我只会将垃圾回收。没有写入文件似乎工作..我做错了什么?Mcrypt库写入文件的结果

下面的代码:

MCRYPT td, td2;  
char * string = "My secret message"; 
int i; 
char *key; /* created using mcrypt_gen_key */ 
char *IV; 
char * block_buffer; 
int blocksize; 
int keysize = 32; /* 192 bits == 24 bytes */ 
key = calloc(1, keysize); 
strcpy(key, "This-is-my-key#########"); 
td = mcrypt_module_open("saferplus", NULL, "cbc", NULL); 
td2 = mcrypt_module_open("saferplus", NULL, "cbc", NULL); 

blocksize = mcrypt_enc_get_block_size(td); 
block_buffer = malloc(blocksize); 
IV=malloc(mcrypt_enc_get_iv_size(td)); 
for (i=0; i < mcrypt_enc_get_iv_size(td); i++) { 
IV[i]=rand(); 
} 
mcrypt_generic_init(td, key, keysize, IV); 
mcrypt_generic_init(td2, key, keysize, IV); 
strcpy(block_buffer, string); 

printf("1: %s\n", block_buffer); 
mcrypt_generic (td, block_buffer, blocksize); 

FILE *myFile; 
myFile = fopen("encrypted","ab"); 
fwrite(block_buffer, 1, blocksize, myFile); 
fclose(myFile); 
printf("2: %s\n", block_buffer); 

myFile = fopen("encrypted","rb"); 
fread(block_buffer, 1, blocksize, myFile); 
fclose(myFile); 

printf("2.5: %s\n", block_buffer); 

mdecrypt_generic (td2, block_buffer, blocksize); 
printf("3: %s\n", block_buffer); 


/* deinitialize the encryption thread */ 
mcrypt_generic_deinit (td); 
mcrypt_generic_deinit(td2); 
/* Unload the loaded module */ 
mcrypt_module_close(td); 
mcrypt_module_close(td2); 

return 0; 
+1

为什么要打开文件来追加('myFile = fopen(“encrypted”,“ab”);')而不是简单的书写?运行程序时文件是否已经存在?你有没有比较'加密'hexdump与你的内存缓冲区? – 2011-05-04 00:57:13

+0

谢谢亩,我第一次打开它只是使用一个。我想也许有些信息会因为格式化而丢失,所以我想尝试保存并以二进制打开它,看看它是否会有所作为。我如何去做一个hexdump?一个教程的链接就足够了。 – 2011-05-04 11:09:02

回答

0

这工作。我想你只需要初始化block_buffer。

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

int main() 
{ 
    MCRYPT td, td2; 
    char * string = "My secret message"; 
    int i; 
    char *key; /* created using mcrypt_gen_key */ 
    char *IV; 
    char * block_buffer; 
    int blocksize; 
    int keysize = 32; /* 192 bits == 24 bytes */ 
    FILE *myFile; 

    key = calloc(1, keysize); 
    strcpy(key, "This-is-my-key#########"); 
    td = mcrypt_module_open("saferplus", NULL, "cbc", NULL); 
    td2 = mcrypt_module_open("saferplus", NULL, "cbc", NULL); 

    blocksize = mcrypt_enc_get_block_size(td); 
    block_buffer = calloc(1, blocksize); /* Fixed issue here */ 
    IV = malloc(mcrypt_enc_get_iv_size(td)); 
    if ((block_buffer == NULL) || (IV == NULL)) { 
      fprintf(stderr, "Failed to allocate memory\n"); 
      exit(EXIT_FAILURE); 
    } 
    for (i = 0; i < mcrypt_enc_get_iv_size(td); i++) { 
      IV[i] = rand(); 
    } 
    mcrypt_generic_init(td, key, keysize, IV); 
    mcrypt_generic_init(td2, key, keysize, IV); 
    strcpy(block_buffer, string); 

    printf("1: %s\n", block_buffer); 
    mcrypt_generic (td, block_buffer, blocksize); 

    myFile = fopen("encrypted","w"); 
    if ((myFile == NULL) || (fwrite(block_buffer, blocksize, 1, myFile) != 1)) { 
      fprintf(stderr, "Failed to write data\n"); 
      exit(EXIT_FAILURE); 
    } 
    fclose(myFile); 
    printf("2: %s\n", block_buffer); 

    myFile = fopen("encrypted","r"); 
    if ((myFile == NULL) || (fread(block_buffer, blocksize, 1, myFile) != 1)) { 
      fprintf(stderr, "Failed to read data\n"); 
      exit(EXIT_FAILURE); 
    } 
    fclose(myFile); 

    printf("2.5: %s\n", block_buffer); 

    mdecrypt_generic (td2, block_buffer, blocksize); 
    printf("3: %s\n", block_buffer); 

    /* deinitialize the encryption thread */ 
    mcrypt_generic_deinit (td); 
    mcrypt_generic_deinit(td2); 
    /* Unload the loaded module */ 
    mcrypt_module_close(td); 
    mcrypt_module_close(td2); 

    return 0; 
}