/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cryptolearning;

import com.sun.rave.web.ui.appbase.AbstractPageBean;
import com.sun.webui.jsf.component.Button;
import com.sun.webui.jsf.component.ImageComponent;
import com.sun.webui.jsf.component.StaticText;
import javax.faces.FacesException;

import core.*;
import javax.faces.component.html.HtmlCommandButton;
import javax.faces.component.html.HtmlInputText;
import javax.faces.event.ValueChangeEvent;
import javax.swing.JOptionPane;
import logarithm.PrimeGen;

/**
 * <p>Page bean that corresponds to a similarly named JSP page.  This
 * class contains component definitions (and initialization code) for
 * all components that you have defined on this page, as well as
 * lifecycle methods and event handlers where you may add behavior
 * to respond to incoming events.</p>
 *
 * @version template.java
 * @version Created on 16.2.2009, 10:32:31
 * @author jirka
 */
public class ElGalman_Sifrovani extends AbstractPageBean {
    // <editor-fold defaultstate="collapsed" desc="Managed Component Definition">

    /**
     * <p>Automatically managed component initialization.  <strong>WARNING:</strong>
     * This method is automatically generated, so any user-specified code inserted
     * here is subject to being replaced.</p>
     */
    private void _init() throws Exception {
    }
    private HtmlInputText txtN1 = new HtmlInputText();

    public HtmlInputText getTxtN1() {
        return txtN1;
    }

    public void setTxtN1(HtmlInputText hit) {
        this.txtN1 = hit;
    }
    private HtmlInputText txtB1 = new HtmlInputText();

    public HtmlInputText getTxtB1() {
        return txtB1;
    }

    public void setTxtB1(HtmlInputText hit) {
        this.txtB1 = hit;
    }
    private HtmlInputText txtK1 = new HtmlInputText();

    public HtmlInputText getTxtK1() {
        return txtK1;
    }

    public void setTxtK1(HtmlInputText hit) {
        this.txtK1 = hit;
    }
    private StaticText labY1 = new StaticText();

    public StaticText getLabY1() {
        return labY1;
    }

    public void setLabY1(StaticText st) {
        this.labY1 = st;
    }
    private StaticText labPublicKey1 = new StaticText();

    public StaticText getLabPublicKey1() {
        return labPublicKey1;
    }

    public void setLabPublicKey1(StaticText st) {
        this.labPublicKey1 = st;
    }
    private StaticText labPrivateKey1 = new StaticText();

    public StaticText getLabPrivateKey1() {
        return labPrivateKey1;
    }

    public void setLabPrivateKey1(StaticText st) {
        this.labPrivateKey1 = st;
    }
    private HtmlInputText txtKlic1 = new HtmlInputText();

    public HtmlInputText getTxtKlic1() {
        return txtKlic1;
    }

    public void setTxtKlic1(HtmlInputText hit) {
        this.txtKlic1 = hit;
    }
    private HtmlInputText txtMessage1 = new HtmlInputText();

    public HtmlInputText getTxtMessage1() {
        return txtMessage1;
    }

    public void setTxtMessage1(HtmlInputText hit) {
        this.txtMessage1 = hit;
    }
    private StaticText labASCII1 = new StaticText();

    public StaticText getLabASCII1() {
        return labASCII1;
    }

    public void setLabASCII1(StaticText st) {
        this.labASCII1 = st;
    }
    private StaticText labCharNo1 = new StaticText();

    public StaticText getLabCharNo1() {
        return labCharNo1;
    }

    public void setLabCharNo1(StaticText st) {
        this.labCharNo1 = st;
    }
    private HtmlInputText txtX1 = new HtmlInputText();

    public HtmlInputText getTxtX1() {
        return txtX1;
    }

    public void setTxtX1(HtmlInputText hit) {
        this.txtX1 = hit;
    }
    private StaticText labGama1 = new StaticText();

    public StaticText getLabGama1() {
        return labGama1;
    }

    public void setLabGama1(StaticText st) {
        this.labGama1 = st;
    }
    private StaticText labDelta1 = new StaticText();

    public StaticText getLabDelta1() {
        return labDelta1;
    }

    public void setLabDelta1(StaticText st) {
        this.labDelta1 = st;
    }
    private HtmlCommandButton btnNext1 = new HtmlCommandButton();

    public HtmlCommandButton getBtnNext1() {
        return btnNext1;
    }

    public void setBtnNext1(HtmlCommandButton hcb) {
        this.btnNext1 = hcb;
    }
    private HtmlCommandButton button3 = new HtmlCommandButton();

    public HtmlCommandButton getButton3() {
        return button3;
    }

    public void setButton3(HtmlCommandButton hcb) {
        this.button3 = hcb;
    }
    private HtmlInputText txtGama1 = new HtmlInputText();

    public HtmlInputText getTxtGama1() {
        return txtGama1;
    }

    public void setTxtGama1(HtmlInputText hit) {
        this.txtGama1 = hit;
    }
    private HtmlInputText txtDelta1 = new HtmlInputText();

    public HtmlInputText getTxtDelta1() {
        return txtDelta1;
    }

    public void setTxtDelta1(HtmlInputText hit) {
        this.txtDelta1 = hit;
    }
    private StaticText labA1 = new StaticText();

    public StaticText getLabA1() {
        return labA1;
    }

    public void setLabA1(StaticText st) {
        this.labA1 = st;
    }
    private StaticText labCurrChar1 = new StaticText();

    public StaticText getLabCurrChar1() {
        return labCurrChar1;
    }

    public void setLabCurrChar1(StaticText st) {
        this.labCurrChar1 = st;
    }
    private StaticText labMessage1 = new StaticText();

    public StaticText getLabMessage1() {
        return labMessage1;
    }

    public void setLabMessage1(StaticText st) {
        this.labMessage1 = st;
    }
    private HtmlCommandButton btnNext2 = new HtmlCommandButton();

    public HtmlCommandButton getBtnNext2() {
        return btnNext2;
    }

    public void setBtnNext2(HtmlCommandButton hcb) {
        this.btnNext2 = hcb;
    }
    private ImageComponent imgArrowBigRight1 = new ImageComponent();

    public ImageComponent getImgArrowBigRight1() {
        return imgArrowBigRight1;
    }

    public void setImgArrowBigRight1(ImageComponent ic) {
        this.imgArrowBigRight1 = ic;
    }
    private StaticText labPrenos1 = new StaticText();

    public StaticText getLabPrenos1() {
        return labPrenos1;
    }

    public void setLabPrenos1(StaticText st) {
        this.labPrenos1 = st;
    }
    private Button btnFwd1 = new Button();

    public Button getBtnFwd1() {
        return btnFwd1;
    }

    public void setBtnFwd1(Button b) {
        this.btnFwd1 = b;
    }
    private HtmlCommandButton btnVypY = new HtmlCommandButton();

    public HtmlCommandButton getBtnVypY() {
        return btnVypY;
    }

    public void setBtnVypY(HtmlCommandButton hcb) {
        this.btnVypY = hcb;
    }
    private Button btnBack1 = new Button();

    public Button getBtnBack1() {
        return btnBack1;
    }

    public void setBtnBack1(Button b) {
        this.btnBack1 = b;
    }
    private Button button1 = new Button();

    public Button getButton1() {
        return button1;
    }

    public void setButton1(Button b) {
        this.button1 = b;
    }
    private Button btnSkip1 = new Button();

    public Button getBtnSkip1() {
        return btnSkip1;
    }

    public void setBtnSkip1(Button b) {
        this.btnSkip1 = b;
    }
    private StaticText labPopis1 = new StaticText();

    public StaticText getLabPopis1() {
        return labPopis1;
    }

    public void setLabPopis1(StaticText st) {
        this.labPopis1 = st;
    }
    private StaticText labKrok1 = new StaticText();

    public StaticText getLabKrok1() {
        return labKrok1;
    }

    public void setLabKrok1(StaticText st) {
        this.labKrok1 = st;
    }
    private StaticText hiddenCislo1 = new StaticText();

    public StaticText getHiddenCislo1() {
        return hiddenCislo1;
    }

    public void setHiddenCislo1(StaticText st) {
        this.hiddenCislo1 = st;
    }
    private HtmlInputText txtPrivateKey = new HtmlInputText();

    public HtmlInputText getTxtPrivateKey() {
        return txtPrivateKey;
    }

    public void setTxtPrivateKey(HtmlInputText hit) {
        this.txtPrivateKey = hit;
    }
    private HtmlInputText txtOdp1 = new HtmlInputText();

    public HtmlInputText getTxtOdp1() {
        return txtOdp1;
    }

    public void setTxtOdp1(HtmlInputText hit) {
        this.txtOdp1 = hit;
    }
    private HtmlInputText txtOdp2 = new HtmlInputText();

    public HtmlInputText getTxtOdp2() {
        return txtOdp2;
    }

    public void setTxtOdp2(HtmlInputText hit) {
        this.txtOdp2 = hit;
    }
    private HtmlInputText txtOdp3 = new HtmlInputText();

    public HtmlInputText getTxtOdp3() {
        return txtOdp3;
    }

    public void setTxtOdp3(HtmlInputText hit) {
        this.txtOdp3 = hit;
    }
    private StaticText labO1 = new StaticText();

    public StaticText getLabO1() {
        return labO1;
    }

    public void setLabO1(StaticText st) {
        this.labO1 = st;
    }
    private StaticText labO2 = new StaticText();

    public StaticText getLabO2() {
        return labO2;
    }

    public void setLabO2(StaticText st) {
        this.labO2 = st;
    }
    private StaticText labO3 = new StaticText();

    public StaticText getLabO3() {
        return labO3;
    }

    public void setLabO3(StaticText st) {
        this.labO3 = st;
    }
    private HtmlInputText txtOdp4 = new HtmlInputText();

    public HtmlInputText getTxtOdp4() {
        return txtOdp4;
    }

    public void setTxtOdp4(HtmlInputText hit) {
        this.txtOdp4 = hit;
    }
    private HtmlInputText txtOdp5 = new HtmlInputText();

    public HtmlInputText getTxtOdp5() {
        return txtOdp5;
    }

    public void setTxtOdp5(HtmlInputText hit) {
        this.txtOdp5 = hit;
    }
    private StaticText labO4 = new StaticText();

    public StaticText getLabO4() {
        return labO4;
    }

    public void setLabO4(StaticText st) {
        this.labO4 = st;
    }
    private StaticText labO5 = new StaticText();

    public StaticText getLabO5() {
        return labO5;
    }

    public void setLabO5(StaticText st) {
        this.labO5 = st;
    }

    // </editor-fold>
    /**
     * <p>Construct a new Page bean instance.</p>
     */
    public ElGalman_Sifrovani() {
    }

    /**
     * <p>Callback method that is called whenever a page is navigated to,
     * either directly via a URL, or indirectly via page navigation.
     * Customize this method to acquire resources that will be needed
     * for event handlers and lifecycle methods, whether or not this
     * page is performing post back processing.</p>
     * 
     * <p>Note that, if the current request is a postback, the property
     * values of the components do <strong>not</strong> represent any
     * values submitted with this request.  Instead, they represent the
     * property values that were saved for this view when it was rendered.</p>
     */
    @Override
    public void init() {
        // Perform initializations inherited from our superclass
        super.init();
        // Perform application initialization that must complete
        // *before* managed components are initialized
        // TODO - add your own initialiation code here

        // <editor-fold defaultstate="collapsed" desc="Managed Component Initialization">
        // Initialize automatically managed components
        // *Note* - this logic should NOT be modified
        try {
            _init();
        } catch (Exception e) {
            log("template Initialization Failure", e);
            throw e instanceof FacesException ? (FacesException) e : new FacesException(e);
        }

    // </editor-fold>
    // Perform application initialization that must complete
    // *after* managed components are initialized
    // TODO - add your own initialization code here
    }

    /**
     * <p>Callback method that is called after the component tree has been
     * restored, but before any event processing takes place.  This method
     * will <strong>only</strong> be called on a postback request that
     * is processing a form submit.  Customize this method to allocate
     * resources that will be required in your event handlers.</p>
     */
    @Override
    public void preprocess() {
    }

    /**
     * <p>Callback method that is called just before rendering takes place.
     * This method will <strong>only</strong> be called for the page that
     * will actually be rendered (and not, for example, on a page that
     * handled a postback and then navigated to a different page).  Customize
     * this method to allocate resources that will be required for rendering
     * this page.</p>
     */
    @Override
    public void prerender() {
    }

    /**
     * <p>Callback method that is called after rendering is completed for
     * this request, if <code>init()</code> was called (regardless of whether
     * or not this was the page that was actually rendered).  Customize this
     * method to release resources acquired in the <code>init()</code>,
     * <code>preprocess()</code>, or <code>prerender()</code> methods (or
     * acquired during execution of an event handler).</p>
     */
    @Override
    public void destroy() {
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected SessionBean1 getSessionBean1() {
        return (SessionBean1) getBean("SessionBean1");
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected ApplicationBean1 getApplicationBean1() {
        return (ApplicationBean1) getBean("ApplicationBean1");
    }


    
    private StaticText labKrok = new StaticText();

    public StaticText getLabKrok() {
        return labKrok;
    }

    public void setLabKrok(StaticText st) {
        this.labKrok = st;
    }

    private StaticText hiddenCislo = new StaticText();

    public StaticText getHiddenCislo() {
        return hiddenCislo;
    }

    public void setHiddenCislo(StaticText st) {
        this.hiddenCislo = st;
    }

    public String btnBack_action() {
        PerformStep(false);
        return null;
    }

    public String btnSkip_action() {
        ClearFields();
        txtN1.setDisabled(false);
        txtB1.setDisabled(false);
        txtK1.setDisabled(false);
        txtKlic1.setDisabled(false);
        txtMessage1.setDisabled(false);
        txtX1.setDisabled(false);
        txtGama1.setDisabled(false);
        txtPrivateKey.setDisabled(false);
        txtDelta1.setDisabled(false);
        labKrok1.setVisible(false);

        btnBack1.setDisabled(true);
        btnFwd1.setDisabled(true);
        //btnSkip1.setDisabled(true);
        btnSkip1.setText("Restart okna");
        btnVypY.setDisabled(false);
        button3.setDisabled(false);
        btnNext1.setDisabled(true);
        imgArrowBigRight1.setVisible(false);
        labPrenos1.setVisible(false);

        return null;
        
    }
    private void ClearFields() {
        ///////////////////////////////////////////////
        // text prvni zpravy
        String zprava = "Jednou z variant ElGamalova kryptosystému je systém pro šifrování zpráv. Tento průvodce by měl vysvětlit průběh a některé vlastnosti tohoto protokolu.";
        labPopis1.setText(zprava);
        ///////////////////////////////////////////////

        txtN1.setValue("??");
        txtB1.setValue("??");
        txtK1.setValue("??");
        labY1.setText("??");
        labPublicKey1.setText("??");
        labPrivateKey1.setText("??");
        txtKlic1.setValue("??");
        txtMessage1.setValue("??");
        labASCII1.setText("??");

        labCharNo1.setText("??");
        txtX1.setValue("??");
        labGama1.setText("??");
        labDelta1.setText("??");
        txtGama1.setValue("??");
        txtDelta1.setValue("??");
        labA1.setText("??");
        labCurrChar1.setText("??");
        labMessage1.setText("??");

        hiddenCislo1.setText(0);

    }

    public String btnFwd_action() {
        PerformStep(true);
        return null;
    }

    public String button_action() {
        ClearFields();
        txtN1.setDisabled(true);
        txtB1.setDisabled(true);
        txtK1.setDisabled(true);
        txtKlic1.setDisabled(true);
        txtMessage1.setDisabled(true);
        txtX1.setDisabled(true);
        txtGama1.setDisabled(true);
        txtDelta1.setDisabled(true);
        txtPrivateKey.setDisabled(false);
        labKrok1.setVisible(false);
        btnFwd1.setDisabled(true);
        btnBack1.setDisabled(true);
        btnFwd1.setDisabled(false);
        btnSkip1.setDisabled(false);
        btnSkip1.setText("Přeskočit průvodce");
        btnVypY.setDisabled(true);
        button3.setDisabled(true);
        btnNext1.setDisabled(true);
        imgArrowBigRight1.setVisible(false);
        labPrenos1.setVisible(false);

        btnFwd1.setText("Další");
        return null;
    }

    public String btnVypY_Action() throws ExtraException {
        Integer n, b, k, Y;
        try {
            n = Integer.parseInt(txtN1.getValue().toString());
            b = Integer.parseInt(txtB1.getValue().toString());
            k = Integer.parseInt(txtK1.getValue().toString());

            if (!PrimeGen.isPrime(n)) {
                throw new ExtraException("Číslo n není prvočíslo.");
            }

            if (k < 1 || k > n - 2) {
                throw new ExtraException("Číslo k musí být: 0 < k < n-1");
            }

            // pocita Y = b^k mod n
            //Y = (int) (ExMath.myExp(b, k) % n);
            Y = SuperModulo.Modulo(b, k, n);
           // Double bNaK = ExMath.myExp(b, k);

            String PublicKey = n.toString() + ", " + b.toString() + ", " + Y.toString();

            labY1.setText(Y.toString());
            labPublicKey1.setText(PublicKey);
            labPrivateKey1.setText(k.toString());

        } catch (ExtraException e) {
            JOptionPane.showMessageDialog(null, e.toString());
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Chybná vstupní data.");
        }
        return null;
    }

    public String button3_action() {
        String Message = txtMessage1.getValue().toString();
        
        String ASCII = "";

        for (int i = 0; i < Message.length(); i++) {
            char c = Message.charAt(i);
            Integer charCode = (int) c;
            ASCII += " " + charCode.toString();
        }

        labCharNo1.setText("1");
        btnNext1.setDisabled(false);
        labASCII1.setText(ASCII);
       

        int[] arr = CheckPublicKey(txtKlic1.getValue().toString());

        if (arr == null || arr[0] < 255 || !ExMath.isPrime(arr[0])) {
            JOptionPane.showMessageDialog(null, "Chybný formát klíče, řád grupy mysí být větší než 255");
        } else {
            txtKlic1.setDisabled(true);
            btnNext1.setDisabled(false);
            txtMessage1.setDisabled(true);
        }
        return null;
    }

    private int[] CheckPublicKey(String klic)
    {
        // kontrola klice
        String cislo = "";
        int iCount = 0;
        int[] arr = new int[3];

        for (int i=0; i<klic.length(); i++)
        {
            char c = klic.charAt(i);

            if (c<'0' || c>'9') {
               if (cislo.length()>0)
                arr[iCount++] = Integer.parseInt(cislo) ;
               cislo = "";
            }
            else
            {
                cislo+=c;
                if ( i==klic.length()-1)
                {
                     if (cislo.length()>0)
                    arr[iCount++] = Integer.parseInt(cislo) ;
                }
            }
        }

        if (iCount!=3) return null;
        else return arr;
    }

    public String btnNext1_action() {
        try
       {
           String message = txtMessage1.getValue().toString();
            
            Integer charNo = Integer.parseInt(labCharNo1.getText().toString());
            Integer x = Integer.parseInt(txtX1.getValue().toString());
            int[] arr = CheckPublicKey(txtKlic1.getValue().toString());
            int n = arr[0];
            int b = arr[1];
            int Y = arr[2];
            char c = message.charAt(charNo-1);

          
            if ( x<1 || x>n-2)
            {
                JOptionPane.showMessageDialog(null, "Zadané x má chybný formát.");
                return null;
            }

            if ((n-1) % x == 0)
            {
                JOptionPane.showMessageDialog(null, "X musí být nesoudělné s n-1");
                return null;
            }

           //Integer gama = ExMath.Exp(b, x) % n;
            Integer gama = SuperModulo.Modulo(b, x, n);
           //Integer delta = (c*ExMath.Exp(Y, x))%n;
            Integer delta = SuperModulo.Modulo(Y, x, n);
            delta = delta*c % n;

           charNo++;

           labGama1.setText(gama.toString());
           labDelta1.setText(delta.toString());

           labCharNo1.setText(charNo.toString());
           imgArrowBigRight1.setVisible(true);
           labPrenos1.setVisible(true);
           txtGama1.setValue(gama);
           txtDelta1.setValue(delta);

           btnNext1.setDisabled(true);
           btnNext2.setDisabled(false);

       }
       catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Zadané x musí být číslo nebo byl dosažen konec zprávy.");
        }
        return null;
    }

    public String btnNext2_action() {
       //
        try
        {
            Integer gama = Integer.parseInt(txtGama1.getValue().toString());
            Integer delta = Integer.parseInt(txtDelta1.getValue().toString());
            Integer PrKey = Integer.parseInt(txtPrivateKey.getValue().toString());
            String msg ="";

            try {
               msg = labMessage1.getText().toString();
            }
            catch (Exception e)
            {
                msg = "";
            }


            int[] arr = CheckPublicKey(txtKlic1.getValue().toString());
            int n = arr[0];
            int b = arr[1];
            int Y = arr[2];

            //int A = ExMath.Exp(gama, n-1-Y) % n;
            int A = SuperModulo.Modulo(gama, n-1-PrKey, n);
            char c = (char) ((A*delta)%n);
            //char c = (char) SuperModulo.Modulo(A, A, A);

            labCurrChar1.setText(c);
            msg += c;
            labMessage1.setText(msg);
            labA1.setText((A*delta)%n);
            txtX1.setValue("??");
            btnNext1.setDisabled(false);
            btnNext2.setDisabled(true);

            imgArrowBigRight1.setVisible(false);
            labPrenos1.setVisible(false);
            
        }
        catch (Exception e)
        {
            JOptionPane.showMessageDialog(null, "Chybně zadané gama, delta nebo soukromý klíč.");
        }
        return null;
    }
    private void PerformStep(boolean forward) {
        int krok = Integer.parseInt(hiddenCislo1.getValue().toString());

        ////////////////////////////////////////////////
        // nastavit pocet kroku
        int pocetKroku = 12;
        ////////////////////////////////////////////////

        labKrok.setText("Krok -1:");

        if (forward) {
            krok = Math.min(pocetKroku, krok + 1);
        } else {
            krok = Math.max(0, krok - 1);
        }

        ////////////////////////////////////////////////
        // zprava se zobrazi uzivateli po provedeni kazdeho kroku
        String zprava = "";
        // hodnota slouzi pro predani zvolene hodnoty do prislusneho pole
        String hodnota;
        ////////////////////////////////////////////////

        switch (krok - 1) {
            case -1:
                if (!forward) {
                    btnBack1.setDisabled(true);
                    txtN1.setValue("??");
                    txtB1.setValue("??");
                    txtK1.setValue("??");
                    labKrok1.setVisible(false);
                    zprava ="Jednou z variant ElGamalova kryptosystému je systém pro šifrování zpráv. Tento průvodce by měl vysvětlit průběh a některé vlastnosti tohoto protokolu.";
                }
                break;
            case 0:
                btnBack1.setDisabled(false);
                zprava = "Proto, aby mohl uživatel zašifrovat zprávu, musí znát veřejný klíč příjemce. Příjemce zprávy tedy musí vygenerovat dvojici soukromého a veřejného klíče. K tomu musí zvolit řád cyklické grupy, ve které bude šifrování probíhat, generátor a soukromý klíč.";
                labKrok1.setVisible(true);
                txtN1.setValue("257");
                txtB1.setValue("31");
                txtK1.setValue("16");
                if (!forward) {
                    labY1.setText("??");
                }
                break;
            case 1:
                zprava = "Volba vhodných parametrů je velmi důležitá s odledem na bezpečnost systému. Řád grupy musí být velké prvočíslo, větší než je největší číselná hodnota přenášené zprávy. Generátor by měl být také prvočíslo, i když to není nutné. Klíč může být libovolný. Výpočtem získá poslední parametr veřejného klíče.";
                labY1.setText("64");

                if (!forward) {
                labPublicKey1.setText("??");
                labPrivateKey1.setText("??");
                }
                break;
            case 2:
                zprava = "Uživatel který chce využít k šifrování veřejný klíč uživatele, musí si jej obstarat z bezpečného zdroje, tedy buď přímo od tvůrce klíče a nebo musí být klíč podepsán certifikační autoritou. Více o podepisování v kapitole \"Komunikace v asymetrické kryptografii\"";
                labPublicKey1.setText("257, 31, 64");
                labPrivateKey1.setText("16");

                if (!forward) {
                    txtKlic1.setValue("??");
                    txtMessage1.setValue("??");
                    labASCII1.setText("??");
                    labCharNo1.setText("??");               }
                break;
            case 3:
                zprava = "Uživatel konečně má veřejný klíč a může si zvolit zprávu, kterou bude šifrovat. Pokud je zpráva dlouhá, musí se rozdělit do více částí tak, aby žádná část neměla vyšší číselnou hodnotu než je řád grupy ve které se šifruje.";
                txtKlic1.setValue("257, 31, 64");
                txtMessage1.setValue("ahoj");
                labASCII1.setText("97 104 111 106");
                labCharNo1.setText("1");

                if (!forward) {
                    txtX1.setValue("??");
                }
                break;
            case 4:
                zprava = "Pro potřeby šifrovacího výpočtu nyní musí uživatel zvolit náhodné číslo z grupy, ve které se výpočty provádí. Toto číslo je často označováno jako dočasný soukromý klíč, jeho hodnota musí být tajná, náhodná a měla by se lišit pro každý šifrovaný úsek zprávy.";
                txtX1.setValue("58");
                if (!forward) {
                labGama1.setText("??");
                labDelta1.setText("??");
                }
                break;
            case 5:
                zprava = "Nyní vypočte části kryptogramu Gama a Delta. Parametr Gama nezávisí na hodnotě šifrované zprávy, ale pouze na náhodně zvoleném čísle x. Pokud se x nebude měnit, nebude se měnit ani parametr Gama a při šifrování stejných hodnot zpráv by se neměnil ani parametr Delta. Systém by tak byl velmi snadno napadnutelný i pouhým statistickým útokem. ";
                labGama1.setText("169");
                labDelta1.setText("247");
                if (!forward) {
                    imgArrowBigRight1.setVisible(false);
                    labPrenos1.setVisible(false);
                    txtGama1.setValue("??");
                    txtDelta1.setValue("??");
                    txtPrivateKey.setValue("??");
                }
                break;
            case 6:
                zprava = "Šifrovaná zpráva se odešle příjemci buď celá a nebo po částech jak je naznačeno zde. Nevýhodou tohoto algoritmu je, že přenášená zpráva má dvojnásobnou délku proti zprávě původní (části Gama a Delta).";
                imgArrowBigRight1.setVisible(true);
                labPrenos1.setVisible(true);
                txtGama1.setValue("169");
                txtDelta1.setValue("247");
                txtPrivateKey.setValue("16");
                if (!forward) {
                    labA1.setText("??");
                    labCurrChar1.setText("??");
                    labMessage1.setText("??");
                }
                break;
            case 7:
                zprava = "Příjemce za použití svého soukromého klíče zprávu dešifruje a pokud zpráva není celá, čeká na její další části.";
                labA1.setText("97");

                labCurrChar1.setText("a");
                labMessage1.setText("a");
                if (!forward) {
                    labCharNo1.setText("1");
                    txtX1.setValue("58");
                    labGama1.setText("169");
                    labDelta1.setText("247");
                    txtGama1.setValue("169");
                    txtDelta1.setValue("247");
                    labA1.setText("96");
                    labCurrChar1.setText("a");
                    labMessage1.setText("a");
                }
                break;
           case 8:
                zprava = "Šifrování druhého znaku... ";
                labCharNo1.setText("2");
                txtX1.setValue("13");
                labGama1.setText("205");
                labDelta1.setText("26");
                txtGama1.setValue("205");
                txtDelta1.setValue("26");
                labA1.setText("104");
                labCurrChar1.setText("h");
                labMessage1.setText("ah");
                if (!forward) {
                    labCharNo1.setText("2");
                    txtX1.setValue("13");
                    labGama1.setText("205");
                    labDelta1.setText("26");
                    txtGama1.setValue("205");
                    txtDelta1.setValue("26");
                    labA1.setText("104");
                    labCurrChar1.setText("h");
                    labMessage1.setText("ah");
                }
                break;
           case 9:
                zprava = "Šifrování třetího znaku... ";
                labCharNo1.setText("3");
                txtX1.setValue("126");
                labGama1.setText("23");
                labDelta1.setText("234");
                txtGama1.setValue("23");
                txtDelta1.setValue("234");
                labA1.setText("111");
                labCurrChar1.setText("o");
                labMessage1.setText("aho");
                if (!forward) {
                    labCharNo1.setText("3");
                    txtX1.setValue("126");
                    labGama1.setText("23");
                    labDelta1.setText("234");
                    txtGama1.setValue("23");
                    txtDelta1.setValue("234");
                    labA1.setText("111");
                    labCurrChar1.setText("o");
                    labMessage1.setText("aho");

                    btnFwd1.setText("Další");
                }
                break;
           case 10:
                zprava = "Šifrování posledního znaku... ";
                labCharNo1.setText("4");
                txtX1.setValue("57");
                labGama1.setText("221");
                labDelta1.setText("102");
                txtGama1.setValue("221");
                txtDelta1.setValue("102");
                labA1.setText("106");
                labCurrChar1.setText("j");
                labMessage1.setText("ahoj");

                btnFwd1.setText("Konec");
                
                if (!forward) {
                
                }
                break;
           case 11:
                ClearFields();
                zprava =("Jednou z variant ElGamalova kryptosystému je systém pro šifrování zpráv. Tento průvodce by měl vysvětlit průběh a některé vlastnosti tohoto protokolu.");
                //labPopis1.setVisible(true);
                txtN1.setDisabled(false);
                txtB1.setDisabled(false);
                txtK1.setDisabled(false);
                txtKlic1.setDisabled(false);
                txtMessage1.setDisabled(false);
                txtX1.setDisabled(false);
                txtGama1.setDisabled(false);
                txtPrivateKey.setDisabled(false);
                txtDelta1.setDisabled(false);
                labKrok1.setVisible(false);

                btnBack1.setDisabled(true);
                btnFwd1.setDisabled(true);
                //btnSkip1.setDisabled(true);
                btnSkip1.setText("Restart okna");
                btnVypY.setDisabled(false);
                button3.setDisabled(false);
                btnNext1.setDisabled(true);
                break;
           
        }

        hiddenCislo1.setValue(krok);
        labKrok1.setText("Krok " + (krok - 1) + ":");
        labPopis1.setText(zprava);
    }

    public String btnVyh_action() {
        try
        {
        String odp = txtOdp1.getValue().toString();
        if (odp.equals("3"))
            labO3.setText("OK");
        else
            labO3.setText("KO");

        odp = txtOdp2.getValue().toString();
        if (odp.equals("B")||odp.equals("b"))
            labO2.setText("OK");
        else
            labO2.setText("KO");

        odp = txtOdp3.getValue().toString();
        if (odp.equals("B")||odp.equals("b"))
            labO1.setText("OK");
        else
            labO1.setText("KO");

        odp = txtOdp4.getValue().toString();
        if (odp.equals("28"))
            labO4.setText("OK");
        else
            labO4.setText("KO");

        odp = txtOdp5.getValue().toString();
        if (odp.equals("c")||odp.equals("115"))
            labO5.setText("OK");
        else
            labO5.setText("KO");

        }
        catch (Exception e)
        {
            JOptionPane.showMessageDialog(null, "Chybná vstupní data, DL.");
        }
        return null;
    }

    public String btnVysl_action() {
        txtOdp1.setValue("3");
        txtOdp2.setValue("B");
        txtOdp3.setValue("B");
        txtOdp4.setValue("28");
        txtOdp5.setValue("c");
        return null;
    }

    public String hyperlink1_action() {
        // TODO: Process the action. Return value is a navigation
        // case name where null will return to the same page.
        return null;
    }

    public void txtN1_processValueChange(ValueChangeEvent vce) {
    }

    
}

