Solved

base64 decoding and verifying signature against a public key

Posted on 2011-03-19
1
1,914 Views
Last Modified: 2012-08-14
Hello,

I have a message that has a signatured generated for it and I need to validate them against the public key file (/temp/publickey.p7b).  The message and signature were both first url encoded and then the signature was also BASE64-encoded.  I'm using the below to url decode first, then base64 decode the signature and then verify the signature against the public key.  I get an exception on  PublicKey pubKey = keyFactory.generatePublic(pubKeySpec);
The signature algorithm used will be SHA-1 with RSA. SHA-1 is the message digest algorithm and RSA is the encryption algorithm.

Exception:
java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException: algid parse error, not a sequence
      at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:188)
      at java.security.KeyFactory.generatePublic(KeyFactory.java:304)

Caused by: java.security.InvalidKeyException: IOException: algid parse error, not a sequence
      at sun.security.x509.X509Key.decode(X509Key.java:380)
      at sun.security.x509.X509Key.decode(X509Key.java:386)
      at sun.security.rsa.RSAPublicKeyImpl.<init>(RSAPublicKeyImpl.java:66)
      at sun.security.rsa.RSAKeyFactory.generatePublic(RSAKeyFactory.java:281)
      at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:184)



public void decode(){
        String message="message string";
        String signature="signtaure encoded string";


        try{
            String messageDecoded=URLDecoder.decode(message, "UTF-8");
            String signatureUrlDecoded=URLDecoder.decode(signature, "UTF-8");
             
            byte[] decodedSignature = Base64.decodeBase64(signatureUrlDecoded.getBytes());
            String decodedSignatureString = new String(decodedSignature);
            
            FileInputStream publicKeyFile = new FileInputStream("/temp/publickey.p7b");
             
			byte[] encKey = new byte[publicKeyFile.available()];
			publicKeyFile.read(encKey);
			publicKeyFile.close();
			
			X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encKey);
			KeyFactory keyFactory = KeyFactory.getInstance("RSA");
			PublicKey pubKey = keyFactory.generatePublic(pubKeySpec);
			
			Signature sig = Signature.getInstance("SHA1withRSA");
			sig.initVerify(pubKey);
			sig.update(messageDecoded.getBytes());
			boolean verifies = sig.verify(decodedSignature);
         }
         catch(Exception e){
             e.printStackTrace();
         }

	}

Open in new window

0
Comment
Question by:cgray1223
1 Comment
 
LVL 63

Accepted Solution

by:
btan earned 500 total points
ID: 35174720
you may want to check out this API that parses a PKCS#7-formatted (or p7b) certificate reply stored in a file. From the generateCertificates, you will get Certificate instance which is DER-encoded instances of X.509 certificate. you will probably have to enumerate each cert in p7b (as typically it may have a collection) and populate into "encKey" instead

See more in
http://download.oracle.com/javase/1.5.0/docs/guide/security/CryptoSpec.html#ParseCert
http://download.oracle.com/javase/1.5.0/docs/guide/security/CryptoSpec.html#KeyFactoryEx
0

Featured Post

Secure Your Active Directory - April 20, 2017

Active Directory plays a critical role in your company’s IT infrastructure and keeping it secure in today’s hacker-infested world is a must.
Microsoft published 300+ pages of guidance, but who has the time, money, and resources to implement? Register now to find an easier way.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Html Table Looping (part 2) 5 35
wild fly 8 startup error 2 43
Bitlocker request key after every windows update 11 36
PGP software 3 45
In this post we will learn different types of Android Layout and some basics of an Android App.
In this post we will learn how to connect and configure Android Device (Smartphone etc.) with Android Studio. After that we will run a simple Hello World Program.
Viewers will learn about basic arrays, how to declare them, and how to use them. Introduction and definition: Declare an array and cover the syntax of declaring them: Initialize every index in the created array: Example/Features of a basic arr…
Viewers will learn how to properly install Eclipse with the necessary JDK, and will take a look at an introductory Java program. Download Eclipse installation zip file: Extract files from zip file: Download and install JDK 8: Open Eclipse and …

726 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question