Количество байтов в двоичном символьном указателе - PullRequest
0 голосов
/ 25 февраля 2011

У меня есть символ *, который содержит двоичную зашифрованную строку (с использованием AES-128 это зашифрованный вывод).

Мне нужно выяснить, сколько байтов содержится в символе * (поскольку AES 128 используетразмер блока 16 байт должен быть кратным 16).Каков наилучший способ определить размер символа *, который содержит двоичные данные?Кажется, что Strlen и sizeof не дают правильных результатов (результаты не равны 16).Я могу перебрать значения строки ascii, просто выполнив printf ("% d", ptr [i]), когда перебираю через i между 0 и каким-то произвольно большим числом.

Есть идеи здесь?

Ответы [ 4 ]

5 голосов
/ 25 февраля 2011

A char* не имеет явного размера, определенного для буфера, на который он указывает в C. Это только адрес первого char в буфере и ничего более. Если вам нужен размер буфера, передайте его в отдельной переменной, например:

void decryptBuffer(char* buffer, size_t n)

Примечание: sizeof(buffer) даст вам только размер указателя, а не количество байтов, на которые он указывает!

0 голосов
/ 25 февраля 2011

Как отмечали другие люди, невозможно определить, сколько байтов указывает char *.

Алгоритмы AES-128 шифруют данные в блоках по 16 байт, и если входная строка не кратна 16 байтам, алгоритм будет использовать схему заполнения.

Таким образом, число битов в зашифрованном выводе будет равно количеству битов в вашей входной строке, если ваш ввод кратен 16 байтам. Если нет, то он будет дополнен до ближайшего 16-байтового блока. Вам действительно нужен размер входной строки, чтобы решить это.

0 голосов
/ 25 февраля 2011

Размер символа * зависит от длины адресной шины вашего компьютера и хранится в стеке вашей программы.Например, 32-битный указатель должен иметь размер 4 байта.Действительно, вы можете узнать это, используя sizeof (char *).

Символ * указывает на адрес памяти, и вы не можете просто знать, что является выделенным блоком.Если по этому адресу у вас действительно есть строка, которую вы можете просто прочитать, пока не достигнете конца строки '\ 0'.Однако, если он просто указывает на двоичные данные, моим решением было бы закодировать длину данных в начале вашей закодированной строки и использовать ее в качестве заголовка, чтобы вы знали, когда нужно остановиться.

Но какВы все равно получили зашифрованный объект в памяти?Разве вы не использовали какую-то структуру?Я предполагаю, что вы сохранили зашифрованную строку в виде строки.

Пожалуйста, предоставьте более подробную информацию ..

0 голосов
/ 25 февраля 2011

Нет способа узнать, какова длина зашифрованной строки.Вы знаете, что это больше, чем 16 байтов и меньше, чем размер буфера.Вы должны знать количество блоков.

С учетом сказанного, если вы действительно не можете получить количество блоков, попробуйте расшифровать 16 байт и проверьте, что вам нужно.Если нет, расшифруйте 32 байта и выполняйте проверку до конца буфера или до тех пор, пока не получите то, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...