Development

C++ 中 ECDSA 的模逆

  • October 13, 2016

我已經看到了“模逆”的幾種變體,但我似乎無法確定將它用於 C++ 的正確方法。我不確定這個 python 程式碼是如何轉換成 c++ 的:

def inverse(x, p):

"""
Calculate the modular inverse of x ( mod p )
the modular inverse is a number such that:
(inverse(x, p) * x) % p == 1
you could think of this as: 1/x
"""
inv1 = 1
inv2 = 0
while p != 1 and p!=0:
inv1, inv2 = inv2, inv1 - inv2 * (x / p)
x, p = p, x % p

return inv2

我目前的編碼在這裡: http ://coliru.stacked-crooked.com/a/74648b16c2692525

但它只正確顯示第一個公鑰,之後它就搞砸了。

#include <openssl/bn.h>

[...]

BN_mod_inverse ( a, b, c, ctx );

我會試一試,我不經常用 C++ 編寫程式碼。主要做Java,對python完全不熟悉。我已經測試了這段程式碼。

int inverse(int x,int p)
{
 int orig = p;
 int inv1 = 1;
 int inv2 = 0;
 while(p != 1 && p != 0)
 {
   int temp = inv2;
   inv2 = inv1 - inv2 * (x/p);
   inv1 = temp;
   temp = p;
   p = x % p;
   x = temp;
 }
 while(inv2 < 0)
   inv2 += orig;
 return inv2;
}

事實證明,python 的作用與 C++ 不同。while(inv2 < 0) 語句更正了由差異引起的符號錯誤。可能有一種更優雅的方法可以做到這一點,但這又快又容易。

引用自:https://bitcoin.stackexchange.com/questions/28115