вычислять открытый ключ из закрытого ключа неверно - PullRequest
0 голосов
/ 24 мая 2019

Я использую кривую ЕС P-256.Я генерирую пару ключей.Затем, формируя закрытый ключ, я вычисляю открытый ключ.

По некоторым причинам два значения открытого ключа не соответствуют.

См. Прилагаемый код с функцией для генерации пары ключей:

public static AsymmetricCipherKeyPair  Generate_EC_P256_Key_Pair(SecureRandom random)
    {
        // Select the curve P-256 //
        string curveName = "P-256";
        X9ECParameters ecP = NistNamedCurves.GetByName(curveName);
        ECDomainParameters dom_parameters = new ECDomainParameters(ecP.Curve, ecP.G, ecP.N);

        // Generate EC Key Pair //
        ECKeyPairGenerator pGen = new ECKeyPairGenerator();
        ECKeyGenerationParameters genParam = new ECKeyGenerationParameters(dom_parameters, random);
        pGen.Init(genParam);
        AsymmetricCipherKeyPair keypair = pGen.GenerateKeyPair();

        AsymmetricKeyParameter Priv_key = keypair.Private;
        AsymmetricKeyParameter Pub_key = keypair.Public;

        ECPrivateKeyParameters private_key = (ECPrivateKeyParameters)keypair.Private;
        ECPublicKeyParameters public_key = (ECPublicKeyParameters)keypair.Public;

        BigInteger priv_key_exp = private_key.D;
        BigInteger test2 = public_key.Q.XCoord.ToBigInteger();
        BigInteger test3 = public_key.Q.YCoord.ToBigInteger();

        ECPoint pub_key_1 = dom_parameters.G.Multiply(priv_key_exp);
        BigInteger test4 = pub_key_1.XCoord.ToBigInteger();
        BigInteger test5 = pub_key_1.YCoord.ToBigInteger();

        Console.WriteLine("Exponent: " + priv_key_exp.ToString(16));
        Console.WriteLine("X-Coord: " + test2.ToString(16));
        Console.WriteLine("X-Coord: " + test4.ToString(16));
        Console.WriteLine("\n");
        Console.WriteLine("Y-Coord: " + test3.ToString(16));
        Console.WriteLine("Y-Coord: " + test5.ToString(16));

        return keypair;
    }

Если сравнить координаты (X, Y) как сгенерированного открытого ключа, так и рассчитанного открытого ключа.Вы получите другое значение.Я ожидал бы того же значения!Что не так?

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Джеймс К. Полк указал мне правильное направление. Сначала мне нужно было нормализовать точку ("pub_key_1 = pub_key_1.Normalize ()"), прежде чем я смог получить координаты. Я изменил код соответствующим образом, и теперь он дает мне правильные результаты.

Спасибо!

public static AsymmetricCipherKeyPair  Generate_EC_P256_Key_Pair(SecureRandom random)
    {
        // Select the curve P-256 //
        string curveName = "P-256";
        X9ECParameters ecP = NistNamedCurves.GetByName(curveName);
        ECDomainParameters dom_parameters = new ECDomainParameters(ecP.Curve, ecP.G, ecP.N);

        // Generate EC Key Pair //
        ECKeyPairGenerator pGen = new ECKeyPairGenerator();
        ECKeyGenerationParameters genParam = new ECKeyGenerationParameters(dom_parameters, random);
        pGen.Init(genParam);
        AsymmetricCipherKeyPair keypair = pGen.GenerateKeyPair();


        ECPrivateKeyParameters private_key = (ECPrivateKeyParameters)keypair.Private;
        ECPublicKeyParameters public_key = (ECPublicKeyParameters)keypair.Public;

        BigInteger priv_key_exp = private_key.D;

        BigInteger genx = public_key.Q.XCoord.ToBigInteger();
        BigInteger geny = public_key.Q.YCoord.ToBigInteger();
        BigInteger genx_aff = public_key.Q.AffineXCoord.ToBigInteger();
        BigInteger geny_aff = public_key.Q.AffineYCoord.ToBigInteger();

        ECPoint pub_key_1 = dom_parameters.G.Multiply(priv_key_exp);

        pub_key_1 =pub_key_1.Normalize();

        BigInteger calcx = pub_key_1.XCoord.ToBigInteger();
        BigInteger calcy = pub_key_1.YCoord.ToBigInteger();

        Console.WriteLine("Exponent: " + priv_key_exp.ToString(16));
        Console.WriteLine("Generated X-Coord        : " + genx.ToString(16));
        Console.WriteLine("Generated X-Coord Affine : " + genx_aff.ToString(16));
        Console.WriteLine("Calculated X-Coord Affine: " + calcx.ToString(16));
        Console.WriteLine("\n");
        Console.WriteLine("Generated Y-Coord        : " + geny.ToString(16));
        Console.WriteLine("Generated Y-Coord Affine : " + geny_aff.ToString(16));
        Console.WriteLine("Calculated Y-Coord Affine: " + calcy.ToString(16));


        return keypair;
    }
0 голосов
/ 24 мая 2019

Вы получаете неправильные координаты X и Y. Внутренне точки хранятся в альтернативном представлении (X, Y, Z), включающем нечто, называемое проективными координатами. Вы хотите аффинные координаты. Эквивалентные (X, Y) аффинные координаты извлекаются через свойства AffineXCoord и AffineYCoord.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...