Код на Java подписывает данные через java.security.Signature, KeyPairGenerator и KeyFactory, а работу выполняют собственные провайдеры JDK: SunEC для эллиптических кривых и EdDSA, а также более новые провайдеры ML-KEM (javax.crypto.KEM, JDK 24) и ML-DSA. Android, Kotlin и все фреймворки для JVM построены на том же API, поэтому его значения по умолчанию проявляются в Spring, Keycloak и бесчисленных SDK.
Кодировку определяет имя алгоритма. SHA256withECDSA выдаёт и ожидает ASN.1 DER; SHA256withECDSAinP1363Format использует 64-байтовый формат raw r‖s, который нужен JWS и WebCrypto, как в примере. Если их перепутать, поведение несимметрично: подпись raw, переданная в SHA256withECDSA, приводит к исключению SignatureException, а подпись DER, переданная варианту P1363, просто даёт false. NONEwithECDSA подписывает вычисленный вами дайджест (такая подпись прошла проверку через SHA256withECDSA по исходному сообщению), а имя хеша не зависит от кривой, поэтому SHA256withECDSA с ключом P-384 допустим, но не проходит проверку у сторон, которые ожидают SHA-384.
SunEC в JDK 25 предлагает для ECDSA только secp256r1, secp384r1 и secp521r1: P-224, secp256k1 и кривые Brainpool вызвали ошибки, поэтому код для Bitcoin и Ethereum на JVM использует Bouncy Castle или web3j. Nonce случайные, s не нормализуется, а проверка принимает значения из обеих половин диапазона, поэтому для сторон, строго требующих low-S, в подписях нужно заменить s на n − s.
Ключи загружаются из X.509 SPKI DER (X509EncodedKeySpec), PKCS#8 DER (PKCS8EncodedKeySpec) или из отдельных компонентов в формате raw (ECPrivateKeySpec). Поддержка PEM появилась в JDK 25 в виде предварительного API (preview): java.security.PEMDecoder, JEP 470. В ходе проверки он декодировал открытый ключ только с --enable-preview, а в рабочей среде код по-прежнему сам убирает строки BEGIN и END и декодирует base64. Постквантовые алгоритмы действительно поддерживаются: инкапсуляция ML-KEM-512/768/1024, а также подпись и проверка ML-DSA-44/65/87 работали; SLH-DSA в этом JDK нет.
Сравнивайте кодировки подписей в конвертере DER ⇄ raw, а подписанные JAR-файлы разбирайте в инспекторе подписей JAR.