Функция BN_set_negative
устанавливает отрицательное число.
Отрицательное значение afd72b5835ad22ea5d68279ffac0b6527c1ab0fb31f1e646f728d75cbd3ae65d
на самом деле равно -afd72b5835ad22ea5d68279ffac0b6527c1ab0fb31f1e646f728d75cbd3ae65d
, точно так же, как -2
является отрицательным значением 2
.
ff5028d4a7ca52dd15a297d860053f49ad83e54f04ce0e19b908d728a342c519a3
— большое положительное число.
Причина, по которой вы видите этот номер в Java, связана с вызовом toByteArray
. Согласно документации , он выбирает минимальную ширину поля, которая составляет целое число байтов, а также может содержать представление отрицательного числа в дополнении до двух.
Другими словами, используя функцию toByteArray
для числа, которое в настоящее время имеет 1 знаковый бит и 256 битов значения, вы получите ширину поля 264 бита. Однако, если первый полубайт вашего отрицательного числа был, например, 7
, а не a
, то (согласно этой документации - я на самом деле не пробовал) вы получите 256-битную ширину поля (т.е. 8028d4...
, а не ff8028d4
.
Начальный 00
, который вы использовали в своем коде, не имеет значения в OpenSSL BN. Я не уверен, имеет ли это значение в BigInteger, хотя в документации для этого конструктора говорится: «Представление String состоит из необязательного знака минус или плюс, за которым следует последовательность из одной или нескольких цифр в указанной системе счисления». поэтому тот факт, что он принимает знак минус, предполагает, что если знак минус отсутствует, то ввод обрабатывается как большое положительное число, даже если его старший бит установлен. (Надеюсь, программист на Java сможет прояснить для меня этот абзац).
Убедитесь, что вы четко понимаете различие между большим отрицательным значением и большим положительным числом, полученным с помощью модульной арифметики для этого отрицательного значения, например, как результат toByteArray
.
Итак, ваш вопрос действительно таков: есть ли в Openssl BN функция, которая эмулирует поведение BigInteger.toByteArray()?
Я не знаю, существует ли такая функция (имхо, у библиотеки BN довольно плохая документация, и я никогда не слышал, чтобы она использовалась вне OpenSSL, особенно в программе на C++). Я ожидаю, что нет, так как поведение toByteArray
довольно странное; и в любом случае, все функции вывода BN, по-видимому, выводят с использованием формата знака-величины, а не формата дополнения до двух.
Но чтобы воспроизвести этот результат, вы можете добавить 2^256
или 2^264
к большому отрицательному числу, а затем сделать BN_bn2hex
. В этом конкретном случае добавьте 2^264
. В общем случае вам нужно будет измерить текущую битовую длину сохраняемого числа и округлить показатель степени до ближайшего кратного 8.
Или вы можете даже вывести в формате знака-величины (используя BN_bn2hex
или BN_bn2mpi
), а затем повторить итерацию, инвертируя каждый кусочек и исправляя начало!
NB. Есть ли какая-то конкретная причина, по которой вы хотите использовать OpenSSL BN? Есть много альтернатив.
person
M.M
schedule
21.07.2014
hexStringToBytes(“00
... надеюсь, это ошибка копирования-вставки, а не в исходном файле - person M.M   schedule 19.07.2014BN_set_negative
? - person M.M   schedule 19.07.2014BN_bin2bn
читает только положительные числа; ваш второй абзац примера кода здесь будет генерировать положительное целое число255
. - person M.M   schedule 21.07.2014