[c#] 如何在C#中實現BN_num_bytes()(和BN_num_bits())?


0 Answers

將評論中的WhozCraig與說明BN_num_bits的鏈接結合起來:

http://www.openssl.org/docs/crypto/BN_num_bytes.html

而你最終會得到這樣的結果,這應該告訴你大量的字節:

public static int NumberOfBytes(BigInteger bigInt)
{
    if (bigInt == 0)
    {
        return 0; //you need to check what BN_num_bits actually does here as not clear from docs, probably returns 0
    }

    return (int)Math.Ceiling(BigInteger.Log(bigInt + 1, 2) + 7) / 8;
}
Question

將這一行從C ++移植到C#,並且我不是一個有經驗的C ++程序員:

 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等於:Source 的單元測試結果不匹配:

  • 0
  • 任何負數
  • 0x00123456

我對BN_num_bytes幾乎一無所知( 編輯:評論剛告訴我這是一個BN_num_bits的宏)

你會驗證這些關於代碼的猜測:

  • 我需要移植((BN_num_bits(bn)+7)/8)的宏的((BN_num_bits(bn)+7)/8) (謝謝​​@WhozCraig)

  • 我需要移植floor(log2(w))+1 BN_num_bits

那麼,如果可能存在前導字節和尾隨字節不計數的情況,那麼在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不返回給定的bignum的有效位的數目,而是返回最重要的1位的位置,這不一定是相同的事情

雖然我仍然不知道它的來源是什麼樣子






Related