-
-
Save djego/97db0d1bc3d16a9dcb9bab0930d277ff to your computer and use it in GitHub Desktop.
''' | |
620031587 | |
Net-Centric Computing Assignment | |
Part A - RSA Encryption | |
''' | |
import random | |
''' | |
Euclid's algorithm for determining the greatest common divisor | |
Use iteration to make it faster for larger integers | |
''' | |
def gcd(a, b): | |
while b != 0: | |
a, b = b, a % b | |
return a | |
''' | |
Euclid's extended algorithm for finding the multiplicative inverse of two numbers | |
''' | |
def multiplicative_inverse(e, phi): | |
d = 0 | |
x1 = 0 | |
x2 = 1 | |
y1 = 1 | |
temp_phi = phi | |
while e > 0: | |
temp1 = temp_phi/e | |
temp2 = temp_phi - temp1 * e | |
temp_phi = e | |
e = temp2 | |
x = x2- temp1* x1 | |
y = d - temp1 * y1 | |
x2 = x1 | |
x1 = x | |
d = y1 | |
y1 = y | |
if temp_phi == 1: | |
return d + phi | |
''' | |
Tests to see if a number is prime. | |
''' | |
def is_prime(num): | |
if num == 2: | |
return True | |
if num < 2 or num % 2 == 0: | |
return False | |
for n in xrange(3, int(num**0.5)+2, 2): | |
if num % n == 0: | |
return False | |
return True | |
def generate_keypair(p, q): | |
if not (is_prime(p) and is_prime(q)): | |
raise ValueError('Both numbers must be prime.') | |
elif p == q: | |
raise ValueError('p and q cannot be equal') | |
#n = pq | |
n = p * q | |
#Phi is the totient of n | |
phi = (p-1) * (q-1) | |
#Choose an integer e such that e and phi(n) are coprime | |
e = random.randrange(1, phi) | |
#Use Euclid's Algorithm to verify that e and phi(n) are comprime | |
g = gcd(e, phi) | |
while g != 1: | |
e = random.randrange(1, phi) | |
g = gcd(e, phi) | |
#Use Extended Euclid's Algorithm to generate the private key | |
d = multiplicative_inverse(e, phi) | |
#Return public and private keypair | |
#Public key is (e, n) and private key is (d, n) | |
return ((e, n), (d, n)) | |
def encrypt(pk, plaintext): | |
#Unpack the key into it's components | |
key, n = pk | |
#Convert each letter in the plaintext to numbers based on the character using a^b mod m | |
cipher = [(ord(char) ** key) % n for char in plaintext] | |
#Return the array of bytes | |
return cipher | |
def decrypt(pk, ciphertext): | |
#Unpack the key into its components | |
key, n = pk | |
#Generate the plaintext based on the ciphertext and key using a^b mod m | |
plain = [chr((char ** key) % n) for char in ciphertext] | |
#Return the array of bytes as a string | |
return ''.join(plain) | |
if __name__ == '__main__': | |
''' | |
Detect if the script is being run directly by the user | |
''' | |
print "RSA Encrypter/ Decrypter" | |
p = int(raw_input("Enter a prime number (17, 19, 23, etc): ")) | |
q = int(raw_input("Enter another prime number (Not one you entered above): ")) | |
print "Generating your public/private keypairs now . . ." | |
public, private = generate_keypair(p, q) | |
print "Your public key is ", public ," and your private key is ", private | |
message = raw_input("Enter a message to encrypt with your private key: ") | |
encrypted_msg = encrypt(private, message) | |
print "Your encrypted message is: " | |
print ''.join(map(lambda x: str(x), encrypted_msg)) | |
print "Decrypting message with public key ", public ," . . ." | |
print "Your message is:" | |
print decrypt(public, encrypted_msg) |
I replaced the inverse function with this and it's all good now
def eea(a,b):
if b==0:return (1,0)
(q,r) = (a//b,a%b)
(s,t) = eea(b,r)
return (t, s-(q*t) )
Find the multiplicative inverse of x (mod y)
def find_inverse(x,y):
inv = eea(x,y)[0]
if inv < 1: inv += y #we only want positive values
return inv
I replaced the inverse function with this and it's all good now
def eea(a,b): if b==0:return (1,0) (q,r) = (a//b,a%b) (s,t) = eea(b,r) return (t, s-(q*t) )
Find the multiplicative inverse of x (mod y)
def find_inverse(x,y): inv = eea(x,y)[0] if inv < 1: inv += y #we only want positive values return inv
Where do you get eea from?
what is the complexity of this RSA algorithm?
I've been trying to make a public / private key encryption from scratch, I was failing so I look for some code to help me out and here's a whole RSA algorithm from scratch.
Thanks a lot dude.
I've been trying to make a public / private key encryption from scratch, I was failing so I look for some code to help me out and here's a whole RSA algorithm from scratch.
Thanks a lot dude.
Glad to help🙌🏽
i have replaced with this function, im still not getting the correct ans ,what should i do?