// SalaOlioAsiakasEsimerkki.java SJ // SealedObject välitystä ObjectIn/OutputStream:llä // Ottaa yhteyden SalaPalvelinEsimerkki:in. import java.net.*; import java.io.*; import java.security.*; import javax.crypto.*; import javax.crypto.spec.*; public class SalaOlioAsiakasEsimerkki { static String avainTiedosto = "avain"; static SecretKeySpec avain = null; public static void main(String[] args) { if (args.length < 1) { System.err.println("Käyttö: java SalaOlioAsiakasEsimerkki " + "palvelinosoite [portti]"); return; } avain = SalausApu.lueAvain(avainTiedosto); System.out.println("Avain = |" + SalausApu.bintohex(avain.getEncoded()) + "|"); int portti = 1234; if (args.length > 1) { portti = Integer.valueOf(args[1]); } SalaOlioAsiakasEsimerkki a = new SalaOlioAsiakasEsimerkki(); SalattavaOlio olio = new SalattavaOlio("hello"); // yksi viesti suuntaansa SalattavaOlio vastaus = (SalattavaOlio) a.keskustele(olio, args[0], portti); System.out.println("Sain: " + vastaus); } // main() // Lähettää public Object keskustele(Serializable olio, String osoite, int portti) { Socket s = null; // yhteydenotto try { s = new Socket(osoite, portti); // yhteydenotto System.out.println("Yhteys onnistui"); } catch (Exception e) { // yhteys ei varmaankaan onnistunut System.err.println(e); return false; } try { // tehdään ja salataan olio SealedObject so = SalausApu.salaaOlio(olio, avain); // lähettetään pyyntö ObjectOutputStream oOut = new ObjectOutputStream(s.getOutputStream()); oOut.writeObject(so); // vastaanotettaan ObjectInputStream oIn = new ObjectInputStream(s.getInputStream()); SealedObject soV = (SealedObject) oIn.readObject(); // puretaan SalattavaOlio vastaus = (SalattavaOlio) SalausApu.puraOlio(soV, avain); s.close(); return vastaus; // poikkeusten käsittely } catch (Exception e) { System.err.println(e); if (s != null) try { s.close(); // suljetaan varuilta vielä täälläkin } catch (Exception e2) {} return null; } // catch } // keskustele() }