bouncycsatle ecdsa проверить подпись не удалось, хотя передача на openssl - PullRequest
1 голос
/ 28 апреля 2019

Я сгенерировал ключи кривой EC с использованием openssl и сгенерировал подпись с использованием дайджеста sha256

Данные : 265a33bf7a514b6671e6e02aaee2383759348d9f

openssl dgst -sha256 -sign key1.pem data > sig1

Файл открытого ключа pubkey1.pem

   -----BEGIN PUBLIC KEY-----
    MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE/2CznS1gXRaO6z8UvF1SOs97Dwp5HUdo
    1Y9OW91lfLl1NA8uXUFY7wJYvTl2dbnuZ1muh7htsxMVgEEbn+XCdQ==
    -----END PUBLIC KEY-----

Файл сигнатуры base64 в кодировке

MEUCIQDqUv33+c3svyYOXPVZCYx49TE2Vxq4uP5kSV2ZJ4o/JwIgEqWkxdSMNuQNuzL4KXTEeH/O
ZBFjyErxvHgdHTCjeh0=

Проверка подлинности пройдена

[bash]$ base64 -d sig1b64  > sig1d
[bash]$ openssl dgst -sha256 -verify pubkey1.pem -signature sig1d 
data
Verified OK

Когда я проверяю это с помощью JavaБиблиотека Bouncycastle не может проверить подпись, вот фрагмент кода,

    public boolean verifyMessage (final String param,final String message , final String signature , final String algo ) throws Exception
{

    byte[] content = param.getBytes();
    InputStream is = new ByteArrayInputStream(content);
    InputStreamReader isr = new InputStreamReader(is);

    Reader br = new BufferedReader(isr);
    PEMParser parser = new PEMParser(br);

    Object obj = parser.readObject();
    PublicKey thepubKeyofA = null;

    if (obj instanceof org.bouncycastle.asn1.x509.SubjectPublicKeyInfo) {
        SubjectPublicKeyInfo eckey = (SubjectPublicKeyInfo) obj;
        thepubKeyofA = new JcaPEMKeyConverter().setProvider("BC").getPublicKey(eckey);
        Signature ecdsaVerify = Signature.getInstance("SHA256withECDSA", "BC");
        ecdsaVerify.initVerify(thepubKeyofA);
        ecdsaVerify.update(message.getBytes());
        boolean result = ecdsaVerify.verify(Utils.decodeBASE64(signature));
        return result;

    }
...