18. 6. 2014

RSA šifrování a dešifrování v Pythonu

Asymetrická šifra RSA je založena na výpočtech mocnin v modulární aritmetice. Pokud máme modulus n, šifrovací exponent e a dešifrovací exponent d, pak šifrovanou zprávu me získáme z původní zprávy m0 takto:

me = m0e mod n

Zašifrovanou zprávu dešifrujeme podobně:

md = med mod n

V Pythonu máme k dispozici funkci pow, která umí počítat mocniny mimo jiné i v modulární aritmetice. Ukažme si příklad s konkrétními hodnotami.

Mějme následující modulus:

n = 21527780186004234447971732039802273528579441854351817770636417084074045726916755811452176780972972762465425067238626216467850161245907157490982001685910067508063834571557543426677191033339325440982101764581246164671034032604464829492680255606381797121955207928235115958807472977713204039171154535203439165945886770314300527479967151239790376461172721498826129973777800192746896042404231774774252977582877970999073179147617119355023510142421028451033729206425509932433205750495464400915358156290323467181810120864844047779571069775054986909028190660734157823936101832243439927710101844604725375998277508273471747760851

Mějme následující šifrovací exponent:

e = 65537

Mějme následující dešifrovací exponent:

d = 1923924020773407405919868693365914156230675663227468402316515782861920530731517139748163623695907677644078835143760528401547193103396222308385821503492306107919646597885355323711007642740260144770620718604030681698555721637614637629714943575180099573420993527864764547823906636410977555540007203757977069364532082494093469869831565142548516157723340358656083422963282407247035204429319739217882469055600881431028253761271632041603247673621782328799866497497713708052433725288995340158616357124872463424481146842480686008560113218230274213908368506451031670836819663288989296709347723856301791343486712693995705188017

A mějme nějakou zprávu:

mo = 123456789

Tuto zprávu zašifrujeme a zobrazíme:

me = pow(mo, e, n)
print me

1923924020773407405919868693365914156230675663227468402316515782861920530731517139748163623695907677644078835143760528401547193103396222308385821503492306107919646597885355323711007642740260144770620718604030681698555721637614637629714943575180099573420993527864764547823906636410977555540007203757977069364532082494093469869831565142548516157723340358656083422963282407247035204429319739217882469055600881431028253761271632041603247673621782328799866497497713708052433725288995340158616357124872463424481146842480686008560113218230274213908368506451031670836819663288989296709347723856301791343486712693995705188017

Zašifrovanou zprávu dešifrujeme a zobrazíme:

md = pow(me, d, n)
print md

123456789

Dešifrovaná zpráva je shodná se zprávou původní.

Žádné komentáře: