<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>https://wiki.otwartaedukacja.pl/index.php?action=history&amp;feed=atom&amp;title=RSA</id>
	<title>RSA - Historia wersji</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.otwartaedukacja.pl/index.php?action=history&amp;feed=atom&amp;title=RSA"/>
	<link rel="alternate" type="text/html" href="https://wiki.otwartaedukacja.pl/index.php?title=RSA&amp;action=history"/>
	<updated>2026-05-22T00:29:37Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.38.2</generator>
	<entry>
		<id>https://wiki.otwartaedukacja.pl/index.php?title=RSA&amp;diff=170&amp;oldid=prev</id>
		<title>Admin: rsa</title>
		<link rel="alternate" type="text/html" href="https://wiki.otwartaedukacja.pl/index.php?title=RSA&amp;diff=170&amp;oldid=prev"/>
		<updated>2022-09-30T14:27:01Z</updated>

		<summary type="html">&lt;p&gt;rsa&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Algorytm RSA jest jednym z najważniejszych algorytmów związanych z bezpieczeństwem.&lt;br /&gt;
&lt;br /&gt;
== Podstawy teoretyczne ==&lt;br /&gt;
&lt;br /&gt;
# Funkcja Eulera:  fi(n) - ilość liczb całkowitych dodatnich mniejszych od n i względnie pierwszych z n.  1.1. fi(n) = n-1, gdy n jest liczbą pierwszą (bo każda liczba jest względnie pierwsza z liczbą pierwszą).  1.2. Gdy n =p*q, gdzie p, q - liczby pierwsze, fi(n) = (p-1)*(q-1)  Dowód:&lt;br /&gt;
#* wszystkich liczb mniejszych od n jest p*q-1&lt;br /&gt;
#* liczby mające z n wspólny podzielnik p: p, 2*p, 3*p, ... (q-1)*p - jest ich q-1&lt;br /&gt;
#* liczby mające z n wspólny podzielnik q: q, 2*q, 3*q, ... (p-1)*q - jest ich p-1&lt;br /&gt;
#* a więc: fi(n) = p*q - (p-1) - (q-1) -1 = p*q - p - q + 1 = (p-1) * (q-1) = fi(p)*fi(q)&lt;br /&gt;
# Twierdzenie Eulera:  Dla każdych (a, n), takich, że gcd(a,n) = 1 mamy (a^fi(n)) mod n =1  ^ oznacza potęgowanie  gcd = największy wspólny podzielnik  mod = reszta z dzielenia (modulo), ale określona na liczbach dodatnich (-1 mod 10 = 9 !!!).  Dowód:&lt;br /&gt;
#* R = {r1, r2,... rfi(n) } - zbiór liczb całkowitych dodatnich, mniejszych od n i względnie pierwszych z n (residuów) (zob. Funkcję Eulera)&lt;br /&gt;
#* jeśli każdą z liczb ri pomnożymy przez a modulo n ( (ri * a) mod n ), otrzymamy fi(n) różnych wyników; gdyby bowiem zachodziło: ri * a mod n = rj * a mod n = r, mielibyśmy (ri-rj)*a mod n =0, a więc a i n nie byłyby względnie pierwsze.&lt;br /&gt;
#* mamy więc (a*r1)*(a*r2)*....*(a*rfi(n)) = r1*r2*...*rfi(n)  czyli (a^fi(n) mod n) * r1*r2*...*rfi(n) = r1*r2*...*rfi(n)  a po uproszczeniu a^fi(n) mod n = 1&lt;br /&gt;
# Szyfr wykładniczy polega na szyfrowaniu poprzez potęgowanie modulo n.  C = M^e mod n  Odszyfrowanie można wykonać poprzez potęgowanie używając innego wykładnika (klucza)!:  M=C^d mod n  Powyższe równania są swoją odwrotnością (czyli pomnożenie ich daje w wyniku 1, albo inaczej  (M^e mod n) ^d mod n = M), pod warunkiem, że e*d mod fi(n) = 1  Dowód:&lt;br /&gt;
#* (M^e mod n) ^d mod n = M^(e*d) mod n&lt;br /&gt;
#* ale:e*d = t * fi(n) +1&lt;br /&gt;
#* mamy więc M^e*d mod n = M^(t*fi(n)+1) mod n = M*M^(t*fi(n) mod n = M* (M^(t*fi(n)) mod n) mod n&lt;br /&gt;
#* na mocy twierdzenia Eulera mamy M^(t*fi(n)) mod n = ((M^fi(n) mod n)^t) mod n = 1^t mod n = 1&lt;br /&gt;
#* a więc M^(e*d) mod n = (M*1) mod n = M&lt;br /&gt;
# Generowanie kluczy:&lt;br /&gt;
#* wybieramy d względnie pierwsze z fi(n)&lt;br /&gt;
#* obliczamy e = inv(d, fi(n))  gdzie inv = odwrotność, czyli (x * inv(x, fi(n)) ) mod fi(n)=1&lt;br /&gt;
&lt;br /&gt;
Najprostsza implementacja (Python):&amp;lt;syntaxhighlight lang=&amp;quot;py3&amp;quot;&amp;gt;&lt;br /&gt;
import numpy as np&lt;br /&gt;
import primesieve&lt;br /&gt;
from random import randint&lt;br /&gt;
&lt;br /&gt;
def gen_prime(min, max):&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
Eratosthenes sieve http://code.activestate.com/recipes/117119/&lt;br /&gt;
https://github.com/hickford/primesieve-python&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
  prime_list = primesieve.primes(min, max)&lt;br /&gt;
  while (not prime_list):&lt;br /&gt;
    min=max&lt;br /&gt;
    max+=100&lt;br /&gt;
    prime_list = generate_primes(min, max)&lt;br /&gt;
  n=randint(0, len(prime_list)-1)&lt;br /&gt;
  return prime_list[n]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# The greatest common divisor (GCD) - Euclides&lt;br /&gt;
def gcd(x, y):&lt;br /&gt;
  while y != 0:&lt;br /&gt;
    (x, y) = (y, x % y)&lt;br /&gt;
  return x&lt;br /&gt;
&lt;br /&gt;
# result == x: a*x mod n == 1, 0 &amp;lt; a &amp;lt; n&lt;br /&gt;
# extended Euclides&lt;br /&gt;
# https://anh.cs.luc.edu/331/notes/xgcd.pdf&lt;br /&gt;
def inv(a,n):&lt;br /&gt;
  v0 = 0&lt;br /&gt;
  v1 = 1&lt;br /&gt;
  r0=n&lt;br /&gt;
  r1=a&lt;br /&gt;
  while r1 != 0:&lt;br /&gt;
    d = r0 // r1&lt;br /&gt;
    (r0, r1) = r1, r0 - d * r1&lt;br /&gt;
    (v0, v1) = v1, v0 - d * v1&lt;br /&gt;
  if v0&amp;gt;0:&lt;br /&gt;
    return v0&lt;br /&gt;
  else:&lt;br /&gt;
    return v0+n&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rsa_keys(p, q): # p&amp;lt;q&lt;br /&gt;
  # return: d, e, p * q&lt;br /&gt;
  n=p*q&lt;br /&gt;
  fi=(q-1)*(p-1)&lt;br /&gt;
  # wybieramy d wzglednie pierwsze wzgledem fi z przedzialu [q + 1 .. n-1] &lt;br /&gt;
  d=q+1&lt;br /&gt;
  wd=-1&lt;br /&gt;
  while (wd != 1 ) and (d&amp;lt;n):&lt;br /&gt;
    wd=gcd(d, fi)&lt;br /&gt;
    if wd != 1:&lt;br /&gt;
      d+=1&lt;br /&gt;
  if wd != 1:&lt;br /&gt;
    print(&amp;#039;nie znaleziono kluczy&amp;#039;)&lt;br /&gt;
    exit(-1)&lt;br /&gt;
  e = inv(d, fi)&lt;br /&gt;
  return (d, e, n)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rsa(M, d, n):&lt;br /&gt;
  return (M ** d) % n&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__==&amp;quot;__main__&amp;quot;:&lt;br /&gt;
  # przykładowe dane startowe&lt;br /&gt;
  min=779&lt;br /&gt;
  d=88&lt;br /&gt;
  # liczby pierwsze&lt;br /&gt;
  p=gen_prime(min,min+d)&lt;br /&gt;
  q=gen_prime(p,p+d)&lt;br /&gt;
  # klucze&lt;br /&gt;
  d, e, n = rsa_keys(p, q)&lt;br /&gt;
  print (&amp;#039;d=%s, e=%s, n=%s&amp;#039; % (d, e, n))&lt;br /&gt;
  # test&lt;br /&gt;
  M=input(&amp;#039;Liczba=&amp;#039;)&lt;br /&gt;
  Mcrypt=rsa(M,d,n)&lt;br /&gt;
  print(&amp;quot;zaszyfrowana=%s&amp;quot; % Mcrypt)&lt;br /&gt;
  print(&amp;quot;odszyfrowana=%s&amp;quot; % rsa(Mcrypt,e,n))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ta implementacja nie nadaje się do praktycznego zastosowania, gdyż program działa zbyt wolno, a przy generowaniu kluczy nie są sprawdzane dodatkowe wymogi odpowiedniej złożoności. Powyższy program służy jedynie do zilustrowania algorytmu. W praktyce stosuje się gotowe biblioteki takie jak OpenSSL.&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>