P = get_probable_prime(bits/2) Q = get_probable_prime(bits/2) print 'P: %s, Q: %s' % (P, Q) N = P.multiply(Q) print 'N: %s' % N one = BigInteger("1") Euler = P.subtract(one).multiply(Q.subtract(one)) print 'Euler: %s' % Euler E = BigInteger("17") print 'E: %s' % E try: D = E.modInverse(Euler) print 'D: %s' % D except ArithmeticException: print >>sys.stderr, 'Failed. E is not invertible' sys.exit(1) msg = 'A test message' print 'Original message: %s' % msg result = [] for ch in msg: result.append(BigInteger.valueOf(ord(ch)).modPow(E, N)) print 'Encrypted: %s' % result decrypted = '' for el in result: