Я генерирую цифровую подпись, используя следующие методы с полезной нагрузкой как "hello world"
public String generateSignature(String payload) throws Exception{
Signature rsa = null;
rsa = Signature.getInstance("SHA256WithRSA/PSS", new BouncyCastleProvider());
rsa.initSign(getPrivateKey("Keys/private_key"));
rsa.update(payload.getBytes(StandardCharsets.UTF_8));
byte[] signatureBytes = Base64.encodeBase64(rsa.sign());
String signature = DatatypeConverter.printHexBinary(signatureBytes);
return signature;
}
Я проверяю подпись с полезной нагрузкой "hello world" и подписью, которую я получил с помощью метода generateSignatue.
public boolean validateSignature(String payload, String signature) throws Exception {
Signature sig = Signature.getInstance("SHA256WithRSA/PSS", new BouncyCastleProvider());
boolean isValid = false;
sig.initVerify(getPublicKey("Keys/public_key"));
sig.update(payload.getBytes(StandardCharsets.UTF_8));
isValid = sig.verify(Base64.decodeBase64(signature.getBytes("UTF-8")));
return isValid;
}
Это всегда возвращает isValid как false, в чем ошибка?
Получение открытого ключа и закрытого ключа с функциями ниже (для справки):
public static PublicKey getPublicKey(String filename) throws Exception {
byte[] keyBytes = Files.readAllBytes(Paths.get(filename));
X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
return kf.generatePublic(spec);
}
public static PrivateKey getPrivateKey(String filename) throws Exception {
byte[] keyBytes = Files.readAllBytes(Paths.get(filename));
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
return kf.generatePrivate(spec);
}