2012-06-01 4 views
1

Я хочу подписать сообщение, а затем я получаю исходное сообщение от подписи. Я нахожу RSA & Подпись DSA в java: , но их метод проверки использует исходные данные для проверки и не может восстановить сообщение из подписи.
Есть ли способ сделать это в Java или любой свободной библиотеке для Java?
спасибо всем.проверить подпись без необходимости оригинального сообщения (в java)

+0

Невозможно восстановить сообщение из подписи. Подпись почти всегда намного короче, поэтому она не может содержать достаточно данных. Подпись будет проверять только сообщение, а не воспроизводить его. –

+0

Но для некоторых методов подписи можно восстановить сообщение. например, RSA. см. эту страницу: (http://javadoc.iaik.tugraz.at/iaik_jce/current/iaik/iso/iso9796/RecoveredMessage.html), но библиотека iaik не является бесплатной. –

+0

Слово RSA появляется в некоторых именах алгоритмов, указанных в ISO-9796, но это не RSA-подпись. Но вы правы, некоторые алгоритмы подписи поддерживают восстановление сообщений. См. Мой ответ ниже. –

ответ

0

Вы можете использовать BouncyCastle. Это supports 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); 
} 
+0

большое спасибо. это было очень полезно. –

+0

спасибо. У меня есть и другая проблема, когда длина входного текста для знака становится большой, проверка не может быть выполнена. Как решить эту проблему? –

+0

Задайте новый вопрос. Не стесняйтесь обращаться к этому. Вам нужно будет предоставить более подробную информацию, такую ​​как алгоритм, длина сообщения, ожидаемое поведение, фактическое поведение (любое исключение?), Известные различия между успешными и неудачными случаями. –

0

Я полагаю, вы имеете в виде 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