P-256 est la courbe de Weierstrass courte y² = x³ − 3x + b modulo le nombre premier p = 2²⁵⁶ − 2²²⁴ + 2¹⁹² + 2⁹⁶ − 1, dont l’ordre du groupe est premier (cofacteur 1). Elle est spécifiée dans la NIST SP 800-186 §3.2.1.3 et dans SEC 2 sous le nom secp256r1 ; OpenSSL l’appelle prime256v1, son OID est 1.2.840.10045.3.1.7, TLS la nomme secp256r1 (groupe 23) et JOSE/COSE utilisent "crv": "P-256".
Tailles : clés privées de 32 octets ; clés publiques de 65 octets non compressées (04‖x‖y) ou de 33 octets compressées ; signatures ECDSA de 64 octets au format r‖s brut (JWS ES256) ou de 70 à 72 octets en DER (X.509, TLS, assertions WebAuthn, formats par défaut d’OpenSSL et de Java). Mélanger les deux encodages est la cause la plus fréquente d’une « signature invalide » avec des clés valides.
C’est la courbe par défaut presque partout : JWT ES256, clés d’accès (algorithme COSE −7), certificats TLS ECDSA et key shares, Secure Enclave d’Apple, ainsi que la plupart des HSM et des cartes à puce, qui ne prennent souvent en charge aucune autre courbe. Sur un cœur d’Apple M4 Max, OpenSSL 3.6.5 produit environ 87 000 signatures ECDSA P-256 et en vérifie environ 29 000 par seconde.
Ses coefficients proviennent d’une graine inexpliquée de la NSA, ce qui explique en partie pourquoi certains concepteurs préfèrent Curve25519 ; aucune faiblesse de P-256 elle-même n’est connue. Comme toute courbe elliptique, elle ne résiste pas à un grand ordinateur quantique, et le NIST IR 8547 (projet) propose d’interdire ECDSA et ECDH à tous les niveaux de sécurité après 2035. Pour la courbe de Bitcoin, consultez P-256 vs secp256k1.