Я переносит эту строку с С++ на С#, и я не являюсь опытным программистом на С++:
unsigned int nSize = BN_num_bytes(this);
В .NET я используя System.Numerics.BigInteger
BigInteger num = originalBigNumber;
byte[] numAsBytes = num.ToByteArray();
uint compactBitsRepresentation = 0;
uint size2 = (uint)numAsBytes.Length;
Я думаю, что существует фундаментальное различие в том, как они работают внутри страны, поскольку результаты тестирования модулей источника не соответствуют, если BigInt равно:
- 0
- Любое отрицательное число
- 0x00123456
Я ничего не знаю о BN_num_bytes
(редактирование: комментарии просто сказали мне, что это макрос для BN_num_bits).
Вопрос
Вы проверили бы эти предположения о коде:
-
Мне нужно порт
BN_num_bytes
, который является макросом для((BN_num_bits(bn)+7)/8)
(Спасибо @WhozCraig) -
Мне нужно порт
BN_num_bits
, которыйfloor(log2(w))+1
Тогда, если существует вероятность того, что ведущий и конечный байты не учитываются, то что происходит на машинах Big/Little endian? Это имеет значение?
На основе этих ответов на Security.StackExchange, и что мое приложение не критично для производительности, я могу использовать реализацию по умолчанию в .NET и не использовать альтернативный библиотека, которая может уже реализовать сопоставимые методы обхода.
Изменить: пока моя реализация выглядит примерно так, но я не уверен, что "LookupTable" указан в комментариях.
private static int BN_num_bytes(byte[] numAsBytes)
{
int bits = BN_num_bits(numAsBytes);
return (bits + 7) / 8;
}
private static int BN_num_bits(byte[] numAsBytes)
{
var log2 = Math.Log(numAsBytes.Length, 2);
var floor = Math.Floor(log2);
return (uint)floor + 1;
}
Изменить 2:
После очередного поиска я обнаружил, что:
BN_num_bits не возвращает число значимых бит заданного бигнама, а скорее положение наиболее значимого 1 бит, что не обязательно одно и то же.
Хотя я до сих пор не знаю, как выглядит источник этого...