29 Stimmen

C++ im Umgang mit sehr großen ganzen Zahlen

Ich verwende den RSA-Algorithmus für die Ver-/Entschlüsselung, und um die Dateien zu entschlüsseln, müssen Sie mit einigen ziemlich großen Werten umgehen. Genauer gesagt, mit Dingen wie

P = C^d % n
  = 62^65 % 133

Nun, das ist wirklich die einzigen Berechnungen, die ill tun werden. Ich habe versucht, mit Matt McCutchen's BigInteger Library, aber ich bin immer eine Menge von Compiler-Fehler während der Verknüpfung, wie:

encryption.o(.text+0x187):encryption.cpp: undefined reference to `BigInteger::BigInteger(int)'

encryption.o(.text+0x302):encryption.cpp: undefined reference to `operator<<(std::ostream&, BigInteger const&)'

encryption.o(.text$_ZNK10BigIntegermlERKS_[BigInteger::operator*(BigInteger const&) const]+0x63):encryption.cpp: undefined reference to `BigInteger::multiply(BigInteger const&, BigInteger const&)'

Also fragte ich mich, was wäre der beste Weg, um über den Umgang mit den wirklich großen ganzen Zahlen, die aus dem RSA-Algorithmus kommen zu gehen.

Ich habe gehört, dass es eine Möglichkeit wäre, die Variablen als double long zu deklarieren, also...

long long decryptedCharacter;

aber ich bin mir nicht sicher, wie groß eine ganze Zahl sein kann, die gespeichert werden kann.


Ich versuche zum Beispiel, das folgende Programm mit dev C++ zu kompilieren und auszuführen:

#include iostream

#include "bigint\BigIntegerLibrary.hh"

using namespace std;

int main()
{
    BigInteger a = 65536;
    cout << (a * a * a * a * a * a * a * a);
    return 0;
}

dann erhalte ich diese Fehler.

Derek, ich dachte, dass durch die Einbeziehung der BigIntegerLibrary.hh Datei, die der Compiler durchgehen und alle notwendigen Dateien kompilieren würde, die er verwenden wird.

Wie sollte ich versuchen, das obige Programm zu kompilieren, um die Verknüpfungsfehler zu beheben?

1voto

Scott Langham Punkte 55597

Lesen Sie die Dokumentation Ihres Compilers. Einige Compiler haben Typen wie __int64 definiert, die ihre Größe angeben. Vielleicht haben Sie einige von ihnen zur Verfügung.

1voto

David Ameller Punkte 1758

Nur zur Erinnerung: __int64 und long long sind nicht standardisierte Erweiterungen. Beide werden garantiert nicht von allen C++-Compilern unterstützt. C++ basiert auf C89 (es kam 98 heraus, also kann es nicht auf C99 basieren)

(C bietet seit C99 Unterstützung für 'long long')

Übrigens glaube ich nicht, dass 64-Bit-Ganzzahlen dieses Problem lösen.

1voto

adum Punkte 2760

Ich hatte viel Erfolg mit der Verwendung der LibTomCrypt Bibliothek für meine Krypto-Bedürfnisse. Sie ist schnell, schlank und portabel. Es kann Ihre RSA für Sie tun, oder nur die Mathematik behandeln, wenn Sie wollen.

0voto

Maciej Hehl Punkte 7725

Die Tatsache, dass Sie ein Problem mit der Verwendung einer Biginteger-Bibliothek haben, bedeutet nicht, dass es ein schlechter Ansatz ist.

Die Verwendung von "long long" ist definitiv ein schlechter Ansatz.

Wie andere bereits gesagt haben, ist die Verwendung einer Biginteger-Bibliothek wahrscheinlich ein guter Ansatz, aber Sie müssen mehr Details über die Art und Weise posten, wie Sie die genannte Bibliothek verwenden, damit wir Ihnen bei der Behebung dieser Fehler helfen können.

0voto

Vaibhav Bajpai Punkte 15690

Ich habe GMP verwendet, als ich die RSA-Implementierung schrieb.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X