[Cryptography] rsa and semi-primes
Thomas Kellar
wangude at gmail.com
Wed Nov 18 10:48:50 EST 2020
Dear Cryptography list,
I have been spending a year looking at factoring semi-primes (part of
RSA), which I suppose others have done. I have been working with
Samuel S. Wagstaff's wonderful book _The Joy of Factoring_ which
Wright State University has been kind enough to loan me their physical
copy for over a year. I have been avoiding complicated schemes like
https://gitlab.inria.fr/cado-nfs/cado-nfs
Because at 65 I feel too old to understand them.
I started out using Python and some C/C++ but switched to Pari-gp as
it seemed to be faster and I like it. I have written a number of
versions of other peoples algorithms E.g., Fermat, Euler, McKee, and
etc. I put most of them on my github at
https://github.com/StartDog/semiprimefactor
I have some opinions I have arrived at on them. Euler sucks. Fermat
is okay. Pollard's Rho is wonderful despite Dr. Pollard being too
busy playing his recorder at Oxford to help me with that!
I thought that I could find my own solution by investigating
semiprimes with a certain distance between the components/factors and
came up with my own factoring algorithm. At first glance it does not
seem to be better than fermat but it does have an interesting feature.
if n is the semiprime to factor, then 2*sqrtint(n) (speaking in pari
gp terms) is about how many solutions it can find going from the
sqrtint(n) up to n searching. With fermat you get only 1 solution.
With Euler you might not get any.. I put the program which counts the
solutions at
https://github.com/StartDog/semiprimefactor/blob/master/cntndifsol.gp
Though basically it is below:
while(1,
r++;
if (gcd(sqrtint(r*r + 4*n) + r,n) > 1,
q = sqrtint(r*r + 4*n) + r;
a = gcd(q,n);
if (a != n,
\\print("rndif:",r," ",q," dif-ans:",gcd(q,n));
acnt++;
);
);
if (r > n,
print(" 2*sqrtn:",2*c);
print("cnt solutions:",acnt);
quit();
);
);
r is initialized to sqrtint(n)
An example output is below:
n1:8147 n2:9151 d:1004
n:74553197 sqrtn:8634 begin:8634 end:74553197
2*sqrtn:17268
cnt solutions:17270
I.e., it finds 17270 solutions from sqrtint(n) up to n, n being 74553197
Now that seems to be a very high number (higher than the 1 of fermat
anyway, and higher than the 1 of a purely brute force search).
I am getting to my question. I am also preceding elsewhere in my
searching as well. Please be kind to me I am not a professional
math person. I was a professional programmer and have a CS degree though.
Can this be used to randomly find or help find a solution to factoring
a semi-prime? I mean:
while(1,
xu = random(n);
if (gcd(sqrtint(xu*xu + 4*n) + xu,n) > 1,
q = sqrtint(xu*xu + 4*n) + xu;
a = gcd(q,n);
if (a != n,
print("xundif:",xu," ",q," dif-ans:",gcd(q,n));
quit();
);
);
);
Actually finds a solution to small semi-primes fairly quickly. I
have tried it on RSA100 and not found a solution but is this a step in
the
correct direction? Has this already been done?? Am I repeating
someone else's mistakes? Any pointers to something related would be
appreciated.
Thanks
Thomas
More information about the cryptography
mailing list