Remove useless data from the CRT private key.
authorUmmon <greg.burri@gmail.com>
Thu, 25 Dec 2014 10:47:44 +0000 (11:47 +0100)
committerUmmon <greg.burri@gmail.com>
Thu, 25 Dec 2014 10:47:44 +0000 (11:47 +0100)
rapport/main.tex
src/RsaCrt.cpp
src/RsaCrt.h
src/Tests.cpp
src/lab3.qbs
src/main.cpp

index eeeafa4..f2e5ba5 100644 (file)
 
 L'implémentation utilise le langage \emph{C++11}, le compilateur \emph{GCC} 4.9.1, la \emph{library} \emph{GMP} 6.0.0 ainsi que la système de \emph{build} \emph{QBS}~\footnote{\url{http://qt-project.org/wiki/qbs}}.
 
 
 L'implémentation utilise le langage \emph{C++11}, le compilateur \emph{GCC} 4.9.1, la \emph{library} \emph{GMP} 6.0.0 ainsi que la système de \emph{build} \emph{QBS}~\footnote{\url{http://qt-project.org/wiki/qbs}}.
 
-Le fichier \emph{*.qbs} peut-être ouvert à l'aide de \emph{Qt Creator}~\footnote{\url{http://qt-project.org/wiki/Category:Tools::QtCreator}}
+Le fichier \emph{*.qbs} peut-être ouvert à l'aide de l'environnement de développement \emph{Qt Creator}~\footnote{\url{http://qt-project.org/wiki/Category:Tools::QtCreator}}.
 
 
 \subsubsection*{Question 1.1 : Comment s'assure-t-on que les routines implémentées fonctionnent correctement ?}
 
 
 
 \subsubsection*{Question 1.1 : Comment s'assure-t-on que les routines implémentées fonctionnent correctement ?}
 
-Pour chaque version, standard et restes chinois, une paire de clefs est générée puis trois messages sont testés avec des valeurs différentes correspondantes à $n$, $n-1$ et $n / 2$. Pour le premier cas la vérification de la signature ne doit pas fonctionner car le message est trop grand, dans les deux autres cas, on vérifie la signature ainsi qu'une signature altérée (incrémentée de 1).
+Pour chaque version, standard et restes chinois, une paire de clefs est générée puis trois messages sont testés avec des valeurs différentes correspondantes à $n$, $n-1$ et $n / 2$. Pour le premier cas la vérification de la signature ne doit pas fonctionner car le \emph{plaintext} est trop grand, dans les deux autres cas, on vérifie la signature ainsi qu'une signature altérée (incrémentée de 1).
 
 Les tests peuvent être lancés avec la commande suivante :
 
 
 Les tests peuvent être lancés avec la commande suivante :
 
@@ -69,16 +69,22 @@ La génération de signature avec \emph{RSA CRT} est en moyenne 3.25 fois plus r
 
 \subsubsection*{Question 1.3 : Quels sont les valeurs que l'on peut pré-calculer est stocker hormis $n$ et $d$ afin d'améliorer la vitesse de calcul d'une signature avec \emph{RSA-CRT} ?}
 
 
 \subsubsection*{Question 1.3 : Quels sont les valeurs que l'on peut pré-calculer est stocker hormis $n$ et $d$ afin d'améliorer la vitesse de calcul d'une signature avec \emph{RSA-CRT} ?}
 
+[TODO]
+
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{L'attaque de \emph{Boneh-DeMillo-Lipton}}
 
 \subsection{Fonctionnement}
 
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 \section{L'attaque de \emph{Boneh-DeMillo-Lipton}}
 
 \subsection{Fonctionnement}
 
+http://crypto.stanford.edu/~dabo/abstracts/faults.html
+
 (maths)
 
 \subsubsection*{Question 2.1 : En pratique, comment est-il possible d'introduire des fautes dans l'implémentation d'un algorithme cryptographique ?}
 
 (maths)
 
 \subsubsection*{Question 2.1 : En pratique, comment est-il possible d'introduire des fautes dans l'implémentation d'un algorithme cryptographique ?}
 
+
+
 \subsubsection*{Est-ce que cette attaque fonctionne dans le cas d'un bourrage non détérministe ?}
 
 
 \subsubsection*{Est-ce que cette attaque fonctionne dans le cas d'un bourrage non détérministe ?}
 
 
index 19bc4d7..ff3f21e 100644 (file)
@@ -7,25 +7,26 @@ using namespace std;
 
 pair<Rsa::KeyPub, RsaCrt::KeyPriv> RsaCrt::generateRSAKeys(uint exponent, uint keySizeBits)
 {
 
 pair<Rsa::KeyPub, RsaCrt::KeyPriv> RsaCrt::generateRSAKeys(uint exponent, uint keySizeBits)
 {
-   mpz_class phi;
+   mpz_class phi, d;
    Rsa::KeyPub kPub;
    KeyPriv kPriv;
 
    do
    {
    Rsa::KeyPub kPub;
    KeyPriv kPriv;
 
    do
    {
-      kPub.e = kPriv.e = exponent;
+      kPub.e = exponent;
       kPriv.p = Rand::randPrime(keySizeBits / 2);
       kPriv.q = Rand::randPrime(keySizeBits / 2);
 
       kPriv.p = Rand::randPrime(keySizeBits / 2);
       kPriv.q = Rand::randPrime(keySizeBits / 2);
 
-      kPriv.n = kPub.n = kPriv.p * kPriv.q;
+      kPub.n = kPriv.p * kPriv.q;
       phi = (kPriv.p - 1) * (kPriv.q - 1);
 
    // d = e^-1 (mode phi).
       phi = (kPriv.p - 1) * (kPriv.q - 1);
 
    // d = e^-1 (mode phi).
-   } while (mpz_invert(kPriv.d.get_mpz_t(), kPub.e.get_mpz_t(), phi.get_mpz_t()) == 0);
+   } while (mpz_invert(d.get_mpz_t(), kPub.e.get_mpz_t(), phi.get_mpz_t()) == 0);
 
 
-   kPriv.dp = kPriv.d % (kPriv.p - 1);
-   kPriv.dq = kPriv.d % (kPriv.q - 1);
+   kPriv.dp = d % (kPriv.p - 1);
+   kPriv.dq = d % (kPriv.q - 1);
 
 
+   // qInv = q^-1 (mod p)
    mpz_invert(kPriv.qInv.get_mpz_t(), kPriv.q.get_mpz_t(), kPriv.p.get_mpz_t());
 
    return make_pair(kPub, kPriv);
    mpz_invert(kPriv.qInv.get_mpz_t(), kPriv.q.get_mpz_t(), kPriv.p.get_mpz_t());
 
    return make_pair(kPub, kPriv);
index 2341939..373d583 100644 (file)
@@ -11,15 +11,11 @@ class RsaCrt
 {
 public:
    struct KeyPriv {
 {
 public:
    struct KeyPriv {
-      mpz_class n; // Modulus.
-      uint e; // Exponent.
-
       mpz_class p;
       mpz_class q;
       mpz_class dp;
       mpz_class dq;
       mpz_class qInv;
       mpz_class p;
       mpz_class q;
       mpz_class dp;
       mpz_class dq;
       mpz_class qInv;
-      mpz_class d;
    };
 
    static std::pair<Rsa::KeyPub, KeyPriv> generateRSAKeys(uint exponent, uint keySizeBits);
    };
 
    static std::pair<Rsa::KeyPub, KeyPriv> generateRSAKeys(uint exponent, uint keySizeBits);
index f45cc0c..92bccd0 100644 (file)
@@ -84,21 +84,21 @@ bool Tests::rsaCrt()
    const auto& kPriv = keys.second;
 
    {
    const auto& kPriv = keys.second;
 
    {
-      mpz_class message = kPriv.n;
+      mpz_class message = kPub.n;
       mpz_class signature = RsaCrt::sign(message, kPriv);
       mpz_class signature = RsaCrt::sign(message, kPriv);
-      if (Rsa::verifySignature(message, signature, kPub)) // Must not be able to signe message greater than kPriv.n.
+      if (Rsa::verifySignature(message, signature, kPub)) // Must not be able to signe message greater than kPub.n.
          return false;
    }
 
    {
          return false;
    }
 
    {
-      mpz_class message = kPriv.n - 1;
+      mpz_class message = kPub.n - 1;
       mpz_class signature = RsaCrt::sign(message, kPriv);
       if (!Rsa::verifySignature(message, signature, kPub) || Rsa::verifySignature(message + 1, signature, kPub))
          return false;
    }
 
    {
       mpz_class signature = RsaCrt::sign(message, kPriv);
       if (!Rsa::verifySignature(message, signature, kPub) || Rsa::verifySignature(message + 1, signature, kPub))
          return false;
    }
 
    {
-      mpz_class message = kPriv.n / 2;
+      mpz_class message = kPub.n / 2;
       mpz_class signature = RsaCrt::sign(message, kPriv);
       if (!Rsa::verifySignature(message, signature, kPub) || Rsa::verifySignature(message + 1, signature, kPub))
          return false;
       mpz_class signature = RsaCrt::sign(message, kPriv);
       if (!Rsa::verifySignature(message, signature, kPub) || Rsa::verifySignature(message + 1, signature, kPub))
          return false;
index 2cdba34..148f7b4 100644 (file)
@@ -9,15 +9,6 @@ Product {
    cpp.commonCompilerFlags: ["-std=c++11"]
    cpp.staticLibraries: ["gmp", "gmpxx"]
 
    cpp.commonCompilerFlags: ["-std=c++11"]
    cpp.staticLibraries: ["gmp", "gmpxx"]
 
-   Properties {
-      condition: qbs.buildVariant == "release"
-
-      //cpp.commonCompilerFlags: outer.concat("")
-
-      // Override the default optimization (-02).
-      cpp.optimization: "none"
-      cpp.cxxFlags: "-O3"
-   }
    Properties {
       condition: qbs.buildVariant == "debug"
       cpp.debugInformation: true
    Properties {
       condition: qbs.buildVariant == "debug"
       cpp.debugInformation: true
index 03d1173..4cfdb9c 100644 (file)
@@ -20,6 +20,14 @@ const uint RSA_PUBLIC_EXPONENT = 65537;
 void printUsage(const string& progName)
 {
    cout << "Usage: " << progName << " [tests|time-measures]" << endl;
 void printUsage(const string& progName)
 {
    cout << "Usage: " << progName << " [tests|time-measures]" << endl;
+
+//   mpz_class n = 10;
+//   mpz_class d = 3;
+//   mpz_class q;
+//   mpz_fdiv_q(q.get_mpz_t(), n.get_mpz_t(), d.get_mpz_t());
+
+//   cout << "q: " << q << endl;
+//   cout << "q: " << (n / d) << endl;
 }
 
 int main(int argc, char** argv)
 }
 
 int main(int argc, char** argv)