Я хочу подписать сообщение, а затем я получаю исходное сообщение от подписи. Я нахожу RSA & Подпись DSA в java: , но их метод проверки использует исходные данные для проверки и не может восстановить сообщение из подписи.
Есть ли способ сделать это в Java или любой свободной библиотеке для Java?
спасибо всем.проверить подпись без необходимости оригинального сообщения (в java)
ответ
Вы можете использовать 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);
}
большое спасибо. это было очень полезно. –
спасибо. У меня есть и другая проблема, когда длина входного текста для знака становится большой, проверка не может быть выполнена. Как решить эту проблему? –
Задайте новый вопрос. Не стесняйтесь обращаться к этому. Вам нужно будет предоставить более подробную информацию, такую как алгоритм, длина сообщения, ожидаемое поведение, фактическое поведение (любое исключение?), Известные различия между успешными и неудачными случаями. –
Я полагаю, вы имеете в виде 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
Невозможно восстановить сообщение из подписи. Подпись почти всегда намного короче, поэтому она не может содержать достаточно данных. Подпись будет проверять только сообщение, а не воспроизводить его. –
Но для некоторых методов подписи можно восстановить сообщение. например, RSA. см. эту страницу: (http://javadoc.iaik.tugraz.at/iaik_jce/current/iaik/iso/iso9796/RecoveredMessage.html), но библиотека iaik не является бесплатной. –
Слово RSA появляется в некоторых именах алгоритмов, указанных в ISO-9796, но это не RSA-подпись. Но вы правы, некоторые алгоритмы подписи поддерживают восстановление сообщений. См. Мой ответ ниже. –