examples/rsa.py
author Eugen Sawin <sawine@me73.com>
Tue, 08 Mar 2011 21:45:25 +0100
changeset 15 c0bb7625b557
parent 2 7b0f43733557
permissions -rw-r--r--
Merged.
     1 """
     2 Name: rsa - RSA encryption and decryption
     3 Description: RSA-based encryption and decryption of messages.
     4 
     5 Author: Eugen Sawin <sawine@me73.com>
     6 """
     7 MAX_PRIME = 120
     8 
     9 from random import choice
    10 
    11 def main():
    12     args = parse_args()
    13     if args.e:
    14         m, e, n = args.e
    15         print encrypt(m, e, n)
    16     elif args.d:
    17         c, d, n = args.d
    18         print decrypt(c, d, n)
    19     else:
    20         print create_keys()
    21 
    22 from prime import safe_is_prime as isprime
    23 
    24 def create_keys():
    25     primes = [p for p in xrange(3, MAX_PRIME) if isprime(p)]
    26     p = choice(primes)
    27     q = choice(primes)
    28     n = p * q
    29     pn = (p-1)*(q-1)
    30     e = choice(range(2, pn))
    31     (ggt, d, k) =[int(i) for i in extended_euclid(e, pn)]
    32     while ggt != 1 or d < 0:
    33         e = choice(range(2, pn))
    34         (ggt, d, k) = [int(i) for i in extended_euclid(e, pn)]
    35     return ((e, n), (d, n))
    36 
    37 def encrypt(m, e, n):
    38     c = m**e%n
    39     return c
    40 
    41 def decrypt(c, d, n):
    42     m = c**d%n
    43     return m
    44 
    45 from math import floor
    46 
    47 def extended_euclid(a, b):
    48     if b == 0:
    49         return (a, 1, 0)
    50     (ds, ss, ts) = extended_euclid(b, a%b)
    51     (d, s, t) = (ds, ts, ss - floor(a/b)*ts)
    52     return (d, s, t)    
    53 
    54 from argparse import ArgumentParser
    55 
    56 def parse_args():
    57     parser = ArgumentParser(description='Applies the Dijkstra algorithm for the single source shortest path problem.')
    58     parser.add_argument('-e', metavar=('M', 'K', 'N'), type=int, nargs=3, help='sequence of (u, v, c(u,v))')
    59     parser.add_argument('-d', metavar=('M', 'K', 'N'), type=int, nargs=3, help='source vertex')
    60     return parser.parse_args()
    61 
    62 if __name__ == "__main__":
    63     main()