Development
C++ 中 ECDSA 的模逆
我已經看到了“模逆”的幾種變體,但我似乎無法確定將它用於 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) 語句更正了由差異引起的符號錯誤。可能有一種更優雅的方法可以做到這一點,但這又快又容易。