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