Ik wil, als uitdaging, een RSA-like encryptiesysteem maken dat via Javascript een bericht versleuteld, deze verstuurd naar de server. De server ontsleuteld vervolgens het bericht en gaat er mee verder werken. Heb naar wt zoeken en dergelijke wel door hoe het allemaal werkt, mede dankzij de volgende wikipedia: http://en.wikipedia.org/wiki/RSA.
Encryptie: Het bericht word omgezet in een nummer n die kleiner is als de modulus N. Dit getal n word tot de macht e verheven (de publieke exponent), vervolgens word van de uitkomst de rest-deling met N berekent:
Oftewel: versleuteld = pow(naarGetal(text), e) mod N;
Decryptie: Het versleutelde bericht (een getal) word verheven tot de macht d (de geheime exponent), ver, vervolgens word van de uitkomst de rest-deling met N berekent. Het getal wat daar uitkomt is via een reverse naarGetal om te zetten in de originele text.
Oftewel: text = naarText(pow(versleuteld, d) mod N);
So far so good: ik weet hoe het werkt, en in pseudocode heb ik alles al af: Maar voor mij blijft er een probleem, namelijk de enorme grote van de getallen: Het nummer n is een 192bits getal, dat maakt de modulus dus groter dan 192bits, deze word waarschijnlijk groter dan 512bits. Verder zullen de uitkomsten van de machtsverheffing ronduit gigantisch zijn. Dus zo te zien geen getallen waar PHP mee om kan gaan, laat staan javascript.
Nou heb ik al wel wat gezocht, en vond op de wikipedia-site het volgende: http://en.wikipedia.org/wiki/Modular_exponentiation
Daar word heel netjes en mooi de belangrijkste bewerking verklaart hoe die beter/efficienter/sneller kan. Maar dan blijft het probleem: hoe vermenigvuldig ik, hoe bereken ik de modulus, of hoe doe ik een bitshift op zulke grote getallen.
Nou heb ik al gezocht via google, vind ook meerdere uitgewerkte voorbeelden (bijvoorbeeld: www.leemon.com). Maar ik wil zelf weten hoe ik het aan de gang krijg en wat ik aan het doen ben. Via google heb ik geen tutorial/uitleg of iets dergelijks niets kunnen vinden.
Dus mijn vraag: Hoe ga je om/hoe reken je met grote getallen in een omgeving die die grote van de getallen niet natief ondersteund. En dit op een manier die je helemaal snapt.
Encryptie: Het bericht word omgezet in een nummer n die kleiner is als de modulus N. Dit getal n word tot de macht e verheven (de publieke exponent), vervolgens word van de uitkomst de rest-deling met N berekent:
Oftewel: versleuteld = pow(naarGetal(text), e) mod N;
Decryptie: Het versleutelde bericht (een getal) word verheven tot de macht d (de geheime exponent), ver, vervolgens word van de uitkomst de rest-deling met N berekent. Het getal wat daar uitkomt is via een reverse naarGetal om te zetten in de originele text.
Oftewel: text = naarText(pow(versleuteld, d) mod N);
So far so good: ik weet hoe het werkt, en in pseudocode heb ik alles al af: Maar voor mij blijft er een probleem, namelijk de enorme grote van de getallen: Het nummer n is een 192bits getal, dat maakt de modulus dus groter dan 192bits, deze word waarschijnlijk groter dan 512bits. Verder zullen de uitkomsten van de machtsverheffing ronduit gigantisch zijn. Dus zo te zien geen getallen waar PHP mee om kan gaan, laat staan javascript.
Nou heb ik al wel wat gezocht, en vond op de wikipedia-site het volgende: http://en.wikipedia.org/wiki/Modular_exponentiation
code:
1
2
3
4
5
6
7
8
9
10
11
12
| Bignum modpow(Bignum b, Bignum e, Bignum m) { Bignum result = 1; while (e > 0) { if (e & 1 > 0) result = (result * b) % m; e >>= 1; b = (b * b) % m; } return result; } |
Daar word heel netjes en mooi de belangrijkste bewerking verklaart hoe die beter/efficienter/sneller kan. Maar dan blijft het probleem: hoe vermenigvuldig ik, hoe bereken ik de modulus, of hoe doe ik een bitshift op zulke grote getallen.
Nou heb ik al gezocht via google, vind ook meerdere uitgewerkte voorbeelden (bijvoorbeeld: www.leemon.com). Maar ik wil zelf weten hoe ik het aan de gang krijg en wat ik aan het doen ben. Via google heb ik geen tutorial/uitleg of iets dergelijks niets kunnen vinden.
Dus mijn vraag: Hoe ga je om/hoe reken je met grote getallen in een omgeving die die grote van de getallen niet natief ondersteund. En dit op een manier die je helemaal snapt.