Eurax

Chciałbym Zaznaczyć
Na swoim Blogu umieszczam nie tylko swoje artykuły.Przy innych publikacjach umieszczę źródło.

Python - Implementacja Algorytmu RSA

W roku 1977 trzej profesorowie z MIT w USA, Ronald L. Rivest, Adi Shamir i Leonard Adleman, opublikowali nowy rodzaj szyfrowania danych, który nazwano od pierwszych liter ich nazwisk systemem RSA. Jest to niesymetryczny algorytm szyfrujący, którego zasadniczą cechą są dwa klucze: publiczny do kodowania informacji oraz prywatny do jej odczytywania. Klucz publiczny (można go udostępniać wszystkim zainteresowanym) umożliwia jedynie zaszyfrowanie danych i w żaden sposób nie ułatwia ich odczytania, nie musi więc być chroniony. Dzięki temu firmy dokonujące transakcji poprzez sieć Internet mogą zapewnić swoim klientom poufność i bezpieczeństwo. Drugi klucz (prywatny, przechowywany pod nadzorem) służy do odczytywania informacji zakodowanych przy pomocy pierwszego klucza. Klucz ten nie jest udostępniany publicznie. System RSA umożliwia bezpieczne przesyłanie danych w środowisku, w którym może dochodzić do różnych nadużyć. Bezpieczeństwo oparte jest na trudności rozkładu dużych liczb na czynniki pierwsze.

Załóżmy, iż dysponujemy superszybkim komputerem, który jest w stanie sprawdzić podzielność miliarda dużych liczb w ciągu jednej sekundy. Aby złamać szyfr RSA należy rozbić klucz publiczny na dwie liczby pierwsze będące jego dzielnikami. Znajomość tych liczb pozwala rozszyfrować każdą informację zakodowaną kluczem prywatnym i publicznym.

Brzmi dosyć prosto. Jednakże nie ma prostej metody rozbijania dużych liczb na czynniki pierwsze. Nie istnieje żaden wzór, do którego podstawiamy daną liczbę i w wyniku otrzymujemy wartości jej czynników pierwszych. Należy je znaleźć testując podzielność kolejnych liczb.

Z rozważań o liczbach pierwszych wynika, iż w przypadku dwóch różnych dzielników pierwszych jeden musi leżeć poniżej wartości pierwiastka z danej liczby, a drugi powyżej (dlaczego?). Zatem, aby go znaleźć musimy wyliczyć pierwiastek z rozkładanej liczby, a następnie testować podzielność przez liczby nieparzyste leżące poniżej tego pierwiastka.

Statystycznie poszukiwany czynnik pierwszy powinien znajdować się w górnej połówce zakresu od 2 do pierwiastka z n. Ile działań musimy wykonać? Policzmy.

Klucz 128 bitowy. Pierwiastek jest liczbą 64 bitową. W zakresie od 2 do 264 co druga liczba jest nieparzysta, zatem jest ich około 264 / 2 = 263. Ponieważ interesuje nas tylko górna połówka, to ilość liczb do sprawdzenia jest dwa razy mniejsza, czyli wynosi 263 / 2 = 262. Ile czasu zajmie naszemu superkomputerowi sprawdzenie podzielności przez około 262 liczb, jeśli w ciągu 1 sekundy wykonuje on miliard sprawdzeń? Odpowiedź brzmi:

zajmie to około:

262 / 109 = 4611686018 sekund = 76861433 minut = 1281023 godzin = 53375 dni = 146 lat

Czy sądzisz, że ktoś będzie czekał przez prawie dwa życia na złamanie szyfru? Zatem można podać do publicznej wiadomości liczbę będącą iloczynem dwóch dużych liczb pierwszych i mieć prawie pewność, iż nikt jej nie rozbije na czynniki pierwsze w rozsądnym czasie. Ostatecznie zamiast 128 bitów możemy zwiększyć klucz do np. 1024 bitów, a wtedy czas łamania szyfru liczy się miliardami miliardów... miliardów lat.


Algorytm RSA składa się z trzech podstawowych kroków:
  • Generacja klucza publicznego i tajnego. Klucz publiczny jest przekazywany wszystkim zainteresowanym i umożliwia zaszyfrowanie danych. Klucz tajny umożliwia rozszyfrowanie danych zakodowanych kluczem publicznym. Jest trzymany w ścisłej tajemnicy.
  • Użytkownik po otrzymaniu klucza publicznego, np. poprzez sieć Internet, koduje za jego pomocą swoje dane i przesyła je w postaci szyfru RSA do adresata dysponującego kluczem tajnym, np. do banku, firmy komercyjnej, tajnych służb. Klucz publiczny nie musi być chroniony, ponieważ nie umożliwia on rozszyfrowania informacji - proces szyfrowania nie jest odwracalny przy pomocy tego klucza. Zatem nie ma potrzeby jego ochrony i może on być powierzany wszystkim zainteresowanym bez ryzyka złamania kodu.
  • Adresat po otrzymaniu zaszyfrowanej wiadomości odczytuje ją za pomocą klucza tajnego.
Generacja klucza publicznego i tajnego dla algorytmu RSA.
  • Znajdź dwie duże liczby pierwsze (mające np. po 1024 bity). Oznacz je jako p i q. Istnieją specjalne algorytmy generujące duże liczby pierwsze.
  • Oblicz:
    Ø = (p - 1) • (q - 1)
    oraz
    n = p • q

    Wygenerowane liczby pierwsze usuń, aby nie wpadły w niepowołane ręce. Ø to tzw. funkcja Eulera, n jest modułem.

  • Wykorzystując odpowiednio algorytm Euklidesa znajdź liczbę e, która jest względnie pierwsza z wyliczoną wartością funkcji Eulera Ø
  • Oblicz liczbę odwrotną modulo Ø do liczby e, czyli spełniającą równanie

    de mod Ø = 1.

  • Klucz publiczny jest parą liczb (e, n), gdzie e nazywa się publicznym wykładnikiem.
  • Klucz tajny to (d, n), gdzie d nazywa się prywatnym wykładnikiem. Klucz ten należy przechowywać pod ścisłym nadzorem.
Szyfrowanie kluczem publicznym RSA
  • Otrzymujesz od adresata klucz publiczny w postaci pary liczb (e, n).
  • Wiadomość do zaszyfrowania zamieniasz na liczby naturalne t, które muszą spełniać nierówność
    0 < style="font-style: normal;"> <>
  • Na tak otrzymanych liczbach wykonujesz operację szyfrowania i otrzymujesz liczby
    c = t e mod n.
  • Liczby c są zaszyfrowaną postacią liczb t i przekazuje się je adresatowi wiadomości. Klucz (e, n) umożliwił ich zaszyfrowanie, lecz nie pozwala ich rozszyfrować.
Rozszyfrowywanie RSA
  • Jesteś adresatem zaszyfrowanych wiadomości. Wcześniej wszystkim korespondentom przesłałeś wygenerowany klucz publiczny (e,n), za pomocą którego mogą oni szyfrować i przesyłać ci swoje dane. Otrzymujesz więc zaszyfrowaną wiadomość w postaci liczb naturalnych c, które muszą spełniać warunek:
    0 < style="font-style: normal;"><>
  • Liczbę c przekształcasz na pierwotną wartość t stosując wzór:
    t = c d mod n
  • Z otrzymanej liczby t odtwarzasz wg ustalonego systemu znaki tekstu. Teraz możesz odczytać przesłaną wiadomość.



import random
import os
def cls():
os.system("cls")

def Czekaj():
print
raw_input("Zapisz te dane i nacisnij Enter")

# Funkcja obliczająca NWD dla dwóch liczb

def nwd(a, b):
while b: a, b = b, a % b
return a

# Funkcja obliczania odwrotności modulo n

def odwr_mod(a, n):
p0, p1, a0, n0 = 0, 1, a, n
q, r = n0 // a0, n0 % a0
while r:
t = p0 - q * p1
if t >= 0:
t = t % n
else:
t = n - ((-t) % n)
p0, p1, n0, a0 = p1, t, a0, r
q, r = n0 // a0, n0 % a0
return p1

# Procedura generowania kluczy RSA

def klucze_RSA():
tp = [11, 13, 17, 19, 23, 29, 31, 37, 41, 43]
cls()
print "Generowanie kluczy RSA"
p = q = 0
while p == q:
p, q = tp[random.randint(0, 9)], tp[random.randint(0, 9)]
phi, n = (p - 1) * (q - 1), p * q

e = 3
while nwd(e, phi) != 1: e += 2
d = odwr_mod(e, phi)

print "KLUCZ PUBLICZNY"
print "wykladnik e = %4d" % e
print " modul n = %4d" % n
print
print "KLUCZ PRYWATNY"
print "wykladnik d = %4d" % d
Czekaj()

# Funkcja oblicza modulo potęgę podanej liczby

def pot_mod(a, w, n):

pot, wyn, q = a, 1, w
while q:
if (q % 2) == 1: wyn = (wyn * pot) % n
pot = (pot * pot) % n
q //= 2
return wyn

# Kodowania danych RSA

def kodowanie_RSA():
cls()
print "Kodowanie danych RSA"
print
e = int(raw_input("Podaj wykladnik = "))
n = int(raw_input(" Podaj modul = "))
print "----------------------------------"
print
t = int(raw_input("Podaj kod RSA = "))
print
print "Wynik kodowania =", pot_mod(t, e, n)
Czekaj()

w = 1
while w:
print "[ 0 ] - Koniec"
print "[ 1 ] - Generowanie kluczy RSA"
print "[ 2 ] - Kodowanie RSA"
print
w = int(raw_input("Jaki jest twoj wybor? (0, 1 lub 2) : "))
if w == 1: klucze_RSA()
elif w == 2: kodowanie_RSA()

Albert Einstein - Ciekawostki z Życia

Albert Einstein przez większość swego życia był wegetarianinem, chociaż czasem robił w diecie wyjątki. W ostatnim roku swojego życia Einstein aktywnie propagował wegetarianizm.

Nieznanym sposobem Albert Einstein obliczył, że w ciągu całego swojego życia wykorzystał zaledwie 5 procent swojego mózgu.

Podobno zapytany kiedyś:
(...)czy to prawda, że teorię względności rozumie tylko dwóch ludzi? - odpowiedział pytaniem „A kto jest drugi?.

Dyrektor szkoły Einsteina o nim gdy był młody:
Nie ważne czego będzie próbował, i tak do niczego w życiu nie dojdzie.


Albert Einstein zaczął czytać dopiero w wieku dziewięciu lat, zawsze miał też w szkole kłopoty z pisaniem, za to z myśleniem żadnych problemów. Podobnie jak wielu innych uczonych, Einstein pochłonięty pracami naukowymi nie przywiązywał wielkiej wagi do spraw życia codziennego. Po co na przykład czyścić buty, gdy ciągle pada deszcz, lub nosić w tym czasie kapelusz, kiedy schnie on o wiele wolniej niż jego włosy?

Osobisty kierowca Einsteina podczas każdego z wystąpień miał zwyczaj siadać z tyłu sali i przysłuchiwać się wywodom słynnego naukowca. Po kilku takich sesjach stwierdził, że to żadna sztuka i prawdopodobnie sam mógłby poprowadzić wykłady. Einstein, znany z ekscentrycznego poczucia humoru, dał mu szansę. Na jednym z wykładów zamienił się z kierowcą miejscami. Uczony usiadł za plecami szofera przebrany w jego uniform, natomiast kierowca poprowadził wykład.
I rzeczywiście, wystąpienie było nadzwyczaj udane. Na końcu jeden ze słuchaczy zadał szczegółowe pytanie. Nie zmieszany szofer stwierdził:
- Odpowiedź na to pytanie jest całkiem prosta, założę się, że mój siedzący z tyłu kierowca, mógłby na nie odpowiedzieć.

W pewnym okresie życia, gdy sławny uczony regularnie prowadził zajęcia na uczelni, jeden z jego studentów ze zdziwieniem stwierdził:
- Panie profesorze, pytania na tegorocznym egzaminie były takie same jak w latach poprzednich!
- To prawda - powiedział Einstein - lecz w tym roku odpowiedzi są inne.

Einstein, kiedy był studentem, nie był zbyt lubiany przez profesorów. Pewnego razu jeden z nich zwrócił się drwiąco do niego:
- Jak pan sądzi, czy skutek może wyprzedzać przyczynę?
- Może - odparł Einstein - na przykład taczki popychane przez człowieka.

Na jednym z ekskluzywnych party z udziałem znanych osobistości, Marilyn Monroe zadała Einsteinowi pytanie:
- Jak pan sądzi, profesorze, czy nie powinniśmy razem spłodzić dziecka? Miałoby moją urodę, a pański rozum.
- Obawiam się, droga pani, że mogłoby być odwrotnie... - odpowiedział słynny uczony.

Na innym przyjęciu w Ameryce na którym przebywał Einstein, Pani domu chcąc się pochwalić wiedzą z astronomii wskazała na obiekt na niebie mówiąc:
- To jest Wenus, poznaję ją, bo zawsze lśni jak piękna kobieta.
- Przykro mi - odpowiedział Einstein - Ale planeta, którą pani pokazuje, to Jowisz.
- Ach, panie profesorze, pan jest naprawdę niezwykły, z tak olbrzymiej odległości potrafi pan rozpoznać płeć planety!

W początkach naukowej kariery Alberta Einsteina pewien dziennikarz spytał panią Einstein, co myśli o swoim mężu.
- Mój mąż to geniusz! On umie robić absolutnie wszystko, z wyjątkiem pieniędzy.
Einstein przyjechał w 1923 roku do Kopenhagi na spotkanie z Bohrem. Uczeni po spotkaniu się na stacji kolejowej wsiedli do tramwaju, ale zatopieni w rozmowie zapomnieli wysiąść na właściwym przystanku. Wsiedli więc w tramwaj jadący w przeciwnym kierunku, ale znów pojechali za daleko. Historia powtórzyła się jeszcze kilkakrotnie, zanim wreszcie wysiedli na właściwym przystanku.

Albert Einstein był namiętnym palaczem. W młodości palił przeważnie cygara, zresztą liche. Potem zaczął palić fajkę i bardzo się do niej przywiązał. Podobno nie wypuścił jej z rąk nawet wtedy, gdy pewnego razu wywróciła się jego żaglówka i wpadł do wody. Wśród licznych, także dziwacznych, wyróżnień i honorów Einsteina znalazło się dożywotnie członkostwo Klubu Palaczy Fajek w Montrealu. Przyjmując to wyróżnienie, Einstein miał powiedzieć, że: Palenie fajki zapewnia spokojny i obiektywny osąd spraw ludzkich.

Zapytano pewnego razu Einsteina, w jaki sposób pojawiają się odkrycia, które przeobrażają świat. Wielki fizyk odpowiedział:
- Bardzo prosto. Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie.

Einstein nie potrafił bez pomocy drugiej osoby wypełnić deklaracji podatkowej.
To jest zbyt skomplikowane dla matematyka - mawiał - do tego trzeba być filozofem

Na pytanie 9-letniego syna czym się wsławił w nauce, Albert Einstein odpowiedział:
Gdy ślepy żuczek pełznie po powierzchni kuli, nie zauważa, że jego droga jest zakrzywiona. Mnie szczęśliwie udało się to zauważyć.

Na pytanie 9 letniego syna czym się wsławił w nauce Albert Einstein odpowiedział:
Gdy ślepy żuczek pełznie po powierzchni kuli , nie zauważa , ze jego droga jest zakrzywiona. Mnie szczęśliwie udało się to zauważyć.