Tag: 椭圆曲线

生成EC Diffie-Hellman公钥和私钥对

我需要生成一个EC Diffie Hellman密钥对。 我使用的是secp256r1命名曲线和OpenSSL。 这就是我到目前为止所拥有的: unsigned char *ecdh(size_t *secret_len) { EVP_PKEY_CTX *pctx, *kctx; EVP_PKEY_CTX *ctx; unsigned char *secret; EVP_PKEY *pkey = NULL, *peerkey, *params = NULL; /* NB: assumes pkey, peerkey have been already set up */ /* Create the context for parameter generation */ if(NULL == (pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL))) printf(“Error in EC key […]

如何提供OpenSSL随机数据以用于ECDSA签名?

我想在使用EC密钥签名数据期间提供OpenSSL特定数据以用作随机种子。 我这样做是为了将我的应用程序与另一个引用程序(闭源)进行比较。 该实用程序将文件与私钥,带有数据的文件进行签名,并将随机数据作为参数进行归档。 我已经获得了EC密钥的生成和数据签名,但由于我没有共同点,因此无法比较这两个应用程序。 OpenSSL生成用于签名数据的随机数据(可能来自/ dev / random),因此每次运行都会给我一个不同的签名。 我已经尝试将RAND_clear()与RAND_add()结合使用,但不断改变签名。 要么我不了解整个ECDSA概念,要么我做错了。 我比较应用程序的第二个选项是导入公钥并validation参考程序生成的签名。 这是更好的选择,但我无法导入给定的示例公钥(83个字符的hex字符串)。 EC_POINT_oct2point()不断给我null结果。 任何帮助/指针/参考将不胜感激。 char * key_as_binary_data; //369368AF243193D001E39CE76BB1D5DA08A9BC0A63307AB352338E5EA5C0E05A0C2531866F3E3C2702 int data_size; //Size of the key buffer EC_POINT * ecpoint = NULL; EC_GROUP * ecgroup = NULL; EC_KEY * eckey = NULL; point_conversion_form_t form = POINT_CONVERSION_UNCOMPRESSED; int asn1_flag = OPENSSL_EC_NAMED_CURVE; eckey = EC_KEY_new(); ecpoint = EC_POINT_new(ecgroup); ecgroup […]

如何在OpenSSL的EVP_PKEY结构中访问原始ECDH公钥,私钥和参数?

我正在使用OpenSSL的c库生成椭圆曲线Diffie-Hellman(ECDH)密钥对,遵循此处的第一个代码示例。 它掩盖了这一行的实际公钥交换: peerkey = get_peerkey(pkey); pkey变量和返回值都是EVP *类型。 pkey包含先前生成的公钥,私钥和params,返回值仅包含对等方的公钥。 所以这提出了三个问题: get_peerkey()实际上如何从get_peerkey()提取公钥,以便发送给对等方? 代码如何从pKey提取私钥和params来存储它们以便在密钥交换后供以后使用? get_peerkey()如何从对等方的原始公钥生成新的EVP_PKEY结构? 我见过OpenSSL函数EVP_PKEY_print_public() , EVP_PKEY_print_private()和EVP_PKEY_print_params()但它们用于生成人类可读的输出。 我还没有发现将人类可读的公钥转换回EVP_PKEY结构的任何等价物。

在OpenSSL中使用ECDSA签名消息

在以编程方式在OpenSSL中使用ECDSA时,如何设置用于签名消息的私钥? 我有以下代码: static int create_signature(unsigned char* hash) { EC_KEY *eckey=NULL; EC_GROUP *ecgroup=NULL; EVP_PKEY *evpkey=NULL; unsigned char *signature=NULL; point_conversion_form_t form = POINT_CONVERSION_UNCOMPRESSED; int signature_size, block_size; unsigned char * block=NULL; ecgroup = get_ec_group_192(); EC_GROUP_set_asn1_flag(ecgroup, OPENSSL_EC_NAMED_CURVE); EC_GROUP_set_point_conversion_form(ecgroup, form); eckey=EC_KEY_new(); EC_KEY_set_group(eckey,ecgroup); EC_KEY_generate_key(eckey); evpkey=EVP_PKEY_new(); EVP_PKEY_assign_EC_KEY(evpkey,eckey); signature=OPENSSL_malloc(EVP_PKEY_size(evpkey)); ECDSA_sign(0, hash, sizeof(hash), signature, &signature_size, eckey); printf(“%s”, signature); return 0; } 函数get_ec_group_192()是通过运行openssl ecparam -C […]