Search code examples
javacryptographydigital-signaturekeystorepublic-key-encryption

How to verify signatureBytes after signing it with SHA256withRSA?


I am Signing some text using "Windows-MY" KeyStore . I want to sign using my private key and verify using Public Key.

KeyStore keyStore = KeyStore.getInstance("Windows-MY");
                keyStore.load(null, null); 
Enumeration en = keyStore.aliases();
while (en.hasMoreElements()) {   
    KeyStore keyStore = KeyStore.getInstance("Windows-MY");
                keyStore.load(null, null);
    String alias = en.nextElement().toString();
    X509Certificate c = (X509Certificate) keyStore.getCertificate(alias);
    String serialNumber = c.getSerialNumber().toString();
    System.out.println("--" + aliasName);
                PrivateKey privateKey = (PrivateKey) keyStore.getKey(aliasName, null);
                PublicKey publicKey = (PublicKey) c.getPublicKey();
                Certificate[] chain = keyStore.getCertificateChain(aliasName);
    DataOutputStream fout = new DataOutputStream(outstream);
    // -------------------------------------------------------
    String data = "Monika";
    byte[] content = data.getBytes();
    Provider p = keyStore.getProvider();
    // ----------------------signature---start---------------------------

    Signature signature = Signature.getInstance("SHA256withRSA", p);
    System.out.println(" signature.getProvider():"+ signature.getProvider());
    signature.initSign(privateKey);
    signature.update(content);
    byte[] signatureBytes = signature.sign();
    System.out.println("signatureBytes-------------"+ signatureBytes.toString());
    // ----------------------signature----------end------------------

    // ------------------------verification---------------
    Signature signature1 = Signature.getInstance("SHA256withRSA", p);
    System.out.println(" signature1.getProvider():"+ signature1.getProvider());
    signature1.initVerify(publicKey);
    signature1.update(content);
    boolean verifies = signature1.verify(signatureBytes);
    System.out.println("signature verifies: " + verifies);
    // ------------------------------------------------
    fout.close();
} // while

Output:

privateKey:RSAPrivateKey [size=2048 bits, type=Exchange, container=AC0BEBA9-A361-4611-96D9-B365B671FBC3]
 signature.getProvider():SunMSCAPI version 1.6
signatureBytes-------------[B@1402d5a
 signature1.getProvider():SunRsaSign version 1.5
signature verifies: false

Notice that:

  1. My Private key is already RSAPrivateKey .
  2. Provider for Signing is SunMSCAPI.
  3. But I dont know about Provider for Verification with PrivateKey.

Solution

  • Signature signature = Signature.getInstance("SHA256withRSA",p);
                            System.out.println(" signature.getProvider():"+ signature.getProvider());
                            signature.initSign(privateKey, new SecureRandom());
                            signature.update(byteData);
                            byte[] signatureBytes = signature.sign();
    
    
    
    
    //                      X509Certificate cert1 =signatureBytes. 
                            System.out.println("signatureBytes-------------"+ signatureBytes.toString());
                            // ----------------------signature----------end------------------
    
                            // ------------------------verification---------------
                            Signature signature1 = Signature.getInstance("SHA256withRSA");
                            System.out.println(" signature1.getProvider():"+ signature1.getProvider());
                            signature1.initVerify(publicKey);
                            signature1.update(byteData);
    
                            boolean verifies = signature1.verify(signatureBytes);
                            System.out.println("signature verifies: " + verifies);