2015-10-21 138 views
0

我正在使用paillier庫進行加密。將void指針轉換爲char指針時的麻煩

有一個功能,即paillier_ciphertext_to_bytes它轉換爲字節。在檢查paillier.h時,它具有返回類型void *。

我想採取這個生成的字符串,我相信是十六進制,並使用strtol將其轉換爲十進制數。

但是,當我將paillier_ciphertext_to_bytes的輸出轉換爲char *時,它無法按預期工作。

這是我的代碼

#include<stdio.h> 
#include<stdlib.h> 
#include<gmp.h> 
//#include<paillier.h> 
#include"paillier.h" 
#include <string.h> 
#include<malloc.h> 

int main() 
{ 
int n=4; //degree of polynomial 
int i=0; 
char* str; 

paillier_pubkey_t *pub_key=(paillier_pubkey_t *)malloc(sizeof(paillier_pubkey_t)); 
paillier_prvkey_t *prv_key=(paillier_prvkey_t *)malloc(sizeof(paillier_prvkey_t)); 
paillier_keygen(4,&pub_key,&prv_key,paillier_get_rand_devrandom); 

for(i=0;i<n;i++) 
{ 
    unsigned int p=rand()%20; 
    paillier_plaintext_t *ptext = paillier_plaintext_from_ui(p); 


    paillier_ciphertext_t *ctext; 
    ctext = paillier_enc(0, pub_key, ptext, paillier_get_rand_devrandom); 

    str = (char*)paillier_ciphertext_to_bytes(n,ctext); 
    printf("str==[%s]\n",str); 
    printf("number_str==[%d]\n",(int)strtol(str,NULL,16)); 
} 

return 0; 
} 

這是輸出我得到

str==[] 
number_str==[0] 
str==[] 
number_str==[0] 
str==[] 
number_str==[0] 
str==[] 
number_str==[0] 

This是paillier.h庫代碼,在那裏我擡頭的paillier_ciphertext_to_bytes

簽名旁註,

我只想將加密轉換爲數字。其實我沒有理由相信paillier_ciphertext_to_bytes可以轉換成char *。所以,我也試着將其轉換爲int *,然後打印出它的價值如下

int* myintp; 
myintp = (int*)paillier_ciphertext_to_bytes(n,ctext); 
printf("number==[%d]\n",*myintp); 

這總是給我一個整數,但我不知道這是否是正確的(十進制表示加密的字符串

的)編輯: 按照Felix的評論,我已經試過這

#include<stdio.h> 
#include<stdlib.h> 
#include<gmp.h> 
//#include<paillier.h> 
#include"paillier.h" 
#include <string.h> 
#include<malloc.h> 

int main() 
{ 
int n=4; //degree of polynomial 
int i=0; 
void* myvoid; 
FILE* fp; 

fp = fopen("file.txt","a"); 

paillier_pubkey_t *pub_key=(paillier_pubkey_t *)malloc(sizeof(paillier_pubkey_t)); 
paillier_prvkey_t *prv_key=(paillier_prvkey_t *)malloc(sizeof(paillier_prvkey_t)); 
paillier_keygen(4,&pub_key,&prv_key,paillier_get_rand_devrandom); 

for(i=0;i<n;i++) 
{ 
    unsigned int p=rand()%20; 
    paillier_plaintext_t *ptext = paillier_plaintext_from_ui(p); 


    paillier_ciphertext_t *ctext; 
    ctext = paillier_enc(0, pub_key, ptext, paillier_get_rand_devrandom); 

    myvoid=paillier_ciphertext_to_bytes(PAILLIER_BITS_TO_BYTES(pub_key->bits)*2, ctext); 
    fwrite(myvoid, 1, PAILLIER_BITS_TO_BYTES(pub_key->bits)*2, fp); 
    printf("as int : %d\n",*(int*)myvoid); 
    printf("as str : %d\n",(int)strtol((char*)myvoid,NULL,16)); 
} 

fclose(fp); 

return 0; 
} 

但我得到了我的輸出文件不可打印字符,當我嘗試打印myvoid,當我投來整數和字符串,我得到這個輸出

as int : 31136768 
as str : 0 
as int : 493106432 
as str : 0 
as int : 493111552 
as str : 0 
as int : 493092864 
as str : 0 

回答

1

不知道有問題的圖書館,這是由它做什麼的函數的名稱很清楚:它給你包含在某個特定的庫容器外類型的實際加密字節。當然,你可以把它當作char *(不需要投,你不應該,但那是另一個問題)。

通常加密數據包含任何可能的字節值,其包括0以及不可打印的字符等。因此,擁有指向它的char *不會使其成爲C字符串。你現在要做的是編碼它在一些ascii編碼中,通常使用base64。這會給你一個適合寫入文件或發送電子郵件的字符串表示。

關於將其解釋爲int的部分:這是一個非常糟糕的主意。由於加密的數據可以包含任何可能的字節值,因此它應該僅被視爲此:字節。用int你可以有例如0的兩種不同表示,所以你會失去信息。這只是一個可能出錯的例子。

char *void *是任意字節序列的正確類型。當然,要做任何有用的事情,你需要知道加密形式中有多少個字節。查看你圖書館的文檔以瞭解如何知道。

+0

請參閱上面的修改。我查看了大小文檔,但是當我將char *(void *)強制轉換並打印出來時仍然會得到不可打印的字符。我不知道如果(int *)給我正確的答案。 – PepperBoy

+0

@PepperBoy然後請再次閱讀我的答案:加密的東西通常是**任意**字節的序列,當然包含不可打印的字符。將它們解釋爲「int」(注意「int」的大小取決於您的平臺)幾乎肯定是錯誤的。如果您想要打印某些東西,請使用例如* base64 *在文本中編碼你的字節。 –