使用了gmp大数库python的封装接口,但之后发现这个接口bug较多,接口较少
不废话,上代码:
import gmpy
def setkey(bits):
half = bits/2;
gmpy.rand('init')
p = gmpy.rand('next',gmpy.mpz(half*'9'))
p = gmpy.next_prime(p)
q = gmpy.rand('next',gmpy.mpz(half*'9'))
q = gmpy.next_prime(q)
n = p*q
fn = (p-1)*(q-1)
while True:
e = gmpy.rand('next',gmpy.mpz(8*'9'))
e = gmpy.next_prime(e)
if gmpy.gcd(e,fn)==1:
break
d = gmpy.invert(e,fn)
return n,e,d
def RSA_Encrypt(dat,n,e):
dat = gmpy.mpz(dat)
n = gmpy.mpz(n)
e = gmpy.mpz(e)
return dat**e%n
def RSA_Decrypt(dat,n,d):
dat = gmpy.mpz(dat)
n = gmpy.mpz(n)
d = gmpy.mpz(d)
return dat**d%n
if __name__=='__main__':
bits = int(raw_input('input bits:'))
n,e,d = setkey(bits)
print 'pubKey:(',e,', ',n,')'
print 'privateKey:(',d,', ',n,')'
num = gmpy.mpz(raw_input('input num:'))
print 'after encrypt: ',RSA_Encrypt(num,n,e)
print 'after decrypt: ',RSA_Decrypt(num,n,d)