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@2
|
12 |
args = parse_arguments()
|
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@2
|
56 |
def parse_arguments():
|
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()
|