BN_bn2bin "создает действительно двоичное представление (то есть последовательность битов). Более конкретно, оно создает представление числа с прямым порядком байтов".Так что это не просто массив из 0 и 1, верно?
Упомянутая здесь последовательность битов представлена в виде массива байтов.С каждым из этих байтов, содержащих 8 битов, это можно интерпретировать как «массив из 0 и 1».Это не «массив целых чисел, который имеет значение 0 или 1», если это то, что вы спрашиваете.
Поскольку вы не знаете, как работает BN_bn2bin()
, это помогает просто проанализировать конецрезультат вашего кода.Вы можете сделать это следующим образом (без проверки ошибок):
#include <stdio.h>
#include <openssl/bn.h>
int main(
int argc,
char **argv)
{
const char *hexString = argv[1];
BIGNUM *bnEncr = BN_new();
BN_hex2bn(&bnEncr, hexString);
unsigned int numOfBytesEncr = BN_num_bytes(bnEncr);
unsigned char encrBin[numOfBytesEncr];
BN_bn2bin(bnEncr, encrBin);
fwrite(encrBin, 1, numOfBytesEncr, stdout);
}
Это выводит содержимое encrBin
на стандартный вывод, что никогда не бывает приятно, но вы можете затем передать это по конвейеру.с помощью инструмента, подобного hexdump
, или перенаправьте его в файл для анализа с помощью шестнадцатеричного редактора.Это выглядит так:
$ ./bntest 74162ac74759e85654e0e7762c2cdd26 | hexdump -C
00000000 74 16 2a c7 47 59 e8 56 54 e0 e7 76 2c 2c dd 26 |t.*.GY.VT..v,,.&|
00000010
Или, если вы хотите увидеть эти 0 и 1:
$ ./bntest 74162ac74759e85654e0e7762c2cdd26 | xxd -b -c 4
00000000: 01110100 00010110 00101010 11000111 t.*.
00000004: 01000111 01011001 11101000 01010110 GY.V
00000008: 01010100 11100000 11100111 01110110 T..v
0000000c: 00101100 00101100 11011101 00100110 ,,.&
Это показывает, что ваш вопрос
Может кто-нибудь объяснить, как я могу сам сделать шестнадцатеричное (> истинно) двоичное преобразование в C, чтобы я получил формат, ожидаемый EVP_DecryptUpdate?Это сложно?
по сути такой же, как и вопрос SO Как превратить шестнадцатеричную строку в массив без знака? , как я прокомментировал .