2 votes

Nombre d'octets dans un pointeur de caractère binaire

J'ai un char * qui contient une chaîne cryptée binaire (en utilisant AES-128, voici la sortie cryptée).

Je dois déterminer le nombre d'octets contenus dans le char * (puisque l'AES 128 utilise une taille de bloc de 16 octets, il devrait s'agir d'un multiple de 16). Quelle est la meilleure façon de déterminer la taille d'un char * contenant des données binaires ? Strlen et sizeof ne semblent pas produire les bons résultats ici (les résultats ne sont pas des incréments de 16). Je peux boucler à travers les valeurs ascii de la chaîne en faisant simplement printf("%d",ptr[i]) lorsque je boucle en utilisant i entre 0 et un nombre arbitrairement grand.

Des idées ?

6voto

Gerco Dries Points 4319

A char* n'a pas de taille explicite définie pour le tampon vers lequel il pointe en C. Il s'agit seulement de l'adresse du premier char dans la mémoire tampon et rien de plus. Si vous avez besoin de la taille du tampon, transmettez-la dans une variable séparée, comme suit :

void decryptBuffer(char* buffer, size_t n)

Remarque : sizeof(buffer) ne vous donnera que la taille du pointeur, et non le nombre d'octets sur lesquels il pointe !

0voto

Milan Points 5703

Il n'y a aucun moyen de connaître la longueur de la chaîne cryptée. Vous savez qu'elle est supérieure à 16 octets et inférieure à la taille de la mémoire tampon. Vous devez connaître le nombre de blocs.

Cela dit, si vous ne pouvez vraiment pas obtenir le nombre de blocs, essayez de décrypter 16 octets, et vérifiez si cela correspond à ce dont vous avez besoin. Si ce n'est pas le cas, décryptez 32 octets et effectuez la vérification jusqu'à la fin de la mémoire tampon ou jusqu'à ce que vous ayez ce dont vous avez besoin.

0voto

Cristian Toader Points 96

La taille du char* dépend de la longueur du bus d'adresse de votre ordinateur et est stockée dans la pile de votre programme. Par exemple, un pointeur de 32 bits devrait avoir une taille de 4 octets. Vous pouvez le savoir en utilisant sizeof(char*).

Le char* pointe vers une adresse mémoire et vous ne pouvez pas savoir quel est le bloc alloué. Si vous avez une chaîne de caractères à cette adresse, vous pouvez simplement la lire jusqu'à ce que vous atteigniez le terminateur de la chaîne ' \0 '. Cependant, s'il ne s'agit que de données binaires, ma solution serait d'encoder la longueur des données au début de votre chaîne encodée et de l'utiliser comme en-tête afin de savoir quand s'arrêter.

Mais de toute façon, comment avez-vous obtenu un objet crypté dans la mémoire ? N'avez-vous pas utilisé une structure quelconque ? Je suppose que vous avez stocké la chaîne cryptée en tant que chaîne.

Veuillez fournir plus de détails.

0voto

BeeBand Points 2241

Comme d'autres l'ont souligné, il n'existe aucun moyen de déterminer le nombre d'octets d'un char * pointe vers.

Les algorithmes AES-128 chiffrent les données par blocs de 16 octets. Si la chaîne d'entrée n'est pas un multiple de 16 octets, l'algorithme utilise un système de remplissage.

Ainsi, le nombre de bits de la sortie cryptée sera égal au nombre de bits de votre chaîne d'entrée, à condition que votre entrée soit un multiple de 16 octets. Si ce n'est pas le cas, la chaîne sera remplacée par le bloc de 16 octets le plus proche. Vous avez vraiment besoin de la taille de la chaîne d'entrée pour faire ce calcul.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X