Modular Inverse für ECDSA in C++

Ich habe mehrere Variationen von "modular inverse" gesehen, aber ich kann anscheinend nicht die richtige Art und Weise identifizieren, es für C ++ zu verwenden. Ich bin mir nicht sicher, wie dieser Python-Code in C++ übersetzt wird:

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

Meine aktuelle Codierung ist hier: http://coliru.stacked-crooked.com/a/74648b16c2692525

Aber es wird nur wie der erste öffentliche Schlüssel richtig angezeigt, danach vermasselt es sich.

Antworten (2)

#include <openssl/bn.h>

[...]

BN_mod_inverse ( a, b, c, ctx );
Ich habe diese Bibliothek heruntergeladen, aber ich weiß nicht, was ich mit Ihrer Umkehrung machen soll. Ich sende nur zwei Variablen an meine Umkehrung, mit der gearbeitet werden soll. Ich denke, es funktioniert mit der Nummer, die modifiziert werden soll, und der Nummer, von der modifiziert wird.

Ich werde es versuchen, ich codiere nicht oft in C++. Mache meistens Java, und ich bin mit Python völlig unbekannt. Ich habe diesen Code getestet.

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;
}

Es stellt sich heraus, dass Python % anders arbeitet als C++. Die while(inv2 < 0)-Anweisung korrigiert den durch die Differenz verursachten Vorzeichenfehler. Es gibt wahrscheinlich einen eleganteren Weg, dies zu tun, aber das war schnell und einfach.