проверить подпись без необходимости исходного сообщения (в java)

Я хочу подписать сообщение, а затем получаю исходное сообщение из подписи. Я нашел подпись RSA и DSA в java: http://docs.oracle.com/javase/tutorial/security/apisign/vstep4.html
но их метод проверки использует исходные данные для проверки и не может восстановить сообщение из подписи.
Есть ли способ сделать это в Java или любая бесплатная библиотека для Java?
всем спасибо.


person leyla moazami    schedule 01.06.2012    source источник
comment
Невозможно восстановить сообщение по подписи. Подпись почти всегда намного короче, поэтому она не может содержать достаточно данных. Подпись будет только подтверждать сообщение, а не воспроизводить его.   -  person John Watts    schedule 02.06.2012
comment
Но для некоторых методов подписи можно восстановить сообщение. например РСА. см. эту страницу:(javadoc.iaik.tugraz.at /iaik_jce/current/iaik/iso/iso9796/), но библиотека iaik не является бесплатной.   -  person leyla moazami    schedule 03.06.2012
comment
Слово RSA появляется в некоторых именах алгоритмов, указанных в ISO-9796, но это не подпись RSA. Но вы правы, некоторые алгоритмы подписи поддерживают восстановление сообщений. Пожалуйста, смотрите мой ответ ниже.   -  person John Watts    schedule 03.06.2012


Ответы (2)


Вы можете использовать BouncyCastle. Он поддерживает ISO-9796-2. И ISO9796Test.java предоставляет пример. Вот отрывок, который может помочь:

RSAKeyParameters pubParameters = new RSAKeyParameters(false, mod3, pub3);
RSAKeyParameters privParameters = new RSAKeyParameters(true, mod3, pri3);
RSAEngine rsa = new RSAEngine();
byte[] data;
ISO9796d2Signer eng = new ISO9796d2Signer(rsa, new RIPEMD128Digest());
eng.init(true, privParameters);
eng.update(msg4[0]);
eng.update(msg4, 1, msg4.length - 1);
data = eng.generateSignature();
eng.init(false, pubParameters);
eng.update(msg4[0]);
eng.update(msg4, 1, msg4.length - 1);
if (eng.hasFullMessage()) {
    eng = new ISO9796d2Signer(rsa, new RIPEMD128Digest());
    eng.init(false, pubParameters);
    if (!eng.verifySignature(sig4)) {
        // signature tampered with
    }
    byte[] message = eng.getRecoveredMessage(), 0, msg4);
}
person John Watts    schedule 03.06.2012
comment
Спасибо. У меня есть и другая проблема: когда длина вводимого текста для знака становится большой, проверка не может быть завершена. Как следует решить эту проблему? - person leyla moazami; 13.07.2012
comment
Пожалуйста, задайте новый вопрос. Смело обращайтесь к этому. Вам нужно будет предоставить более подробную информацию, такую ​​как алгоритм, длина сообщения, ожидаемое поведение, фактическое поведение (какие-либо исключения?), известные различия между успешными и неудачными случаями. - person John Watts; 13.07.2012
comment
stackoverflow .com/questions/11482155/ - person leyla moazami; 14.07.2012

Я полагаю, вы имеете в виду схему цифровой подписи ISO9796-2 1, поле трейлера 1, октет «BC», который не требует исходного сообщения.

    RSAEngine rsa = new RSAEngine();
    //DS as SHA1
    Digest dig = new SHA1Digest();
    //3rd parameter "true" indicates implicit which means TF1(octet BC)
    ISO9796d2Signer eng = new ISO9796d2Signer(rsa, dig, true);
    eng.init(false, pubKeyParameter);

    eng.verifySignature(sig);  // if the signature is valid
    eng.getRecoveredMessage(); // get the recovered message, only after successful signature verification
person HooYao    schedule 13.06.2012