La signature d'un message à l'aide de ECDSA dans OpenSSL

Comment puis-je configurer la clé privée de signature de messages lors de l'utilisation de ECDSA dans OpenSSL par programmation? J'ai le code suivant:

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;
}

La fonction get_ec_group_192() est créé par l'exécution de openssl ecparam -C -name secp192k1 -genkey qui génère également certains EC PARAMETERS et un EC PRIVATE KEY.

Ce que je suis en train de faire est de chiffrer le message contenu dans hash avec ma clé privée de sorte que seule la clé publique peut le décrypter. Est-ce possible avec le code ci-dessus, ou suis-je le faire complètement tort?

La terminologie est "signature". Le mot "cryptage" est réservé pour autre chose. Vous n'avez pas mentionné ce problème que vous rencontrez.
Ah, désolé à ce sujet. Bien dans le code ci-dessus extrait de la clé privée n'est pas utilisé n'importe où? Ou est-ce seulement nécessaire lors de la signature du message?
Remarque, le Chiffrement à l'aide d'une clé privée est en fait appelé "signature". Quiconque détient le public correspondant de la moitié va décrypter le résultat (qui est en fait appelé "vérification")
En retard mais: hash ici devrait point à une valeur de hachage, typiquement de 20 octets (SHA1) ou de 24 à 64 octets (pour SHA2), mais en C sizeof(hash) est la taille de la pointeur, en général 4 ou 8 octets, et non pas la taille de l'objet pointé. Aussi une signature ECDSA, comme la plupart des autres moderne crypto objets, est arbitraire bits (aka "binary") et peut valablement inclure une-0-bits de l'octet, mais n'est pas toujours suivie par une autre qui la rend invalide à le traiter comme un nul C de la chaîne qui printf %s essaie de faire, comme d'habitude, y compris les octets qui ne sont pas en sécurité imprimable. ...
... Et RSA signer et vérifier sont similaire, mais non en fait "chiffrer avec privatekey" et "décrypter avec publickey", mais dans ECDSA (et DSA), il n'en est rien, même de loin ressemble à de chiffrement et de déchiffrement, il y a signer et vérifier.

OriginalL'auteur Anvar | 2010-02-09