c - openssl Elliptic_Curve_Cryptography - 定义 "custom"曲线

标签 c openssl elliptic-curve

我正在尝试定义曲线 secp192r1,它在 openssl 中不能用作命名曲线。

我正在使用来自 http://www.secg.org/SEC2-Ver-1.0.pdf 的数据标准杆。 2.5.2

在从 wiki 复制的函数 create_curve() 中 https://wiki.openssl.org/index.php/Elliptic_Curve_Cryptography#Defining_Curves

我的问题:调用 EC_POINT_set_affine_coordinates_GFp(curve, generator, x, y, ctx) 返回错误

我在这里复制了完整的函数(但我使用了不同的二进制数据):

EC_GROUP *create_curve(void)
{
BN_CTX *ctx;
EC_GROUP *curve;
BIGNUM *a, *b, *p, *order, *x, *y;
EC_POINT *generator;

/* Binary data for the curve parameters */
unsigned char a_bin[28] =
    {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
     0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,
     0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE};
unsigned char b_bin[28] =
    {0xB4,0x05,0x0A,0x85,0x0C,0x04,0xB3,0xAB,0xF5,0x41,
     0x32,0x56,0x50,0x44,0xB0,0xB7,0xD7,0xBF,0xD8,0xBA,
     0x27,0x0B,0x39,0x43,0x23,0x55,0xFF,0xB4};
unsigned char p_bin[28] =
    {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
     0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,
     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01};
unsigned char order_bin[28] =
    {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
     0xFF,0xFF,0xFF,0xFF,0x16,0xA2,0xE0,0xB8,0xF0,0x3E,
     0x13,0xDD,0x29,0x45,0x5C,0x5C,0x2A,0x3D };
unsigned char x_bin[28] =
    {0xB7,0x0E,0x0C,0xBD,0x6B,0xB4,0xBF,0x7F,0x32,0x13,
     0x90,0xB9,0x4A,0x03,0xC1,0xD3,0x56,0xC2,0x11,0x22,
     0x34,0x32,0x80,0xD6,0x11,0x5C,0x1D,0x21};
unsigned char y_bin[28] =
    {0xbd,0x37,0x63,0x88,0xb5,0xf7,0x23,0xfb,0x4c,0x22,
     0xdf,0xe6,0xcd,0x43,0x75,0xa0,0x5a,0x07,0x47,0x64,
     0x44,0xd5,0x81,0x99,0x85,0x00,0x7e,0x34};

/* Set up the BN_CTX */
if(NULL == (ctx = BN_CTX_new())) handleErrors();

/* Set the values for the various parameters */
if(NULL == (a = BN_bin2bn(a_bin, 28, NULL))) handleErrors();
if(NULL == (b = BN_bin2bn(b_bin, 28, NULL))) handleErrors();
if(NULL == (p = BN_bin2bn(p_bin, 28, NULL))) handleErrors();
if(NULL == (order = BN_bin2bn(order_bin, 28, NULL))) handleErrors();
if(NULL == (x = BN_bin2bn(x_bin, 28, NULL))) handleErrors();
if(NULL == (y = BN_bin2bn(y_bin, 28, NULL))) handleErrors();

/* Create the curve */
if(NULL == (curve = EC_GROUP_new_curve_GFp(p, a, b, ctx))) handleErrors();

/* Create the generator */
if(NULL == (generator = EC_POINT_new(curve))) handleErrors();
if(1 != EC_POINT_set_affine_coordinates_GFp(curve, generator, x, y, ctx))
    handleErrors();

/* Set the generator and the order */
if(1 != EC_GROUP_set_generator(curve, generator, order, NULL))
    handleErrors();

EC_POINT_free(generator);
BN_free(y);
BN_free(x);
BN_free(order);
BN_free(p);
BN_free(b);
BN_free(a);
BN_CTX_free(ctx);

return curve;
}

最佳答案

首先,这完全是对未驯化的迁徙水禽的追求,因为 OpenSSL 确实内置了 secp192r1,其原始/早期的 X9.62 名称为 prime192v1。亲自看看:

openssl ecparam -name prime192v1 -param_enc explicit -noout -text 

其次,您发布的代码是正确的(虽然很傻,因为 secp224r1 aka P-224 也是内置的)并且工作正常。您正在运行的代码显然不同,但由于您不让我们看到它,因此无法尝试找出它有什么问题(除了不必要之外)。

关于c - openssl Elliptic_Curve_Cryptography - 定义 "custom"曲线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50513779/

相关文章:

c - 准确理解汇编语言如何提高效率

c - 结构问题 'C'

ssl - 如何在Openssl中实现客户端相互认证?

c# - 如何将 openssl_pkey_get_public 和 openssl_verify 转换为 C# .NET

python - 将 base-64 spki 字符串转换为公钥

c++ - 检测多个枚举项何时映射到相同的值

c - 在 Netbeans 8.1 中包括外部 C 库

java - openssl - 通过 Java 解密

java - 最近的 Java 升级导致椭圆曲线服务器证书的 TLS 握手失败?

java - 使用 ECDH 公钥封装 key ?