Sziasztok,
RSA kódolást tanulom, de a maradékos osztásnál vannak hiányosságok.
El tudná valaki magyarázni (linkelni), hogy az ilyen jellegű feladatokat hogyan lehet gyorsan, algoritmikusan megoldani?
855^2735 mod 3233 = ?
vagy 2011^36 mod 200 = ?
Köszönöm a segítséget mindenkinek!
- 8193 megtekintés
Hozzászólások
subscribe
- A hozzászóláshoz be kell jelentkezni
bc
Erre tökéletes.
--
Debian - The "What?!" starts not!
http://nyizsa.uni.cc
- A hozzászóláshoz be kell jelentkezni
És úgy szerinted megtanulja? Kétség nem fér hozá, megkapja az eredményt, de meg is érti majd amit csinál?
- A hozzászóláshoz be kell jelentkezni
Nem ide.
- A hozzászóláshoz be kell jelentkezni
ha nem felejtem el, holnap reggel megtalálom az idevágó jegyzeteimet.
- A hozzászóláshoz be kell jelentkezni
Még kódolástechnika tárgyamhoz írtam ezt:
C++ ban van, fordítsd le, bekéri a fí(n)-t, n-t és az e-t, majd levezeti hogy milyen lépésben jön ki a d. Ezután megadhatsz neki számokat, amiket kódol, majd ellenőrzi az eredményt.
A lényeg amit kérdeztél, az a moduláris hatványozás. Wikipedián megtaláltam az algoritmust:
function modular_pow(base, exponent, modulus)
result := 1
while exponent > 0
if (exponent & 1) equals 1:
result := (result * base) mod modulus
exponent := exponent >> 1
base = (base * base) mod modulus
return result
Remélem hasznos.
- A hozzászóláshoz be kell jelentkezni
http://en.wikipedia.org/wiki/Modular_exponentiation
function modular_pow(base, exponent, modulus)
result := 1
while exponent > 0
if (exponent & 1) equals 1:
result := (result * base) mod modulus
exponent := exponent >> 1
base = (base * base) mod modulus
return result
- A hozzászóláshoz be kell jelentkezni
855 -nek megnezed a 3233-mal valo maradekat, aztan a 855^2-nek 855^3-nek stb., es egy ido utan loopos lesz (egyszeru dinamikus memoriafoglalas, "megnezemvotemar"), majd ahanyadik elemnel tart a loop (maradekos osztas), annyidik maradekot teszem be
pl. 5-os maradeka a 2^72-nek:
2
2*2=4
8->3
3*2=6->1
1*2->2
2 mar volt, minden 4.-re loopol
72%4=0 azaz 1 lesz az 5-os maradeka, mert 1->2 2->4 3->3 0->1
- A hozzászóláshoz be kell jelentkezni
Az Euler-Fermat-tétel miatt ebben az esetben ez nem ajánlott. a phi(3233)=3120, sokkal értelmesebb a már fentebb linkelt moduláris hatványozás.
- A hozzászóláshoz be kell jelentkezni
igen, pont azon agyaltam, hogy hogy is volt az Euler-fele phi fuggveny, amivel ugyanez egyszerubb es tan gyorsabb is
- A hozzászóláshoz be kell jelentkezni
Mivel 2011 ≡ 11 (mod 200), így elég csak 11^36 -t számolnod.
- A hozzászóláshoz be kell jelentkezni
na az meg a masik, amit hozza akartam tenni :D
- A hozzászóláshoz be kell jelentkezni
855-öt szeretnéd hatványozni. Eközben bármikor veheted 3233-mal vett maradékát, ezt kell kihasználni.
855^1 mod 3233 számolása:
855^1 mod 3233
azaz 855
855^2 mod 3233 számolása:
855^2 mod 3233
azaz 367
855^4 mod 3233 számolása:
367^2 mod 3233
azaz 2136
855^8 mod 3233 számolása:
2136^2 mod 3233
azaz 733
...
855^2735 mod 3233=855^1 * 855^2 * 855^4 * 855^8 * 855^32 * 855^128 * 855^512 * 855^2048 mod 3233. A Sage szerint 2868 a válasz.
Annyiban lehetne még könnyíteni a dolgon, hogy a Euler phi(3233)-at bármennyiszer levonhatod a kitevőből, ám 3233=53*61, tehát phi(3233)=52*60=3120, ami nagyobb, mint a 2735.
- A hozzászóláshoz be kell jelentkezni
Az ALAPLAP c. számítástechnikai folyóiratban volt _emlékzetem szerint_ 1994-ben az egyik hónap témája a titkosítás; itt elég jól elmagyarázták az algoritmust.
egyébként a Zimmerman féle PGP titkosítás forráskódját is érdemes átnézni.
CSZ
- A hozzászóláshoz be kell jelentkezni
Sorozatban felbontható ebbe:
c = (ab) (mod m) = ( (a (mod m)) * (b (mod m)) ) (mod m)
C kód:
uint64_t modexp(uint64_t base, uint64_t exp, uint64_t mod)
{
uint64_t c = 1;
while(exp > 0)
{
if(exp&1)
c = (c*base)%mod;
exp >>= 1;
base = (base*base)%mod;
}
return c;
}
A lényeg, hogy a nagyszám ad nagyszám nehezen ábrázolható, viszont a modulo felbontásával általában beférsz int32-be. A fentebbi C kód meg: http://en.wikipedia.org/wiki/Modular_exponentiation#Right-to-left_binar…
- A hozzászóláshoz be kell jelentkezni
A fent írt algoritmus (egyik) magyar neve ismételt négyzetre emelés. Jegyzet az egész témáról:
- A hozzászóláshoz be kell jelentkezni
erenoff.
- A hozzászóláshoz be kell jelentkezni
erendis
- A hozzászóláshoz be kell jelentkezni
eren that
meg az erend is
- A hozzászóláshoz be kell jelentkezni