/*
 * NewJFrame.java
 *
 * Created on 2005. svibanj 17, 22:03
 */

package mainPackage;
import org.netbeans.lib.awtextra.*;

/**
 *
 * @author  alf
 */
public class NewJFrame extends javax.swing.JFrame {
    
    /** Creates new form NewJFrame */
    public NewJFrame() {
        initComponents();
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    private void initComponents() {//GEN-BEGIN:initComponents
        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        ETF = new javax.swing.JTextField();
        jLabel3 = new javax.swing.JLabel();
        EzvijezdaTF = new javax.swing.JTextField();
        jLabel4 = new javax.swing.JLabel();
        CcrtanoTF = new javax.swing.JTextField();
        jScrollPane1 = new javax.swing.JScrollPane();
        glavniDisplayTA = new javax.swing.JTextArea();
        jLabel5 = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();
        jLabel6 = new javax.swing.JLabel();
        jButton2 = new javax.swing.JButton();
        jLabel7 = new javax.swing.JLabel();
        testIndeksTF = new javax.swing.JTextField();

        getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("nonVicCracker ::: DES tool");
        jPanel1.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        getContentPane().add(jPanel1, new org.netbeans.lib.awtextra.AbsoluteConstraints(480, 140, -1, -1));

        jLabel1.setText("E = ");
        getContentPane().add(jLabel1, new org.netbeans.lib.awtextra.AbsoluteConstraints(20, 50, -1, -1));

        jLabel2.setText("Potrebni podatci : ");
        getContentPane().add(jLabel2, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 20, -1, -1));

        getContentPane().add(ETF, new org.netbeans.lib.awtextra.AbsoluteConstraints(40, 50, 70, -1));

        jLabel3.setText("E* = ");
        getContentPane().add(jLabel3, new org.netbeans.lib.awtextra.AbsoluteConstraints(160, 50, -1, -1));

        getContentPane().add(EzvijezdaTF, new org.netbeans.lib.awtextra.AbsoluteConstraints(190, 50, 60, -1));

        jLabel4.setText("C ' = ");
        getContentPane().add(jLabel4, new org.netbeans.lib.awtextra.AbsoluteConstraints(310, 50, 30, -1));

        getContentPane().add(CcrtanoTF, new org.netbeans.lib.awtextra.AbsoluteConstraints(350, 50, 70, -1));

        jScrollPane1.setViewportView(glavniDisplayTA);

        getContentPane().add(jScrollPane1, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 120, 660, 320));

        jLabel5.setText("Glavni display : ");
        getContentPane().add(jLabel5, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 100, -1, -1));

        jButton1.setText("Clear display");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        getContentPane().add(jButton1, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 450, -1, -1));

        jLabel6.setText("Ispisi tablicu i nadji test() skupove : ");
        getContentPane().add(jLabel6, new org.netbeans.lib.awtextra.AbsoluteConstraints(140, 460, -1, -1));

        jButton2.setBackground(new java.awt.Color(255, 0, 0));
        jButton2.setText("Start");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        getContentPane().add(jButton2, new org.netbeans.lib.awtextra.AbsoluteConstraints(350, 450, -1, -1));

        jLabel7.setText("Indeks skupa test(1 ili 2) :");
        getContentPane().add(jLabel7, new org.netbeans.lib.awtextra.AbsoluteConstraints(480, 50, -1, -1));

        getContentPane().add(testIndeksTF, new org.netbeans.lib.awtextra.AbsoluteConstraints(630, 50, 30, -1));

        pack();
    }//GEN-END:initComponents

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
        int E = Integer.parseInt(ETF.getText(),2);
        int Ezv = Integer.parseInt(EzvijezdaTF.getText(),2); //ovo je integer
        //E zvijezda ->> E*
        int Ccrtano = Integer.parseInt(CcrtanoTF.getText(),2); // C'
        
        int testIndeks = Integer.parseInt(testIndeksTF.getText());
        
        int B[] = new int[64];
        
        //kreiramo sve moguce B-ove
        for(int i=0;i<64;i++) B[i]=i;
        
        //trebaju nam 2 S-kutije (S[1] i S[2])
        int S[][][] = {{{14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7},
                          {0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8},
                          {4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0},
                          {15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13}},
                    {{15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10},
                        {3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5},
                        {0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15},
                        {13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9}}
                     };
       
        int Ecrtano; // E'
        Ecrtano = E ^ Ezv;
        
        //deklaracija pomocnih varijabli koji ce pamtiti medjurezultate
        //pretpostavaljamo da stupce tablice brojimo od jedan tako da prvi 
        //stupac tablice zapravo cine B-ovi
        int t[] = new int[5];
        //tablica ima 6 stupaca i prvi cine B-ovi a ostalih 5 su polje t[]
        //t[0] = B xor E'
        //t[1] = S(B)
        //t[2] = S(B xor E')
        //t[3] = S(B) xor S(B xor E')
        //t[4] = B xor E
        
        //xor nam je operator ^
        
        boolean ok=false; //pamti jesmo li dobili dobro rjesenje
        
        //prvo ispisimo zaglavlje tablice na glavni display
        glavniDisplayTA.append("\n\nB\tB xor E'\tS(B)\tS(B xor E' )\tS(B) xor S(B xor E' )\tB xor E\n\n");
        
        for(int i=0;i<B.length;i++)
        {
            ok=false;
            int j=0; //pomocni brojac za picit po t[] polju
            //prvo ispisi B[i]
            glavniDisplayTA.append(Integer.toBinaryString(B[i])+"\t");
            
            t[j]= B[i] ^ Ecrtano;
            glavniDisplayTA.append(Integer.toBinaryString(t[j])+"\t");
            j++;
            
            //sada trebamo saznati prvi i sesti bit u B[i] te 4 bita izmedju
            // ta 2 bita
           //to cemo uciniti pomocu operatora bitovnog I (&)
            //32=100000
            //30=011110
           t[j]=S[testIndeks-1][((B[i]&32)>>4)^(B[i]&1)][(B[i]&30)>>1];
           glavniDisplayTA.append(Integer.toBinaryString(t[j])+"\t");
           j++;
           
           t[j]=S[testIndeks-1][((t[0]&32)>>4)^(t[0]&1)][(t[0]&30)>>1];
           glavniDisplayTA.append(Integer.toBinaryString(t[j])+"\t");
           j++;
           
           t[j]=t[1] ^ t[2];
           glavniDisplayTA.append(Integer.toBinaryString(t[j])+"\t\t");
           j++;
           
           if(t[3]==Ccrtano) ok=true;
           
           if(ok) glavniDisplayTA.append(Integer.toBinaryString(B[i] ^ E)+"\t");
           else glavniDisplayTA.append("/");
           
           glavniDisplayTA.append("\n");
        }
        
      
        
    }//GEN-LAST:event_jButton2ActionPerformed

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
        glavniDisplayTA.setText("");
    }//GEN-LAST:event_jButton1ActionPerformed
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewJFrame().setVisible(true);
            }
        });
    }
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JTextField CcrtanoTF;
    private javax.swing.JTextField ETF;
    private javax.swing.JTextField EzvijezdaTF;
    private javax.swing.JTextArea glavniDisplayTA;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextField testIndeksTF;
    // End of variables declaration//GEN-END:variables
    
}
