Mikä olisi yleinen ja helppo ympäristö toteuttaa digitaalinen allekirjoitus ECDSA eli DSA-algoritimin elliptinen versio?
En haluaisi mitään eksoottisia lisäkilkkeitä vaan pitäisi onnistua ihan peruskokoonpanolla. Kenttäaritmetiikka olisi joko alkulukukentässä tai polynomikentässä. Hyvin tärkeänä pitäisin sitä että "pisteen kertominen" (Point Multiplication) saataisiin toteutettua tehokkasti koska se on elliptisen käyrän raskaimpia operaatioita.
- SHA1 -tiivistefunktio mielellään valmiina
- Joko valmiina tai helposti tehtävissä : tehokas isojen kokonaislukujen aritmetiikka (alkulukukenttä) / tehokas polynomiaritmetiikka (polynomikenttä)
- hyvät isot näennäissatunnaisluvut
Ehdokkaita:
- C tai C ; voisi olla sinänsä tehokkain, mutta löytyykö ympäristöistä valmiita toimintoja joita voisi hyödyntää, vai pitäisikö kaikki tehdä itse? Valmista C-koodia tosin löytyy lähteistä.
- C# ; miten hankala tämä olisi?
- Java ; suurten lukujen aritmetiikka luokassa java.math.BigInteger ja myös SHA1 luokassa java.security.MessageDigest ja isot satunnaisluvutkin ovat luokkakirjastossa tarjolla
- PHP ; ei ehkä kovin tehokas, mutta peruskokoonpanosta löytyy sha1 ja isojen lukujen aritmetiikan tarjoavat BcMath-funktiot. BcMath taitaa kuitenkin olla melko tehoton ; esim. jos jakolaskussa tarvitaan sekä osamäärä että jakojäännös niin jako on tehtävä tuplana, 2 funktiokutsua.
En haluaisi mitään eksoottisia lisäkilkkeitä vaan pitäisi onnistua ihan peruskokoonpanolla. Kenttäaritmetiikka olisi joko alkulukukentässä tai polynomikentässä. Hyvin tärkeänä pitäisin sitä että "pisteen kertominen" (Point Multiplication) saataisiin toteutettua tehokkasti koska se on elliptisen käyrän raskaimpia operaatioita.
- SHA1 -tiivistefunktio mielellään valmiina
- Joko valmiina tai helposti tehtävissä : tehokas isojen kokonaislukujen aritmetiikka (alkulukukenttä) / tehokas polynomiaritmetiikka (polynomikenttä)
- hyvät isot näennäissatunnaisluvut
Ehdokkaita:
- C tai C ; voisi olla sinänsä tehokkain, mutta löytyykö ympäristöistä valmiita toimintoja joita voisi hyödyntää, vai pitäisikö kaikki tehdä itse? Valmista C-koodia tosin löytyy lähteistä.
- C# ; miten hankala tämä olisi?
- Java ; suurten lukujen aritmetiikka luokassa java.math.BigInteger ja myös SHA1 luokassa java.security.MessageDigest ja isot satunnaisluvutkin ovat luokkakirjastossa tarjolla
- PHP ; ei ehkä kovin tehokas, mutta peruskokoonpanosta löytyy sha1 ja isojen lukujen aritmetiikan tarjoavat BcMath-funktiot. BcMath taitaa kuitenkin olla melko tehoton ; esim. jos jakolaskussa tarvitaan sekä osamäärä että jakojäännös niin jako on tehtävä tuplana, 2 funktiokutsua.
Vastaukset 1
Vanhimmat
Kiitän jo etukäteen mahdollisista kommenteista edelliseen, mutta itse asiassa - kun nyt olen asiaa paremmin miettinyt - luulen että olen sittenkin jo polkuni valinnut.
Toteutus tulee perustumaan C-koodiin, ainakin aluksi lähinnä Michael Rosing:in kirjan "Implementing Elliptic Curve Cryptography" mukaan: http://www.manning.com/rosing/
Ikäähän tuolla kirjalla on jo toistakymmentä vuotta eikä matemaatikot sitä kauheasti alunperinkään ole kehuneet, mutta se on vain lähtökohta josta koodia kehitellään eteenpäin. Luulenpa että polynomikenttä on ensisijainen valinta kenttäaritmetiikaksi.
Lopullisessa ratkaisussa luultavasti käytän valmiita NIST-käyriä enkä Rosing:in käyttämiä satunnaisia käyriä.
http://en.wikipedia.org/wiki/Elliptic_curve_cryptography
Ohjelmointiympäristönä tulee luultavasti toimimaan Qt 4.5 eli Nokian älykännyköillekin sopiva ympäristö koska haaveena on että softa vielä joskus pyörisi myös Symbian- tai Maemo-älykännykässä.
http://qt.nokia.com/products/developer-tools
Qt ei juurikaan sisällä valmiina edellä hahmoteltuja ECC-valmiuksia mutta Rosing:in kirja tarjoaa riittävät eväät mm. sha1:lle ja polynomiaritmetiikalle.
Näin sen täytyy tässä vaiheessa olla. Toivotan onnea itselleni valitsemallani tiellä :-)