2017-07-11 8 views
2

Avec les API Java Card, qui prennent en charge les courbes elliptiques, comment calculer une clé publique à partir d'une clé secrète connue.Calcul de la clé publique ECC à partir d'une clé privée dans JavaCard

Suite à une négociation de secret partagé DH, je suis intéressé par la dérivation de clés communes partagées. Selon TR-03111 et X9.63 le secret partagé de l'accord de clé ECC DH ne doit pas être utilisé mais, selon ma compréhension, la représentation affine de la coordonnée x (La composante x de la clé publique associée au secret partagé comme une clé privée) doit être utilisé. Avec l'arithmétique BigInteger ou ECPoint.multiply(), il est facile, mais aucune API de ce type n'existe dans Java Card.

+0

Utilisez-vous la classe KeyAgreement? Pourquoi n'appelez-vous pas simplement generateSecret? – vojta

+0

J'ai utilisé la classe KeyAgreement pour générer un secret partagé. Maintenant, je veux utiliser le secret partagé comme une clé privée et dériver la clé publique. Autant que je sache, KeyAgreement ne peut pas être utilisé pour cela. – Nick

Répondre

1

Cette multiplication n'est pas directement disponible pour Java Card. Fondamentalement Java Card cache des opérations de bas niveau pour vous. Cependant, si vous avez une carte Java relativement récente, vous pouvez vous en tirer en utilisant une instance KeyAgreement créée en utilisant ALG_EC_SVDP_DH_PLAIN_XY. Ce que vous pouvez faire est de créer un ECPublicKey où le point clé public est simplement mis au point G. Ce point de base G fait partie des paramètres du domaine. La clé privée doit bien sûr être définie sur votre valeur. Ensuite, tout ce qu'il faut faire est d'effectuer un accord de clé; le résultat de l'accord sera les points X et Y de la clé publique.


Notez que la prise en charge de toute constante d'algorithme dépend de l'implémentation de la carte. La constante sera là - si l'API implémentée est assez récente - mais l'algorithme peut ne pas être implémenté.