Exetools

Exetools (https://forum.exetools.com/index.php)
-   General Discussion (https://forum.exetools.com/forumdisplay.php?f=2)
-   -   Help with ECC (FGInt) (https://forum.exetools.com/showthread.php?t=11013)

TmC 07-25-2007 07:56

Help with ECC (FGInt)
 
Hi,
I need some help with figuring out how to create a key-scheme with ECDSA and Delphi 7.

I am using the FGInt package and the ECDSA one, downloadable from the triade system homepage (http://www.submanifold.be/triade/GInt/bin/ECDSA.zip)

With the RSA version, no problem. I replaced n with d, so that only me is able to generate keys, while everyone can test them (with this package i can go up to 4096 with succesfull speed) and replaced the RSASign(test, d, n, Nilgint, Nilgint, Nilgint, Nilgint, signature) RSAVerify(test, signature, e, n, ok); with th actual values of d, n and e so that all the prime generation part is onl done by me once at time to get the keys.

I am new to ECDSA, so maybe i don't understand something. I am stuck with doing the same thing with ECDSA because there are some things i don't understand.

1) I suppose that similarly to RSA, i should exchange the secret key with the public one, so that only me is able to generate keys, BUT i don't understand where the private key is:
Also, if the private key is x i should put x in ECDSASign and the public key in ECDSAVerify, but the only differences between the two are x and y, but they cannot be exchanged since y is an ECPoint and x is FGInt so i am a bit stuck up in this.
I even asked myself if this scheme could be used to do what i am trying to do, but since armadillo uses ECDSA 113 it SHOULD BE possible.

2) Also for RSA i deleted the generation routine and replaced the values in RSAVerify with actual values, calling the Base10StringtoFGInt (or whatever its name is) and things actually worked.
In this ECDSA, i can't do that, since k should change at every generation and, MOST IMPORTANT THING, theparameters accepted by the ECDSAVerify are NOT all FGInts but there are also ECPoints, and there is no function to convert back and forth them to and from string, so i am unable to replace that values.
I could use the ECPointKMultiple(g, p, a, x, y) that generates y, but it requires also x making the entire scheme useless since the secret key would be revealed. That made me think that maybe x is not the private key but did not find in the implementation any information about it.

3) Also, what is the encrypted(signature) resulting from ECDSASign, r or s? if it is s, what is r? (o vice versa).

Can someone help me to clarify those issues?
Thanks in advance

tofu-sensei 07-25-2007 20:09

x is the private key (used for signing), y the public key (used to verify a signature), the actual signature is comprised of both r and s.

TmC 07-25-2007 22:03

Quote:

Originally Posted by tofu-sensei
x is the private key (used for signing), y the public key (used to verify a signature), the actual signature is comprised of both r and s.

And how do I pass the ECPoint parameters?

ECDSAVerify(T, r, s, p, a, n, g, y, ok);

T, r and s are string so no problem, T:= 'somestring';
p,a,n are FGInt so no problem, p := Base10ToFGInt('somestring');

but for g and y?

taos 07-26-2007 19:02

Uhmm I'm not expert in Delphi (ASM is better) but g,y are TECPoint data types.
Tecpoint is a record
:TECPoint = Record
XCoordinate, YCoordinate : TFGInt;
Infinity : Boolean;
You can manipulate TECPOINT to convert to string ( ECPointToECPointString) or reverse (ECPointStringToECPoint). TEcpoints are this y^2 = x^3 + a*x + b and they are points on a elliptic curve.
Maybe this can help you:
ECPointKMultiple(g, p, a, x, y);

'Code:
Begin
// setting up parameters
writeln('setting up EC parameters ...');
Base256StringToFGInt('222222aatzzzznnn', p);
ok := true;
While ok Do
Begin
FindPrimeGoodCurveAndPoint(p, a, b, h, n, 60, g);
IsECSuperSingular(p, a, b, ok);
If ok Then
Begin
FGIntDestroy(a);
FGIntDestroy(b);
FGIntDestroy(h);
FGIntDestroy(n);
ECPointDestroy(g);
End;
End;
Base256StringToFGInt('ergezam', x);
ECPointKMultiple(g, p, a, x, y);
Base10StringToFGInt('63557', k);
Base2StringToFGInt('1', one);
FGIntGCD(k, n, temp);
While Not (FGIntCompareAbs(one, temp) = Eq) Do
Begin
FGIntDestroy(temp);
FGIntAddBis(k, one);
FGIntGCD(k, n, temp);
End;
FGIntDestroy(temp);
FGIntDestroy(one);

// with all these precautions everything is set up for signing/verifying

T := 'A black hole is a place where God divided by zero';
writeln('Signing the following string: ', T);
ECDSASign(T, p, a, x, n, k, g, r, s);
writeln('Verifying signature...');
ECDSAVerify(T, r, s, p, a, n, g, y, ok);
If ok Then writeln('Verification complete: signature is valid') Else writeln('Signature is not valid');

FGIntDestroy(p);
FGIntDestroy(a);
FGIntDestroy(n);
FGIntDestroy(k);
FGIntDestroy(h);
FGIntDestroy(x);
ECPointDestroy(g);
ECPointDestroy(y);
readln;
'End CODE

TmC 07-28-2007 08:17

Quote:

Originally Posted by taos
Uhmm I'm not expert in Delphi (ASM is better) but g,y are TECPoint data types.
Tecpoint is a record
:TECPoint = Record
XCoordinate, YCoordinate : TFGInt;
Infinity : Boolean;
You can manipulate TECPOINT to convert to string ( ECPointToECPointString) or reverse (ECPointStringToECPoint). TEcpoints are this y^2 = x^3 + a*x + b and they are points on a elliptic curve.
Maybe this can help you:
ECPointKMultiple(g, p, a, x, y);

'Code:
Begin
// setting up parameters
writeln('setting up EC parameters ...');
Base256StringToFGInt('222222aatzzzznnn', p);
ok := true;
While ok Do
Begin
FindPrimeGoodCurveAndPoint(p, a, b, h, n, 60, g);
IsECSuperSingular(p, a, b, ok);
If ok Then
Begin
FGIntDestroy(a);
FGIntDestroy(b);
FGIntDestroy(h);
FGIntDestroy(n);
ECPointDestroy(g);
End;
End;
Base256StringToFGInt('ergezam', x);
ECPointKMultiple(g, p, a, x, y);
Base10StringToFGInt('63557', k);
Base2StringToFGInt('1', one);
FGIntGCD(k, n, temp);
While Not (FGIntCompareAbs(one, temp) = Eq) Do
Begin
FGIntDestroy(temp);
FGIntAddBis(k, one);
FGIntGCD(k, n, temp);
End;
FGIntDestroy(temp);
FGIntDestroy(one);

// with all these precautions everything is set up for signing/verifying

T := 'A black hole is a place where God divided by zero';
writeln('Signing the following string: ', T);
ECDSASign(T, p, a, x, n, k, g, r, s);
writeln('Verifying signature...');
ECDSAVerify(T, r, s, p, a, n, g, y, ok);
If ok Then writeln('Verification complete: signature is valid') Else writeln('Signature is not valid');

FGIntDestroy(p);
FGIntDestroy(a);
FGIntDestroy(n);
FGIntDestroy(k);
FGIntDestroy(h);
FGIntDestroy(x);
ECPointDestroy(g);
ECPointDestroy(y);
readln;
'End CODE

Thanks taos, but the problem is just that one:

I should get y and g without involving x(the private key) or the entire scheme is useless since the private key is revealed and included in the program so everyone can create keys for it (etc etc)...

other helps?


All times are GMT +8. The time now is 19:39.

Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2026, vBulletin Solutions, Inc.
Always Your Best Friend: Aaron, JMI, ahmadmansoor, ZeNiX