Запись и чтение двоичного файла - PullRequest
0 голосов
/ 24 июня 2018

Я пытаюсь записать crypt->public_key->data в двоичный файл. Если я использую размер sizeof(unsigned int) в качестве второго аргумента в fwrite(), это работает. Тем не менее, он объявлен как unsigned short * тип в заголовочном файле. Я не уверен, почему это ведет себя так. Кроме того, я сталкиваюсь с проблемой при написании открытого ключа и чтении их. Хотя я использую размер точно такого же типа в fwrite() и fread().

Редактировать: Похоже, что размер моих crypt-> public_key-> data неверен, как указано usr2564301.

* Я не уверен, нужно ли мне ссылаться на источник этого кода или нет. Но я добавлю сюда URL: https://github.com/Varad0612/The-McEliece-Cryptosystem

код из матрицы. Ч

typedef struct matrix
{
   int rows;             //number of rows.
   int cols;             //number of columns.
   unsigned short *data;
}*bin_matrix;

Это код от mceliece.c

//Initialize the mceliece cryptosystem
mcc mceliece_init(int n0, int p, int w, int t)
{
    FILE *publicKey, *privateKey;
    mcc crypt;  
    crypt = (mcc)safe_malloc(sizeof(struct mceliece));  
    //crypt->code = qc_mdpc_init(n0, p, w, t);
    //crypt->public_key = generator_matrix(crypt->code);

    //printf("%d\n",crypt->public_key->rows);
    //printf("%d\n",crypt->public_key->cols);

    //Write public key into a binary file
    /*publicKey = fopen("PublicKey.bin", "wb");
    privateKey = fopen("PrivateKey.bin", "wb");

    if(privateKey != NULL){
        fwrite(crypt->code->row, n0*p*sizeof(unsigned short), n0 * p, privateKey);
        fclose(privateKey); 
    }
    else{
        printf("Unable to write private key\n");    
    }

    //Write public key into a binary file
    if(publicKey != NULL){
        fwrite(crypt->public_key->data, p*p*n0*sizeof(unsigned short), crypt->public_key->rows*crypt->public_key->cols, publicKey);
        fclose(publicKey);
    }
    else{
        printf("Unable to write public key\n");
    }*/

    //Read private key from a binary file
    crypt->code = (mdpc)safe_malloc(sizeof(struct qc_mdpc));
    crypt->code->n0 = n0;
    crypt->code->p = p;
    crypt->code->w = w;
    crypt->code->t = t;
    crypt->code->n = n0 * p;
    crypt->code->r = p;
    crypt->code->k = (n0 - 1) * p;
    crypt->code->row = (unsigned short*)calloc(n0 * p, sizeof(unsigned short));
    privateKey = fopen("PrivateKey.bin", "rb");
    if(privateKey != NULL){
        fread(crypt->code->row, p*n0*sizeof(unsigned short), p*n0, privateKey);
        fclose(privateKey); 
    }
    else
        printf("Unable to read private key\n");

    //Read public key from a binary file
    /*crypt->public_key = (bin_matrix)safe_malloc(sizeof(struct matrix));
    crypt->public_key->data = (unsigned short*)safe_malloc(p*p*n0*sizeof(unsigned short));
    crypt->public_key->rows = p;
    crypt->public_key->cols = n0*p; 
    publicKey = fopen("PublicKey.bin", "rb");
    if(publicKey != NULL){
        fread(crypt->public_key->data, p*p*n0*sizeof(unsigned short), crypt->public_key->rows*crypt->public_key->cols, publicKey);
        fclose(publicKey);  
    }
    else{
        printf("Unable to read public key\n");
    }*/

    printf("Successful\n");
    //printf("mceliece generated...\n");
    return crypt;
}

1 Ответ

0 голосов
/ 24 июня 2018

В нашем операторе чтения есть путаница:

fread(crypt->code->row, p*n0*sizeof(unsigned short), p*n0, privateKey);

Это попытается прочитать p*n0 элементов, каждый размером p*n0*sizeof(unsigned short) байт.Если файл не больше выделенного размера, вам повезет, поскольку fread не будет пытаться записывать после конца выделенного блока.

Вместо этого следует написать:

size_t nread = fread(crypt->code->row, sizeof(unsigned short), p * n0, privateKey);
if (nread == p * n0) {
    /* private key was read successfully */
} else {
    /* file is too short, only nread words were read */
}
...