Имеем такой код:
Signature signer = Signature.getInstance(algoName, JCP.PROVIDER_NAME);
signer.initSign(privateKey);
signer.update(msg.getBytes());
byte[] signature = signer.sign();
Signature validator = Signature.getInstance(algoName, JCP.PROVIDER_NAME);
validator.initVerify(publicKey);
validator.update(msg.getBytes());
boolean result = validator.verify(signature);
System.out.println("Signature verified: " + result);
Вопросы:
1. Что значит, если в result получили true?
2. Что значит, если в result получили false?
Поясню смысл вопроса. Если получили true, значит в соответствии с ключом и алгоритмом подпись была получена правильно? Можно ли быть в этом уверенным?
Если получили false, где может быть ошибка? Предполагается, что ключ и алгоритм указаны верно. Где ещё может быть ошибка
UPD. Было проведен следующий эксперимент
1. Определённую строку подписал на сайте КриптоПро(https://www.cryptopro.ru/sites/default/files/products/cades/demopage/cades_bes_sample.html) некоторым сертификатом. Скопировал подпись в java код(перменная MSG1)
2. Далее был выполнен следующий код:
private byte[] signMessage(String algoName, PrivateKey privateKey, String msg) throws NoSuchProviderException, NoSuchAlgorithmException, InvalidKeyException, SignatureException, InvalidAlgorithmParameterException, UnsupportedEncodingException {
Signature signer = Signature.getInstance(algoName, JCP.PROVIDER_NAME);
signer.initSign(privateKey);
updateMsg(signer,getBytes(msg));
return signer.sign();
}
private boolean checkSigned(String algoName, PublicKey publicKey, String msg, byte[] signature) throws NoSuchProviderException, NoSuchAlgorithmException, InvalidKeyException, SignatureException {
boolean result;
Signature validator = Signature.getInstance(algoName, JCP.PROVIDER_NAME);
validator.initVerify(publicKey);
validator.update(getBytes(msg));
result = validator.verify(signature);
System.out.println("Signature verified: " + result);
return result;
}
....
byte[] signature = signMessage(algoName,pKey,uuidSt2);// ту же самую строку uuidSt2 подписал на сайте
checked = checkSigned(algoName,publicKey,uuidSt2,signature);
byte[] buf3 = Base64.getDecoder().decode(MSG1);
byte[] buf4 = new Decoder().decodeBuffer(new String(buf3));
byte[] buf5 = getBytes(MSG1);
checked3 = checkSigned(algoName,publicKey,uuidSt2,buf3);
checked4 = checkSigned(algoName,publicKey,uuidSt2,buf4);
checked5 = checkSigned(algoName,publicKey,uuidSt2,buf5);
В переменных checked3,checkedr4,checked5 cодержится false. В checked - true.
С надеждой на ответ,
Михаил
Отредактировано пользователем 17 октября 2023 г. 17:05:56(UTC)
| Причина: Не указана