RSA Kryptering.

Tags:    c++

Hej udviklere.

Jeg skal udvikle et program der kan RSA kryptere og dekryptere et ganske almindeligt tekst dokument (.txt). Programmet skal generere en offentlig nøgle der bruges til at kryptere dokumenter med og en hemmelig nøgle der bruges til dekrypteringen. For at lave disse to nøgler skal jeg anvende et, mildest talt, kæmpe primtal. Jeg ved godt det kan lade sig gøre med mindre primtal, men det går kraftigt ud over sikkerheden.
De to store primtal p og q skal være så store, at
n=pq
er af størrelsesorden mindst 2^512 - eller har mere end 154 cifre. Jeg er forholdsvis ny til C/C++ programmering, og har ingen anelse om hvordan jeg kan anvende så store tal til at regne med gennem mit program. Så vidt jeg har forstået det er det ikke muligt at gemme det i en af de prædefineret variabletyper (int/float/double/..), pga. størrelsen selvfølgelig.

Så i første omgang er mit problem altså hvordan jeg får gemt disse to primtal i hver sin variable (eller hvordan man nu gør det), så jeg kan regne med dem. Nogen forslag?

Endvidere vil jeg også gerne høre om det er muligt, at generere så store primtal i programmet. Det er klart, at det sikkert vil tage lang tid, men det er ikke noget problem i første omgang. Så hvis i har nogle forslag til dette, bedes i endelig sige til :-)

Det skal lige siges, at hvis jeg for flere problemer undervejs, stiller jeg dem i denne tråd og først til sidste uddeler jeg pointene.

På forhånd tak.
- Tommy Jakobsen



Indlæg senest redigeret d. 14.03.2006 23:45 af Bruger #8870
7 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 6 karma
Sorter efter stemmer Sorter efter dato
Joh, jeg kan da give dig en lille smule hjælp til at lave en type til store tal. Det kræver en god del tænkning, men det går.

En simpel implementation kunne se sådan her ud, du har selvfølgelig brug for flere operators, da jeg kun har skrevet +=.
Jeg har heller ikke kompileret præcis denne version, så typos osv. er der måske.

Header:
Fold kodeboks ind/udKode 


C++:
Fold kodeboks ind/udKode 


Redigeret:
Nu når jeg lige læste posten igen, syntes jeg lige jeg ville hjælpe med at finde nogle store primtal.
[code]void Largenum::power(const Largenum& l2)
{
Largenum power(1);
unsigned most_significant = other.get_most_significant_bit_set(); // Den funktion må du lige selv lave, den er simpel
for(unsigned long bit = 1; bit <= most_significant; ++bit, *this *= *this)
{
if(other.is_bit_set(bit)) // Endnu en funktion du selv må skrive
power *= *this;
}
data.swap(power.swap);
}



Indlæg senest redigeret d. 05.04.2006 11:31 af Bruger #9792
Hej Tommy

Ved implementering af RSA eller anden form for kryptering, så kan jeg _ikke_ anbefale at du selv begynder at implementere algoritmerne, da det oftest vil efterlade hvor mange (sikkerheds)huller. Ved udvikling af algoritmer, herunder også RSA algortimer, sendes disse i review for at få lukket eventuelle huller. Desuden skal du også tage højde for hvilken modes of operation du vil anvende samt implementering af en padding algoritme (hvis du vælger en block cipher) etc. Dette er blot nogle af tingene omkring krypteringen, herefter kommer hele aspektet omkring nøglehåndtering.

Jeg vil anbefale at du tager et kig på MS Crypto API (CAPI) og API'et til openSSL i stedet, da disse (og deres algoritmer) netop har været igennem adskellige reviews og håndtere ovenstående problemstillinger for dig.

Du kan eventuelt kigge på nedenstående artikel.


http://www.codeproject.com/cpp/EncryptionCryptoAPI.asp


HTH











Indlæg senest redigeret d. 01.09.2006 12:55 af Bruger #10448
Du kan bruge et bibliotek som:
http://swox.com/gmp/
Til at arbejde med de store tal.

At finde primtal bør derpå ikke være noget større problem. Du kan starte med et tilfældigt (stort) tal og tælle op indtil du finder det næste primtal.



Du kan bruge et bibliotek som:
http://swox.com/gmp/
Til at arbejde med de store tal.

At finde primtal bør derpå ikke være noget større problem. Du kan starte med et tilfældigt (stort) tal og tælle op indtil du finder det næste primtal.


Jeg vil helst undgå at bruge et ikke-standart bibliotek (hvis man kan kalde det det). Det må være muligt at skrive noget selv, men hvor avanceret vil det være?



Du kan bruge et bibliotek som:
http://swox.com/gmp/
Til at arbejde med de store tal.

At finde primtal bør derpå ikke være noget større problem. Du kan starte med et tilfældigt (stort) tal og tælle op indtil du finder det næste primtal.


Jeg vil helst undgå at bruge et ikke-standart bibliotek (hvis man kan kalde det det). Det må være muligt at skrive noget selv, men hvor avanceret vil det være?


Jeg har selv lavet et lille projekt med at lave et bignum library og det var mildt sagt ikke nemt. Jeg vil KRAFTIGT anbefale dig ikke at begynde på det selv...specielt fordi du siger at du er ny i C++.
Den her har jeg selv brugt tit og det er meget ligetil at gå til:
http://www.eskimo.com/~weidai/cryptlib.html

Da det er OpenSource kan du også pille klasser ud og smide dem i dit eget (hvis du da opensourcer dit eget program). Ellers må du nøjes med at lænke til det.

GMP ser også udemærket ud, men det har jeg ikke prøvet.



Der er ikke meget gang i den her inde :-)



Der er ikke meget gang i den her inde :-)


Hvad forventer du at vi skal svare?



t