>

crypt->public_key->data 를 쓰려고합니다  이진 파일로. sizeof(unsigned int) 크기를 사용하면   fwrite() 의 두 번째 주장으로 , 효과가있다. 그러나 unsigned short * 로 선언됩니다  헤더 파일을 입력하십시오. 왜 그렇게 작동하는지 잘 모르겠습니다. 또한 공개 키를 작성하고 읽을 때 문제가 있습니다. fwrite() 에서 정확히 동일한 유형의 크기를 사용하지만  그리고 fread() .

편집 : usr2564301에서 지적한대로 crypt->public_key->데이터의 크기가 올바르지 않은 것 같습니다.

*이 코드의 출처를 인용해야하는지 잘 모르겠습니다. 그러나 여기에 URL을 추가하겠습니다. https://github.com/Varad0612/The-McEliece -Cryptosystem

matrix.h의 코드

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

    독서 진술에 혼란이 있습니다 :

    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 */
    }
    
    

관련 자료

  • 이전 파이썬으로 Pycharm 출력 경로 파일을 설정하는 방법
  • 다음 c# - 이름이 같은 로컬 함수가 포함 된 함수를 재귀 적으로 호출하는 방법은 무엇입니까?