In [41]:
ru = {}
for i in range(256,10000):
    if 'а'<=chr(i)<='я' or 'А'<=chr(i)<='Я':
        #print(i-848,'-', chr(i))
        ru[chr(i)]=i-848

In [42]:
import math

def phi(n):
    amount = 0
    for k in range(1, n + 1):
        if math.gcd(n, k) == 1:
            amount += 1
    return amount

In [46]:
e, n = 233, 403 # открытый ключ
E = lambda m: (pow(m,e))%n # Шифрование
$$ E(m) = m^e (mod(n)) $$

In [47]:
d, n = 17,403 # закрытый ключ
D = lambda c: (pow(c,d))%n # расшифрование
$$ D(c) = c^d (mod(n)) $$

In [40]:
p, q = 23, 17
phi(n)


Out[40]:
360
$$ p(360) = p(40)*p(9) = 6*p(5)*p(8) = 6*4*4 = 96 $$
$$ d\cdot e\equiv 1{\pmod {\varphi (n)}} $$

In [34]:
print ( (e*d)%phi(n))


1

In [15]:
e*d


Out[15]:
4225

обратный элемент $$a^{-1} \equiv a^{\varphi(n)-1} \pmod n, если { \displaystyle (a,n)=1.} (a,n) = 1. $$

$$ e = d^{\phi(\phi(n))-1} mod(\phi(n))$$

In [27]:
a_1 = lambda a,n: pow(a,phi(n)-1)%n

In [35]:
e = a_1(d,phi(n))

In [58]:
def strRSA(msg):
    for m in msg:
        print(m+" = "+str(ru[m]) + " RSA = "+str(E(ru[m])))

In [60]:
strRSA('жопа')


ж = 230 RSA = 55
о = 238 RSA = 296
п = 239 RSA = 96
а = 224 RSA = 165

In [ ]: