Java: Public key different after sent over socket -


i'm trying send public key on socket connection in java. while i'm conscious java provides ssl functionality sort of activity, uni assignment; cannot use java implementation.

the server encodes public key , transmits client via socket connection. when client receives key , decodes it, appears different. not this, data received client appears different transmitted server. believe giving me problems when attempt encrypt user name , password using key.

the problem can reproduced following code:

client:

public class testclient {      /**      * @param args      */     public static void main(string[] args) {          final int sport = 4321;          socket sock = null;         key serverpubkey = null;         bufferedreader clientin = null;          // initialise server connection         try{             sock = new socket(inetaddress.getlocalhost(), sport);             clientin = new bufferedreader(new inputstreamreader(sock.getinputstream()));         } catch (unknownhostexception e) {             system.out.println("unknown host.");             system.exit(1);         } catch  (ioexception e) {             system.out.println("no i/o");             system.exit(1);         }          // server pub key         try{             int len = integer.parseint(clientin.readline());             byte[] servpubkeybytes = new byte[len];             sock.getinputstream().read(servpubkeybytes,0,len);             system.out.println(servpubkeybytes);             x509encodedkeyspec ks = new x509encodedkeyspec(servpubkeybytes);             keyfactory kf = keyfactory.getinstance("rsa");             serverpubkey = kf.generatepublic(ks);             system.out.println(serverpubkey.getencoded());         } catch (ioexception e) {             system.out.println("error obtaining server public key 1.");             system.exit(0);         } catch (nosuchalgorithmexception e) {             system.out.println("error obtaining server public key 2.");             system.exit(0);         } catch (invalidkeyspecexception e) {             system.out.println("error obtaining server public key 3.");             system.exit(0);         }      }  } 

server:

public class testserver {      public static void main(string[] args) {         final int servport = 4321;         final int rsakeysize = 1024;         final string newline = "\n";          key pubkey = null;         serversocket cserver = null;         socket cclient = null;         printwriter cout = null;          // initialise rsa         try{             keypairgenerator rsakeygen = keypairgenerator.getinstance("rsa");             rsakeygen.initialize(rsakeysize);             keypair pair = rsakeygen.generatekeypair();             pubkey = pair.getpublic();         } catch (generalsecurityexception e) {             system.out.println(e.getlocalizedmessage() + newline);             system.out.println("error initialising encryption. exiting.\n");             system.exit(0);         }          // initialise socket connection         try{             cserver = new serversocket(servport);              cclient = cserver.accept();             cout = new printwriter(cclient.getoutputstream(), true);         } catch (ioexception e) {             system.out.println("error initialising i/o.\n");             system.exit(0);         }          // send public key         try {             cout.println(pubkey.getencoded().length);             system.out.println(pubkey.getencoded());             cclient.getoutputstream().write(pubkey.getencoded());             cclient.getoutputstream().flush();         } catch (ioexception e) {             system.out.println("i/o error");             system.exit(0);         }      }  } 

this may simple informing me key not x509 encoded, appears way key recovered file (also read bytes) can't understand why won't work?

thanks in advance help/suggestions.

edit: problem solved, see jeffrey's response. modified (working) code posted response.

in real-world code, advise against making direct use of cryptography classes in way. if @ possible, use java secure socket extension.

that said, bug see you're mixing inputstreamreader access raw inputstream underneath. inputstreamreader may read more bytes ask in readline — it's written pretty assume owns underlying inputstream , can read ahead in buffered blocks.

to quote javadoc:

each invocation of 1 of inputstreamreader's read() methods may cause 1 or more bytes read underlying byte-input stream. enable efficient conversion of bytes characters, more bytes may read ahead underlying stream necessary satisfy current read operation.


Comments

Popular posts from this blog

objective c - Change font of selected text in UITextView -

php - Accessing POST data in Facebook cavas app -

c# - Getting control value when switching a view as part of a multiview -