我正在使用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
請參閱上面的修改。我查看了大小文檔,但是當我將char *(void *)強制轉換並打印出來時仍然會得到不可打印的字符。我不知道如果(int *)給我正確的答案。 – PepperBoy
@PepperBoy然後請再次閱讀我的答案:加密的東西通常是**任意**字節的序列,當然包含不可打印的字符。將它們解釋爲「int」(注意「int」的大小取決於您的平臺)幾乎肯定是錯誤的。如果您想要打印某些東西,請使用例如* base64 *在文本中編碼你的字節。 –