Készítettem egy RSA kódoló programot, de miért nem jó?
Szerettem volna készíteni egy RSA-val kódoló programot. A kódban megvolt minden ami kellett. A lényeg maga a kódolási függvény nem működik, és nem jövök rá miért.
Íme a kódja:
string code(std::string bevitel,int N, int e)
{
string data;
int karakter;
long long hatvany;
int titkositott_integer_karakter;
for(unsigned i=0;i<bevitel.size();i++)
{
karakter=(int)bevitel[i];
hatvany=(int) pow(karakter,e);
titkositott_integer_karakter=hatvany %N;
karakter=(char) titkositott_integer_karakter;
data+=karakter;
}
return data;
}
AKármit adok be neki mindenből annyi n betűt csinál ahány karaktert beírok neki. De miért ?egszerűen nem jövök rá, már mindennel próbálkoztam.
Sima c-s memcpy, strcpy-vel pointerekkel, void tipusú függvénnyel, sőt még glibc buggot is találtam egyszer egy módosítás után, ami heap overflow-t csinált a 3.8.8-as kernelben,( a debuggolás legalább is ezt jelezte, és felismertem a jelenséget is magát), de nem értem miért nem tudok kódolni.
Egy másik variáció ami valszeg ugyan jól működött volna( de sikerült felülírnom), meg alulcsordult a pow függvény negatív számot adott ki és utána már minden elszállt. Nem írt ki eredménynek semmit.
Pedig megvan az primszitám is( ami Fermat, A Solovay-Strassen teszt, Miller-Rabint teszten alapulna, illetve objektumokkal csináltam az egészet. Mindegyik függvény illetve részobjektum kivállóan működik de ez nem. Valaki tudja a megoldást?
Köszönöm a segítséget!
Módosítottam a kódon:
-találtam egy biginteger adattipust c++ programnyelvhez a neten, ebben tárolok mindent, de gmp-vel is megcsináltam már, majd összehasonlítom, hogy melyik a hatékonyabb
-megtaláltam, hogy lehet c=m^e mod N-t közvetlenül kiszámítani nagy számokra. És működik is szerencsére
Egy probléma van, a maradék mindig nagyobb mint > 256 és ezt szeretném ASCII formátumba tenni.Emiatt nem lesz egyértelmű a függvényem a túlcsordulások miatt. A dekódolásról akkor még nem is beszéltem, ami szintén nem fogja visszaadni az eredeti karaktert. Ezt hogy lehet megoldani?
A gmp-t nem ismerem, a biginteger osztály meg lassú, legalábbis az amit találtam és kipróbáltam már, úgy értem hogy pl. a python sokkal gyorsabban számol "hét mérföld" hosszú számokkal.
"Egy probléma van, a maradék mindig nagyobb mint > 256 "...
Első megközelítésbe azzal a problémával találkozunk hogy csak számokat tud titkosítani az RSA, de ez nem probléma mert tulajdonképpen mindent számként lehet kezelni, pl egy kép egy nagyon nagy kettes számrendszerbeli szám. Így bármilyen adatot lehet vele titkosítani, teljesen mindegy hogy szöveg, kép, hang stb. nem kell máshogy eljárni.
Második megközelítésben tekintsük az egész titkosítandó adatot egyetlen nagy számnak és számoljunk azzal.
Igen ám de ez nagyon nagy szám lehet pl egy kép esetében egy több millió jegyű szám. Ezért ha túl nagy lenne akkor daraboljuk fel és darabonként végezzük el a titkosítást, nem bájatokra kell darabolni hanem nagyobb egységekre, akkora méretet kell venni amibe biztos hogy elfér.
Ezt értem, csak gondoltam, hogy a kódolt adatot is vissza lehet[ne] alakítani valahogy ascii formátumba és akkor egy karaktersorozatot egy másikká tudnék alakítani. És a stringből nem egy számsorozatot kapnék, ami valahogy így néz ki pl.
kódolom ezt:
this
Ebből ezt kapom( egy megfelelő modulus és e mellett)
14589412 3210013 2100033 10506789230
Nem pedig ezt pl.
xziw
Elméletben nincs ilyen algoritmus:
c=m^e mod(N mod 224)+32? ez közvetlen ascii-re kódolna, ha a N mod 224-et ki lehet[ne] számolni.
"Ezt értem, csak gondoltam, hogy a kódolt adatot is vissza lehet[ne] alakítani valahogy ascii formátumba és akkor egy karaktersorozatot egy másikká tudnék alakítani."
Bármilyen bináris adatot string-é lehet alakítani, amiből egyértelműen dekódolható az eredeti bináris adat, erre találták ki a base64-et.
"kódolom ezt:
this
Ebből ezt kapom( egy megfelelő modulus és e mellett)
14589412 3210013 2100033 10506789230
Nem pedig ezt pl.
xziw"
Még sem érted, bármely 4 bájt hosszú adat egyértelműen reprezentálható egy 0 és 4 milliárd 200 millió valamennyi közötti számmal. Maximum akkora számmal mint amennyi állapota van egy akkora memóriaterületnek mínusz egy mert 0-tól sorszámozzuk az állapotokat.
Azt a 4 karakter hosszú stringet reprezentálom egyetlen számmal, nem kell darabolni mert nem túl nagy szám. (Nem állítom hogy 4 bájt egy 4 karakteres string.)
"Elméletben nincs ilyen algoritmus:
c=m^e mod(N mod 224)+32? ez közvetlen ascii-re kódolna, ha a N mod 224-et ki lehet[ne] számolni."
Kár is pazarolni az időt hogy van e, ha van is akkor szinte biztos hogy nem invertálható, dehát nem dekódolható egyértelműen.
Tegyük fel hogy van, ekkor kaptál egy olyan algoritmust ami által egy ASCII kódhoz hozzárendelsz egy másikat, előfordulási gyakoriság szerint törhető pl a magyarba a leggyakrabb az 'e' betű, ha magyar szöveg esetében meg kéne figyelni hogy melyik ASCII kód fordul elő a legtöbbször stb. Kvázi hatékonyan törhető, és ugyanúgy törhető ha ASCII karakterek helyett meghagyod a nagy számokat.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!