Cryptography 为什么用椭圆曲线SECP256k1代替生成点不满足有限域上的曲线方程?

Cryptography 为什么用椭圆曲线SECP256k1代替生成点不满足有限域上的曲线方程?,cryptography,Cryptography,我开始了解椭圆曲线密码术。我正在编写一个C++类来做椭圆曲线运算,如点加法、点加倍和标量乘法。它使用GMPLIB在有限域上进行大整数运算。我只触及了椭圆曲线数学的表面。但是我的C++类成功地完成了对小曲线密码的所有操作,但是当SECP标准给出的曲线的值被替换时(SEP256K1)就被卡死了。 我的C++类自动验证一个点是否位于曲线上。它表示生成器点不在SECP曲线上 编辑:感谢大家的支持!!!:)我让应用程序运行,并成功地进行了点加法和标量乘法,它能够进行加密和解密!!!:) 但仍然只有SECP

我开始了解椭圆曲线密码术。我正在编写一个C++类来做椭圆曲线运算,如点加法、点加倍和标量乘法。它使用GMPLIB在有限域上进行大整数运算。我只触及了椭圆曲线数学的表面。但是我的C++类成功地完成了对小曲线密码的所有操作,但是当SECP标准给出的曲线的值被替换时(SEP256K1)就被卡死了。

我的C++类自动验证一个点是否位于曲线上。它表示生成器点不在SECP曲线上

编辑:感谢大家的支持!!!:)我让应用程序运行,并成功地进行了点加法和标量乘法,它能够进行加密和解密!!!:) 但仍然只有SECP曲线,它停留在生成器点不在曲线上!!! 我注释掉了这段代码,它工作得非常完美: 这是检查点有效性并导致问题的代码:

bool IsValidPoint()
    {
        if ((Square(y) % curve.p) == ((Cube(x) + (curve.a) * x + (curve.b))%curve.p ))
        {
                return true;
         }
            /***Error : returns false !!! ***/
            /* curve.p is the proven prime , a, b have their usual  meanings
 n is the order of the curve 'x' is the variable in the equation y^2 = x^3 + ax +b where a = 0,  b =7 (for SECP256k1)       */
            return false;
    }
EDIT2:简单代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <gmpxx.h>
using namespace std;
int main()
{
      mpz_class a = mpz_class("0");
      mpz_class b = mpz_class("7");
     mpz_class Gx= mpz_class("55066263022277343669578718895168534326250603453777594175500187360389116729240");
     mpz_class Gy= mpz_class("32670510020758816978083085130507043184471273380659243275938904335757337482424");
     mpz_class p= mpz_class("115792089237316195423570985008687907852837564279074904382605163141518161494337");
     cout << (((Gx * Gx * Gx)+a*Gx+b) -  (Gy * Gy )) % p << endl;
     //cout << ((Gx * Gx * Gx)+a*Gx+b) % p << endl;
      return 0;
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
mpz_a类=mpz_类(“0”);
mpz_b类=mpz_类(“7”);
mpz_类Gx=mpz_类(“55066263022277734366957871889516853432650603453777594175500187360389116729240”);
mpz_类Gy=mpz_类(“326705100207588169780830851305070431844712733806592432759389043357573374824”);
mpz_类p=mpz_类(“11579208923731619542357098500868790785283756427907904382860516314161494337”);

cout您的
p
值是错误的。根据它应该是

fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff e fffffff c2f

十进制的哪个是

1157920892373161954235709850086879078532699846656640564039457584007908834671663


将代码更改为使用正确的
p
,我得到了
0
的预期输出。该点确实在曲线上。

我们无法在不查看代码的情况下帮助您处理代码。请提供一个。每条曲线都有一个特定的GThankyou Mat和Woodstock供您帮助!!!:)请查看我的编辑!!!我是堆栈溢出新手,我我不知道如何格式化它的代码!!!但我下载了这个应用程序,我觉得它非常棒!!!::):@Mat:谢谢,请查看我的编辑!!!请展示完整的代码-例如,一个完整的程序,有人可以编译和运行,而不必猜测如何填充缺少的内容(主功能等)。非常感谢您的回答!!!您发现了一个我三天多没注意到的错误。我在网上将值从十六进制转换为十进制,错误地将n和素数P的顺序设置为相同!!!我的代码现在运行得非常好!!!非常感谢!!!::::)顺便说一句,出于好奇,这是曲线tru的辅助因子被评为1???对不起,我对密码学很感兴趣!!!我从YouTube视频中学习了ECC的基础知识!!!我很高兴现在一切都完美无瑕!!!愿上帝保佑你!!!:):)我明白协因子完全等于1是唯一理想的!!!实际上这里的辅因子是:1.0000000000000000000000000000000000000037344553450401341527595825479805550940193115084298802686998283非常感谢!!!你的回答为我打开了这么多的洞见!!!感谢你为此花费宝贵的时间!!!我认为理想曲线在数学抽象世界中是可能的!!!我不是数学专家,我真的不知道ellipt的数学深度ic曲线!!!作为初学者,你能为我的研究推荐一些书/起点吗?:)另外,作为旁注,我意识到ECC的所有方程都是模素数,但在计算过程中,我注意到有负斜率和负坐标(肯定满足曲线方程)在计算的中间步骤(如点加法、加倍等)中出现。根据有限域代数的规则,这是允许的吗!!!?此外,这些过程是无声的,因此除非我记录它们!!!???如果我错了,请纠正我!::)但是密码过程仍然完美无缺地运行所有这些!!!非常感谢!!!☺☺☺余因子是曲线的阶数(即数字n)除以点的阶数(即必须将其添加到自身以产生恒等式的次数).根据拉格朗日定理,它必须是一个整数,这里的事实是1,这正是G是群的生成器的陈述,即点的阶数正好等于n。如果你没有发现它们相等,那么你的计算有问题。你应该使用整数除法,而不是浮点数i在这种情况下,因为浮点不是完全精确的。@VivekanandV:另外,求反在算术模p中是完全有效的;它与从p中减法是一样的。例如,使用mod 5,我们得到-1相当于4。因此,对于给定的数字,没有一个定义明确的概念是“负”或“正”.你可能想要一本关于模算术/群论/抽象代数的初级教科书。我没有一本可以马上推荐,但大多数入门书都应该涵盖这些内容。