def Wiener (n, s):
M = 10101
E = M.powermod(s,n)
cf = continued_fraction(n/s)
m = len(cf)
for i in range(0, m ):
conv = cf.convergent(i)
t = conv.numerator()
d = E.powermod(t,n)
if d == M:
print("k:= {0}".format(cf.convergent(i).denominator()))
print("The totient of the modulus is {0}".format((s*t-1)/(cf.convergent(i).denominator())))
print("The private key is {0}".format(t))
return [t, (s*t-1)/(cf.convergent(i).denominator())]
print("Private key not found")
def WienerCovert (P):
p = next_prime(ZZ.random_element(P^2))
q = next_prime(ZZ.random_element(P^2))
while(not((q<p) and (p<2*q))):
p = next_prime(ZZ.random_element(P^2))
q = next_prime(ZZ.random_element(P^2))
n = p*q
phin = (p-1)*(q-1)
l = ZZ(floor((n^(1/4))/3))
for i in range(1000):
d1 = l-i
g = gcd(d1,phin)
if (g == 1):
s1 = 1/d1 % phin
s2 = s1*P % n
g1 = gcd(s2,phin)
if(g1 == 1):
d2 = 1/s2 % phin
print "The modulus is: ", n
print "The exponent is: ", s2
print "The key is: ", d2
return([n,s2,d2])