2015-10-21 2 views
0

J'utilise la bibliothèque paillier pour la cryptographie.Problème de conversion du pointeur vide en pointeur char

Il existe une fonction à savoir paillier_ciphertext_to_bytes qui convertit en octets. En vérifiant le paillier.h, il a le type de retour void *.

Je voudrais prendre la chaîne générée, que je crois être hexadécimale, et la convertir en un nombre décimal en utilisant strtol.

Cependant, lorsque je convertis la sortie de paillier_ciphertext_to_bytes en un caractère *, cela ne fonctionne pas comme prévu.

C'est mon code

#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; 
} 

Ceci est la sortie que je reçois

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

This est le code de la bibliothèque paillier.h, où je regardais la signature de paillier_ciphertext_to_bytes

Note de côté,

Je veux seulement convertir le cryptage en nombre. En fait, il n'y a aucune raison de croire que paillier_ciphertext_to_bytes peut être converti en un caractère *. Alors, je l'ai aussi essayé de le convertir en un int * puis imprimer sa valeur comme suit

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

Cela me donne toujours un nombre entier, mais je ne suis pas sûr si cela est correct (la représentation décimale de la chaîne cryptée)

EDIT: selon le commentaire de Felix, j'ai essayé ce

#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; 
} 

Mais je reçois des caractères non imprimables dans mon fichier de sortie lorsque je tente d'imprimer myvoid, et quand je castée entier et chaîne, j'obtiens cette sortie

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

Répondre

1

Sans connaître la bibliothèque en question, il est assez clair à partir du nom de la fonction ce qu'il fait: Il vous donne les octets chiffrés réels contenus dans un certain type de conteneur spécifique bibliothèque. Bien sûr, vous pouvez juste prendre comme char * (il n'y a pas besoin de lancer et vous ne devriez pas, mais c'est une autre question).

Les données généralement cryptées contiennent n'importe quelle valeur d'octet, qui inclut 0 ainsi que les caractères non imprimables, etc. Donc, avoir un pointeur char * ne fait pas C string. Qu'est-ce que vous feriez maintenant est encoder dans certains encodage ASCII, souvent base64 est utilisé. Cela vous donnera une représentation de chaîne appropriée pour écrire dans un fichier ou envoyer un email.

À propos de la partie de l'interpréter comme int: C'est une très mauvaise idée. Comme les données cryptées peuvent contenir des valeurs d'octets possibles, elles ne devraient être traitées que comme ceci: octets. Avec int vous pourriez avoir par exemple deux représentations différentes de 0, donc vous perdriez des informations. Et c'est juste un exemple de ce qui pourrait mal tourner.

char * ou void * est le type correct pour une séquence d'octets arbitraires. Bien sûr, pour faire quelque chose d'utile avec cela, vous devez savoir combien d'octets il y a dans la forme cryptée. Regardez dans la documentation de votre bibliothèque pour savoir comment savoir.

+0

s'il vous plaît voir modifier ci-dessus. J'ai regardé la documentation de taille, mais je reçois toujours des caractères non imprimables lorsque je lance (void *) en char * et les imprime. Je ne sais pas si faire (int *) me donne la bonne réponse. – PepperBoy

+0

@PepperBoy Alors s'il vous plaît relisez ma réponse: Quelque chose crypté est généralement une séquence de ** arbitraire ** octets, bien sûr contenant des caractères non imprimables. Les interpréter comme «int» (notez que la taille d'un «int» dépend de votre plate-forme) est presque certainement faux. Si vous voulez quelque chose que vous pouvez imprimer, utilisez par ex. * base64 * pour encoder vos octets dans le texte. –