Java Signature verify using PublicKey not working

85 views Asked by At

I have first signed a string message using private key then I'm verifying signed message using public key. verify returns false, it should verify true. I have attached code used below. I'm new to cryptography not sure if I'm following the logic here. Thanks for your time and help.

import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.RSAPrivateKeySpec;
import java.security.spec.RSAPublicKeySpec;
import java.util.Base64;

public class JWT2 {

    public static void main(String[] args) throws Exception {
        String plainTextMessage = "A Secret!";
        String n = "nsvTaplDkhFc-M1T-9EUtPPmzHsEvxFtiyZO9XXpx6HbU3NSIquvKAetH6LFteKGGqnF_XV2Qs9lQ2ZSI57YUyvFSWAiNoxT9a36smm71lxm8slvu6K6WGnQlKzCWZ0AxWqAB2lHUsff_OgXCOam9rGMizCQAuTyowvY6XtMswLB-FoVyRaM2zoRPo9_dEeu1y1Cyn8Bu2Ff02mGX_rP0J_UZM1OH1GpjfP4IU51ToqxZx-ZeTZsIoSgd7xfSt5vMS-Q-kvVWXcljoPyNEZ3vegwPHwXUMI4xKPpaXqZzuChfDFHIHwsSafwbCfcx0CHBURuYbjNYjeCBgtbPtaLCw";
        e = "AQAB";

        byte[] signedMessageBytes = signMessage(plainTextMessage, generatePrivateKey(n, e));

        boolean isMsgValid = verifySignedMessage(plainTextMessage.getBytes(StandardCharsets.UTF_8), signedMessageBytes, generatePublicKey(n, e));
        System.out.println("isMsgValid = " + isMsgValid);
    }

    static boolean verifySignedMessage(byte[] plainTextMessagebytes, byte[] signedMessageBytes, PublicKey publicKey) throws Exception {
        Signature signature = Signature.getInstance("SHA256withRSA");
        signature.initVerify(publicKey);
        signature.update(plainTextMessagebytes);
        return signature.verify(signedMessageBytes);
    }

    static byte[] signMessage(String plainTextMessage, PrivateKey privateKey) throws Exception {
        Signature signature = Signature.getInstance("SHA256withRSA");
        signature.initSign(privateKey);
        signature.update(plainTextMessage.getBytes(StandardCharsets.UTF_8));
        return signature.sign();
    }

    static PublicKey generatePublicKey(String modulus, String publicExponent) throws NoSuchAlgorithmException, InvalidKeySpecException {
        BigInteger n = new BigInteger(1, Base64.getUrlDecoder().decode(modulus));
        BigInteger e = new BigInteger(1, Base64.getUrlDecoder().decode(publicExponent));

        PublicKey pk = KeyFactory.getInstance("RSA").generatePublic(new RSAPublicKeySpec(n, e));
        return pk;
    }

    static PrivateKey generatePrivateKey(String modulus, String publicExponent) throws NoSuchAlgorithmException, InvalidKeySpecException {
        BigInteger n = new BigInteger(1, Base64.getUrlDecoder().decode(modulus));
        BigInteger e = new BigInteger(1, Base64.getUrlDecoder().decode(publicExponent));

        PrivateKey pk = KeyFactory.getInstance("RSA").generatePrivate(new RSAPrivateKeySpec(n, e));
        return pk;
    }
}

0

There are 0 answers