Подпись Java ECDSAwithSHA256 с непоследовательной длиной - PullRequest
0 голосов
/ 01 сентября 2018

Итак, я пытаюсь сгенерировать подпись ECDSAwithHA256 в Java, и для этого я использую провайдера BouncyCastle. Кривая является secp521r1.

Для инициализации подписывающего лица, которым я пользуюсь:

public static final String SIGNATURE_ALGORITHEM = "SHA256withECDSA";

public void init() {
    signer = Signature.getInstance(SIGNATURE_ALGORITHEM, BouncyCastleProvider.PROVIDER_NAME);
    signer.initSign(privKey);
}

И для подписи я использую

public byte[] sign(byte[] bytes) throws SignatureException {
        signer.update(bytes);
        byte[] signature = signer.sign();
        System.out.println("Signature lenght is " + signature.length);
        return signature;
}

Единственная проблема сейчас заключается в том, что когда я запускаю код, я получаю подписи длиной от 137 до 139 байт. Но я ожидал получить всегда одинаковое количество байтов. Кто-нибудь знает, что я должен изменить, что у меня всегда одинаковая длина подписи, но все еще стандартизированный формат подписи?

1 Ответ

0 голосов
/ 01 сентября 2018

Java шифруется нормально, и Bouncy по умолчанию кодирует сигнатуры ECDSA (также DSA), используя ASN.1 DER, который имеет переменную длину. См. Длина подписи ECDSA и крест https://crypto.stackexchange.com/questions/33095/shouldnt-a-signature-using-ecdsa-be-exactly-96-bytes-not-102-or-103.

Однако, к счастью для вас, Bouncy (до версии 1.51) также реализует кодирование фиксированной длины в стиле P1363 под именами {hash}withPLAIN-ECDSA или {hash}withCVC-ECDSA (а также заменяет слеш на with). CVC в этом контексте, очевидно, означает сертификат верификации карты, хотя я бы не подумал, что кодировка подписи находится где-то рядом с самой сложной частью проверки сертификата для ограниченного устройства.

...