Browse Source

Setting a softer limit of fermat's factorization.

Michele Orrù 10 years ago
parent
commit
72a57c9318
1 changed files with 7 additions and 3 deletions
  1. 7 3
      src/questions/fermat.c

+ 7 - 3
src/questions/fermat.c

@@ -9,6 +9,7 @@
  *  N = (a-b)(a+b), where p = (a-b) q = (a+b)
  *                  and by construction a ~ ⌈√N⌉
  */
+#include "config.h"
 #include <assert.h>
 
 #include <openssl/bn.h>
@@ -37,7 +38,10 @@ fermat_question_ask(const RSA *rsa)
 
   BN_sqrtmod(tmp, rem, n, ctx);
   /* Δ = |p - q| = |a + b - a + b| = |2b| > √N  2⁻¹⁰⁰ */
-  BN_rshift(dssdelta, tmp, 101);
+  /* BN_rshift(dssdelta, tmp, 101); */
+  BN_one(dssdelta);
+  BN_lshift(dssdelta, dssdelta, BN_num_bits(n) / 4 + 10);
+
   BN_copy(a, tmp);
   BN_sqr(a2, a, ctx);
 
@@ -45,14 +49,14 @@ fermat_question_ask(const RSA *rsa)
     /* a² += 2a + 1 */
     BN_lshift1(tmp, a);
     BN_uiadd1(tmp);
-    BN_uadd(a2, a2, tmp);
+    BN_add(a2, a2, tmp);
     /* a += 1 */
     BN_uiadd1(a);
     /* b² = a² - N */
     BN_usub(b2, a2, n);
     /* b */
     BN_sqrtmod(b, rem, b2, ctx);
-  } while (!BN_is_zero(rem) && BN_ucmp(b, dssdelta) < 1);
+  } while (!BN_is_zero(rem) && BN_cmp(b, dssdelta) < 1);
 
   if (BN_is_zero(rem)) {
     BN_uadd(a, a, b);