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
Post a Comment