import com.ms.wfc.app.*;
 
import com.ms.wfc.core.*;
 
import com.ms.wfc.ui.*;
 
import com.ms.wfc.html.*;
 
 
 
/**
 
 * This class can take a variable number of parameters on the command
 
 * line. Program execution begins with the main() method. The class
 
 * constructor is not invoked unless an object of type 'FormIDEAwindow'
 
 * created in the main() method.
 
 */
 
public class FormIDEAwindow extends Form
 
{
 
        public static int MtoCorCtoM;                                           //加密或脱密类型:0为加密
 
        
 
        public static final int TYPE_M_TO_C = 0;                        //代表加密的常量
 
        public static final int TYPE_C_TO_M = 1;                        //代表脱密的常量
 
        
 
        public static final int maxim=65537;                            //常量2的16次方加1,即65537
 
        public static final int fuyi=65536;                                     //常量2的16次方,即65536
 
        public static final int one=65535;                                      //常量65535,即低16位为1的整型
 
        public static final int round=8;
 
        
 
        int group;                                                                                      //正在进行的分组组数
 
        Count16[] count16MorC;                                                          //16进制的明文或密文数组
 
        char[][] Z = new char[7][10];                                           //加密密钥:Z[4][6]表示第6圈的第4个加密密钥
 
        char[][] DK = new char[7][10];                                          //脱密密钥:DK[2][9]表示第9圈即输出变换圈的第2个脱密密钥
 
        char[] XX = new char[5];                                                        //128比特的明文或密文表示形式
 
        char[] userKey = new char[9];                                           //用户输入的128位初始密钥
 
        
 
        public FormIDEAwindow()
 
        {
 
                super();
 
 
 
                // Required for Visual J++ Form Designer support
 
                initForm();             
 
 
 
                // TODO: Add any constructor code after initForm call
 
        }
 
 
 
        /**
 
         * FormIDEAwindow overrides dispose so it can clean up the
 
         * component list.
 
         */
 
        public void dispose()
 
        {
 
                super.dispose();
 
                components.dispose();
 
        }
 
 
 
        private void menuItemIDEABegin_click
(Object source, 
Event e
)            //开始按钮  
        {
 
                if(menuItemIDEABegin.getText().equals("重来"))
 
                {
 
                        super.dispose();
 
                        components.dispose();
 
                        Application.run(new FormIDEAwindow());
 
                }
 
                else
 
                {
 
                        panelIDEA.setVisible(false);
 
                        labelIDEAInstruction.setVisible(true);
 
                        labelIDEAInputMorC.setVisible(true);
 
                        labelIDEAMorClength.setVisible(true);
 
                        richEditIDEAInputMorC.setVisible(true);
 
                        labelIDEAInputK.setVisible(true);
 
                        labelIDEAKlength.setVisible(true);
 
                        richEditIDEAInputK.setVisible(true);
 
                        labelIDEACheckInputMorC.setVisible(true);
 
                        labelIDEACheckInputK.setVisible(true);  
 
                        buttonIDEACalculate.setVisible(true);
 
                        labelIDEAKResult.setVisible(true);
 
                        richEditIDEAKResult.setVisible(true);
 
                        labelIDEAResult.setVisible(true);
 
                        richEditIDEAResult.setVisible(true);
 
                        menuItemIDEABegin.setText("重来");
 
                        if(MtoCorCtoM == TYPE_M_TO_C)
 
                        {
 
                                labelIDEADataFillType.setVisible(true);
 
                                labelIDEAChangeDataFillType.setVisible(true);
 
                                buttonIDEAChangeDataFillType.setVisible(true);
 
                                labelIDEAInstruction.setText("这个程序用来进行IDEA分组密码算法的加密运算");
 
                                labelIDEAInputMorC.setText("请输入初始明文");
 
                                labelIDEAInputK.setText("请输入用户密钥");
 
                                buttonIDEACalculate.setText("加密");
 
                                labelIDEAKResult.setText("生成密钥");
 
                                labelIDEAResult.setText("生成密文:");
 
                        }
 
                        else
 
                        {
 
                                labelIDEAInstruction.setText("这个程序用来进行IDEA分组密码算法的脱密运算");
 
                                labelIDEAInputMorC.setText("请输入初始密文");
 
                                labelIDEAInputK.setText("请输入用户密钥");
 
                                buttonIDEACalculate.setText("脱密");
 
                                labelIDEAKResult.setText("生成密钥");
 
                                labelIDEAResult.setText("生成明文:");
 
                        }
 
                }
 
        }
 
 
 
        private void menuItemIDEABack_click
(Object source, 
Event e
)                     //返回按钮  
        {
 
                super.dispose();
 
                components.dispose();
 
                Application.run(new Form1());
 
        }
 
 
 
        private void menuItemIDEAExit_click
(Object source, 
Event e
)                     //退出按钮  
        {
 
                int result = MessageBox.show("感谢使用本软件。\n你真的要退出本程序吗?","密码学算法软件",MessageBox.OKCANCEL+MessageBox.ICONQUESTION+MessageBox.DEFBUTTON1);
 
                if(result==DialogResult.OK)
 
                {
 
                        super.dispose();
 
                        components.dispose();
 
                        Application.exit();
 
                }
 
                else
 
                {
 
                }
 
        }
 
 
 
        private void richEditIDEAInputMorC_textChanged
(Object source, 
Event e
)                          //显示输入明密文长度  
        {
 
                labelIDEAMorClength.setText("长度:"+richEditIDEAInputMorC.getText().length()+",即"+richEditIDEAInputMorC.getText().length()*4+"bit");
 
        }
 
 
 
        private void richEditIDEAInputK_textChanged
(Object source, 
Event e
)                                     //显示输入密钥长度  
        {
 
                labelIDEAKlength.setText("长度:"+richEditIDEAInputK.getText().length()+",即"+richEditIDEAInputK.getText().length()*4+"bit");
 
        }
 
 
 
        private void buttonIDEAChangeDataFillType_click
(Object source, 
Event e
)                         //加密时需改变数据填充类型  
        {
 
                comboBoxIDEAChangeDataFillType.setVisible(true);
 
                buttonIDEAChangeDataFillType.setVisible(false);
 
                buttonIDEACalculate.setEnabled(false);
 
        }
 
 
 
        private void comboBoxIDEAChangeDataFillType_selectedIndexChanged
(Object source, 
Event e
)  
        {
 
                if((String)comboBoxIDEAChangeDataFillType.
getSelectedItem() != null)                    //选择填充方式  
                {
 
                        buttonIDEACalculate.setEnabled(true);
 
                }       
 
        }
 
 
 
        private void key(char[] usekey)                                                                 //生成加密密钥
 
        {
 
                if(usekey.length==9)
 
                {
 
                        char[] S = new char[52];
 
                        int i,j,r;
 
                        
 
                        for(i=1;i<9;i++)                                                                                //S[1],S[2],……S[8]
 
                        {
 
                                S[i-1]=usekey[i];
 
                        }
 
                        for(i=8;i<52;i++)
 
                        {
 
                                if((i+2)%8==0)                                                                          //S[14],S[22],……
 
                                {
 
                                        S[i]=(char)(((int)((char)((int)S[i-7]<<9))^(int)((char)((int)S[i-14]>>7)))&one);
 
                                }
 
                                else
 
                                {
 
                                        if((i+1)%8==0)                                                                  //S[15],S[23],……
 
                                        {
 
                                                S[i]=(char)(((int)((char)((int)S[i-15]<<9))^(int)((char)((int)S[i-14]>>7)))&one);
 
                                        }                                       
 
                                        else
 
                                        {
 
                                                S[i]=(char)(((int)((char)((int)S[i-7]<<9))^(int)((char)((int)S[i-6]>>7)))&one);
 
                                        }
 
                                }
 
                        }
 
                        for(r=1;r<=round;r++)                                                                   //形成加密密钥Z
 
                        {
 
                                for(j=1;j<=6;j++)
 
                                {       
 
                                        Z[j][r]=S[6*(r-1)+j-1];
 
                                }
 
                        }
 
                        if(r==round+1)
 
                        {
 
                                for(j=1;j<=4;j++)
 
                                {
 
                                        Z[j][r]=S[6*(r-1)+j-1];
 
                                }
 
                        }
 
                }
 
        }
 
        
 
        private void de_key(char[][] Zkey)                                                              //生成脱密密钥DK
 
        {
 
                if(Zkey.length==7&Zkey[0].length==10)
 
                {
 
                        int i,j;
 
                        
 
                        for(j=1;j<=round+1;j++)
 
                        {
 
                                DK[1][round-j+2]=(char)Maths.inverse((int)Zkey[1][j],maxim);
 
                                DK[4][round-j+2]=(char)Maths.inverse((int)Zkey[4][j],maxim);
 
                                if(j==1||j==round+1)
 
                                {
 
                                        DK[2][round-j+2]=(char)((fuyi-(int)Zkey[2][j])&one);
 
                                        DK[3][round-j+2]=(char)((fuyi-(int)Zkey[3][j])&one);
 
                                }
 
                                else
 
                                {
 
                                        DK[2][round-j+2]=(char)((fuyi-(int)Zkey[3][j])&one);
 
                                        DK[3][round-j+2]=(char)((fuyi-(int)Zkey[2][j])&one);
 
                                }
 
                        }
 
                        for(j=1;j<=round+1;j++)
 
                        {
 
                                DK[5][round+1-j]=Zkey[5][j];
 
                                DK[6][round+1-j]=Zkey[6][j];
 
                        }
 
                }
 
        }
 
        
 
        private void keyPrint
(char[][] Key)                                                             //加脱密密钥打印  
        {
 
                int i,j,k;
 
                Count16[] count16print = new Count16[4];
 
                for(i=0; i<4; i++)
 
                {
 
                        count16print[i] = new Count16();
 
                }
 
                
 
                strK = "     ";
 
                for(i=1; i<7; i++)
 
                {
 
                        if(MtoCorCtoM==TYPE_M_TO_C)
 
                        {
 
                                strK = strK+"   Z"+i+" ";
 
                        }
 
                        else
 
                        {
 
                                strK = strK+"   U"+i+" ";
 
                        }
 
                }
 
                for(i=1; i<9; i++)
 
                {
 
                        strK = strK+"第"+i+"圈: ";
 
                        for(j=1; j<7; j++)
 
                        {
 
                                count16print 
= Count16.
shortToCount16(Key[j
][i
]); 
                                for(k=0; k<4; k++)
 
                                {
 
                                        strK = strK+count16print[k].gethex();
 
                                }
 
                                if(j<6)
 
                                {
 
                                        strK = strK+"  ";
 
                                }
 
                        }
 
                }
 
                strK = strK+"第"+i+"圈: ";
 
                for(j=1; j<5; j++)
 
                {
 
                        count16print 
= Count16.
shortToCount16(Key[j
][i
]); 
                        for(k=0; k<4; k++)
 
                        {
 
                                strK = strK+count16print[k].gethex();
 
                        }
 
                        if(j<4)
 
                        {
 
                                strK = strK+"  ";
 
                        }
 
                }
 
                
 
                richEditIDEAKResult.setText(strK);
 
        }
 
                        
 
        private void buttonIDEACalculate_click
(Object source, 
Event e
)          //加密或脱密计算按钮  
        {
 
                int col,row;
 
                boolean rightInput = false;
 
                strMorC = richEditIDEAInputMorC.getText();
 
                strK = richEditIDEAInputK.getText();
 
                if(strMorC.equals("")|strK.equals(""))                                                  //明密文或密钥为空
 
                {
 
                }
 
                else
 
                {
 
                        char[] chMorC = new char[strMorC.length()];
 
                        char[] chK = new char[strK.length()];
 
                        chMorC = strMorC.toCharArray();
 
                        chK = strK.toCharArray();
 
                        
 
                        for(col=0; col<chMorC.length; col++)
 
                        {
 
                                if(chMorC[col]< '0'|(chMorC[col]> '9'&chMorC[col]< 'A')|chMorC[col]> 'F')       //检测输入合法性
 
                                {
 
                                        if(MtoCorCtoM == TYPE_M_TO_C)
 
                                        {
 
                                                if(chMorC[col]==' ')
 
                                                {
 
                                                        labelIDEACheckInputMorC.setText("明文中第"+(col+1)+"位字符是空格,请删除");
 
                                                }
 
                                                else
 
                                                {
 
                                                        labelIDEACheckInputMorC.setText("明文中第"+(col+1)+"位字符不合法");
 
                                                }
 
                                        }
 
                                        else
 
                                        {
 
                                                if(chMorC[col]==' ')
 
                                                {
 
                                                        labelIDEACheckInputMorC.setText("密文中第"+(col+1)+"位字符是空格,请删除");
 
                                                }
 
                                                else
 
                                                {
 
                                                        labelIDEACheckInputMorC.setText("密文中第"+(col+1)+"位字符不合法");
 
                                                }
 
                                        }
 
                                        rightInput = false;
 
                                        break;
 
                                }
 
                        }
 
                        if(col==chMorC.length)
 
                        {
 
                                labelIDEACheckInputMorC.setText("");
 
                        }
 
                        for(row=0; row<chK.length; row++)
 
                        {
 
                                if(chK[row]< '0'|(chK[row]> '9'&chK[row]< 'A')|chK[row]> 'F')
 
                                {
 
                                        if(chK[row]==' ')
 
                                        {
 
                                                labelIDEACheckInputK.setText("密钥中第"+(row+1)+"位字符是空格,请删除");
 
                                        }
 
                                        else
 
                                        {
 
                                                labelIDEACheckInputK.setText("密钥中第"+(row+1)+"位字符不合法");
 
                                        }
 
                                        rightInput = false;
 
                                        break;
 
                                }
 
                        }
 
                        if(row==chK.length)
 
                        {
 
                                labelIDEACheckInputK.setText("");
 
                        }
 
                        if(col==chMorC.length & row==chK.length)
 
                        {
 
                                rightInput = true;
 
                        }
 
                        if(chK.length!=32)                                                                                                              //长度检测
 
                        {
 
                                labelIDEACheckInputK.setText("密钥长度必须为128bit,即32个字符");
 
                                rightInput = false;
 
                        }
 
                        if(MtoCorCtoM==TYPE_C_TO_M && chMorC.length%16!=0)
 
                        {
 
                                labelIDEACheckInputMorC.setText("密文长度必须为64bit的整数倍");
 
                                rightInput = false;
 
                        }
 
                        if(rightInput==true)                                                                                                    //检测输入正确时
 
                        {
 
                                labelIDEACheckInputMorC.setText("");
 
                                labelIDEACheckInputK.setText("");
 
                                
 
                                Count16[] count16temp = new Count16[4];
 
                                for(col=0; col<4; col++)
 
                                {
 
                                        count16temp[col] = new Count16();
 
                                }
 
                                
 
                                for(col=0; col<32; col=col+4)
 
                                {
 
                                        for(row=0; row<4; row++)
 
                                        {
 
                                                count16temp[row].sethex(chK[col+row]);
 
                                        }                                       
 
                                        userKey[col/4+1] = Count16.toshort(count16temp);                                //生成用户密钥
 
                                }
 
                                key(userKey);                                                                                                           //生成密钥
 
                                if(MtoCorCtoM==TYPE_C_TO_M)                                                                                     //生成脱密密钥并打印
 
                                {
 
                                        de_key(Z);
 
                                        keyPrint(DK);
 
                                }
 
                                else                                                                                                                            //打印加密密钥
 
                                {
 
                                        keyPrint(Z);
 
                                }
 
                                
 
                                count16MorC = new Count16[((chMorC.length-1)/16+1)*16];                         //明密文存储内存分配
 
                                for(col=0; col<count16MorC.length; col++)
 
                                {
 
                                        count16MorC[col] = new Count16();
 
                                }
 
                                for(col=0; col<chMorC.length; col++)
 
                                {
 
                                        count16MorC[col].sethex(chMorC[col]);
 
                                }
 
                                                                        
 
                                if(MtoCorCtoM==TYPE_M_TO_C && buttonIDEAChangeDataFillType.getVisible()==false)
 
                                {
 
                                        for(col=chMorC.length; col<count16MorC.length; col++)                   //默认填充0
 
                                        {
 
                                                count16MorC[col].sethex('0');
 
                                        }
 
                                        
 
                                        strDataFillType 
= (String)comboBoxIDEAChangeDataFillType.
getSelectedItem(); 
                                        if(strDataFillType.equals("填充 0 (默认)"))
 
                                        {
 
                                        }
 
                                        if(strDataFillType.equals("填充 1"))                                                  //填充1
 
                                        {
 
                                                for(col=chMorC.length; col<count16MorC.length; col++)
 
                                                {
 
                                                        count16MorC[col].sethex('F');
 
                                                }
 
                                        }
 
                                        if(strDataFillType.equals("填充0和1(先0后1)"))                                     //填充01
 
                                        {
 
                                                for(col=chMorC.length; col<count16MorC.length; col++)
 
                                                {
 
                                                        count16MorC[col].sethex('5');
 
                                                }
 
                                        }
 
                                        if(strDataFillType.equals("填充1和0(先1后0)"))                                     //填充10
 
                                        {
 
                                                for(col=chMorC.length; col<count16MorC.length; col++)
 
                                                {
 
                                                        count16MorC[col].sethex('A');
 
                                                }
 
                                        }                                       
 
                                }
 
                                
 
                                for(group=1; group<=(count16MorC.length/16); group++)                           //分组信息
 
                                {
 
                                        for(col=(group-1)*16,row=0; row<16; col++,row++)
 
                                        {
 
                                                count16temp[row%4].sethex(count16MorC[col].gethex());
 
                                                if(row%4==3)
 
                                                {
 
                                                        XX[row/4+1] = Count16.toshort(count16temp);
 
                                                }
 
                                        }
 
                                        
 
                                        if(MtoCorCtoM == TYPE_M_TO_C)                                                                   //加密计算
 
                                        {
 
                                                cip(XX,Z);
 
                                        }
 
                                        else                                                                                                                    //脱密计算
 
                                        {
 
                                                cip(XX,DK);
 
                                        }                                       
 
                                }
 
                                
 
                                richEditIDEAResult.setText(strCorM);
 
                                strCorM = "";
 
                                
 
                                buttonIDEACalculate.setEnabled(false);
 
                                richEditIDEAInputK.setEnabled(false);
 
                                richEditIDEAInputMorC.setEnabled(false);
 
                                richEditIDEAInputK.
setBackColor(Color.
LIGHTGRAY); 
                                richEditIDEAInputMorC.
setBackColor(Color.
LIGHTGRAY); 
                                buttonIDEAChangeDataFillType.setEnabled(false);
 
                                comboBoxIDEAChangeDataFillType.setEnabled(false);
 
                                comboBoxIDEAChangeDataFillType.
setBackColor(Color.
LIGHTGRAY); 
                        }
 
                }
 
        }
 
        
 
        private void cip(char[] IN,char[][] KEY)                                                                                //加密函数  
 
        {
 
                int i,j,r;
 
                char[] OUT = new char[5];
 
                char[] x = new char[5];
 
                char kk,t1,t2,a;
 
                Count16[] roundOut = new Count16[4];
 
                for(i=0; i<4; i++)
 
                {
 
                        roundOut[i] = new Count16();
 
                }
 
                
 
                strCorM = strCorM + "*****************************************";
 
                if(MtoCorCtoM == TYPE_M_TO_C)
 
                {
 
                        strCorM = strCorM + "第"+group+"组密文:                               ";
 
                }
 
                else
 
                {
 
                        strCorM = strCorM + "第"+group+"组明文:                               ";
 
                }
 
                strCorM = strCorM + "-----------------------------------------";
 
                x[1]=IN[1];
 
                x[2]=IN[2];
 
                x[3]=IN[3];
 
                x[4]=IN[4];
 
                
 
                for(r=1;r<=8;r++)                                                                                                                       //8圈迭代.
 
                {
 
                        x[1]=mul(x[1],KEY[1][r]);
 
                        x[2]=(char)(((int)x[2]+(int)KEY[2][r])&one);
 
                        x[3]=(char)(((int)x[3]+(int)KEY[3][r])&one);
 
                        x[4]=mul(x[4],KEY[4][r]);
 
                                                                                                                                                                        //乘加(MA)结构.
 
                        kk=mul(KEY[5][r],(char)((int)x[1]^(int)x[3]));
 
                        t1=mul(KEY[6][r],(char)(((int)kk+((int)x[2]^(int)x[4]))&one));
 
                        t2=(char)(((int)kk+(int)t1)&one);
 
                                                                                                                                                                        //下一圈输入交换.
 
                        x[1]=(char)((int)x[1]^(int)t1);
 
                        x[4]=(char)((int)x[4]^(int)t2);
 
                        a=(char)((int)x[2]^(int)t2);
 
                        x[2]=(char)((int)x[3]^(int)t1);
 
                        x[3]=a;
 
                        
 
                        strCorM = strCorM+"第"+r+"圈输出:       ";
 
                        for(i=1; i<5; i++)
 
                        {
 
                                roundOut = Count16.shortToCount16( x[i] );
 
                                for(j=0; j<4; j++)
 
                                {
 
                                        strCorM = strCorM + roundOut[j].gethex();
 
                                }
 
                                strCorM = strCorM + "  ";
 
                        }
 
                }
 
                                                                                                                                                                        //输出变换得出加脱密结果.
 
                OUT[1]=mul(x[1],KEY[1][round+1]);
 
                OUT[4]=mul(x[4],KEY[4][round+1]);
 
                OUT[2]=(char)((x[3]+KEY[2][round+1])&one);
 
                OUT[3]=(char)((x[2]+KEY[3][round+1])&one);
 
                
 
                if(MtoCorCtoM == TYPE_M_TO_C)                                                                                           //为打印作准备
 
                {
 
                        if(group<=9)
 
                        {
 
                                strCorM = strCorM+"第"+group+"组加密结果:   ";
 
                        }
 
                        else
 
                        {
 
                                strCorM = strCorM+"第"+group+"组加密结果:  ";
 
                        }
 
                }
 
                else
 
                {
 
                        if(group<=9)
 
                        {
 
                                strCorM = strCorM+"第"+group+"组脱密结果:   ";
 
                        }
 
                        else
 
                        {
 
                                strCorM = strCorM+"第"+group+"组脱密结果:  ";
 
                        }
 
                }
 
                for(i=1; i<5; i++)
 
                {
 
                        roundOut = Count16.shortToCount16( OUT[i] );
 
                        for(j=0; j<4; j++)
 
                        {
 
                                strCorM = strCorM + roundOut[j].gethex();
 
                        }
 
                        strCorM = strCorM + "  ";
 
                }
 
                strCorM = strCorM+"*****************************************";
 
        }
 
        
 
        private char mul(char a,char b)                                                                                                 //模2的16次方加1运算
 
        {
 
                int p;
 
                long q;
 
                if((int)a==0)
 
                {
 
                        p=maxim-(int)b;
 
                }
 
                else
 
                {
 
                        if((int)b==0)
 
                        {
 
                                p=maxim-(int)a;
 
                        }
 
                        else
 
                        {
 
                                q=(long)a*(long)b;
 
                                if((q&((long)one))>(long)(q>>16))
 
                                {
 
                                        p=(int)((q&((long)one))-(long)(q>>16));
 
                                }
 
                                else
 
                                {
 
                                        p=(int)((q&((long)one))+(long)maxim-(long)(q>>16));
 
                                }
 
                        }
 
                }
 
                return (char)(p&one);
 
        }       
 
        
 
        private void menuItemHelp_click
(Object source, 
Event e
)  
        {
 
                MessageBox.show("IDEA算法使用帮助:\n  输入框内可以输入字符\n0-9以及大字字母A-F,注意小写字母不行。\n如果输入的字符不能通过检查,请确认是否输入了回车键。\n如有,请将回车字符删去。\n\n说明:\n  剪切: Ctrl+X\n  复制: Ctrl+C\n  粘贴: Ctrl+V"
 
                                                ,"请注意",MessageBox.OK+MessageBox.ICONEXCLAMATION+MessageBox.DEFBUTTON1);
 
        }
 
 
 
        /**
 
         * NOTE: The following code is required by the Visual J++ form
 
         * designer.  It can be modified using the form editor.  Do not
 
         * modify it using the code editor.
 
         */
 
        MainMenu mainMenuIDEA = new MainMenu();
 
        RichEdit richEditIDEAResult = new RichEdit();
 
        ComboBox comboBoxIDEAChangeDataFillType = new ComboBox();
 
        RichEdit richEditIDEAInputK = new RichEdit();
 
        RichEdit richEditIDEAInputMorC = new RichEdit();
 
        RichEdit richEditIDEAKResult = new RichEdit();
 
        PictureBox pictureBoxIDEA = new PictureBox();
 
        RichEdit richEditBegin = new RichEdit();
 
        RichEdit richEditzhuyi = new RichEdit();
 
 
 
        private void initForm()
 
        {
 
                // NOTE:  This form is storing resource information in an
 
                // external file.  Do not modify the string parameter to any
 
                // resources.getObject() function call. For example, do not
 
                // modify "foo1_location" in the following line of code
 
                // even if the name of the Foo object changes: 
 
                //   foo1.setLocation((Point)resources.getObject("foo1_location"));
 
 
 
                IResourceManager resources = new ResourceManager(this, "FormIDEAwindow");
 
                menuItemIDEABegin.setText("开始");
 
                menuItemIDEABegin.addOnClick(new EventHandler(this.menuItemIDEABegin_click));
 
 
 
                menuItemIDEABack.setText("返回");
 
                menuItemIDEABack.addOnClick(new EventHandler(this.menuItemIDEABack_click));
 
 
 
                menuItemIDEAExit.setText("退出");
 
                menuItemIDEAExit.addOnClick(new EventHandler(this.menuItemIDEAExit_click));
 
 
 
                labelIDEAInstruction.
setFont(new Font("宋体", 16.0f, FontSize.
POINTS, FontWeight.
BOLD, 
false, 
false, 
false, CharacterSet.
DEFAULT, 
0)); 
                labelIDEAInstruction.
setForeColor(Color.
BLACK); 
                labelIDEAInstruction.
setLocation(new Point(32, 
16)); 
                labelIDEAInstruction.
setSize(new Point(288, 
48)); 
                labelIDEAInstruction.setTabIndex(0);
 
                labelIDEAInstruction.setTabStop(false);
 
                labelIDEAInstruction.setText("");
 
                labelIDEAInstruction.setVisible(false);
 
 
 
                richEditIDEAResult.
setBackColor(new Color(204, 
255, 
51)); 
                richEditIDEAResult.
setFont(new Font("宋体", 14.0f, FontSize.
POINTS, FontWeight.
NORMAL, 
false, 
false, 
false, CharacterSet.
DEFAULT, 
0)); 
                richEditIDEAResult.
setForeColor(Color.
WINDOWTEXT); 
                richEditIDEAResult.
setLocation(new Point(376, 
184)); 
                richEditIDEAResult.
setSize(new Point(400, 
328)); 
                richEditIDEAResult.setTabIndex(13);
 
                richEditIDEAResult.setText("");
 
                richEditIDEAResult.setVisible(false);
 
                richEditIDEAResult.setReadOnly(true);
 
                richEditIDEAResult.setScrollBars(RichEditScrollBars.FORCED_VERTICAL);
 
 
 
                buttonIDEACalculate.
setFont(new Font("宋体", 18.0f, FontSize.
POINTS, FontWeight.
BOLD, 
false, 
false, 
false, CharacterSet.
DEFAULT, 
0)); 
                buttonIDEACalculate.
setLocation(new Point(272, 
392)); 
                buttonIDEACalculate.
setSize(new Point(64, 
48)); 
                buttonIDEACalculate.setTabIndex(12);
 
                buttonIDEACalculate.setText("");
 
                buttonIDEACalculate.setVisible(false);
 
                buttonIDEACalculate.addOnClick(new EventHandler(this.buttonIDEACalculate_click));
 
 
 
                labelIDEACheckInputMorC.
setBackColor(new Color(153, 
77, 
0)); 
                labelIDEACheckInputMorC.
setFont(new Font("宋体", 14.0f, FontSize.
POINTS, FontWeight.
BOLD, 
false, 
false, 
false, CharacterSet.
DEFAULT, 
0)); 
                labelIDEACheckInputMorC.
setForeColor(Color.
BLACK); 
                labelIDEACheckInputMorC.
setLocation(new Point(16, 
336)); 
                labelIDEACheckInputMorC.
setSize(new Point(320, 
20)); 
                labelIDEACheckInputMorC.setTabIndex(11);
 
                labelIDEACheckInputMorC.setTabStop(false);
 
                labelIDEACheckInputMorC.setText("");
 
                labelIDEACheckInputMorC.setVisible(false);
 
                labelIDEACheckInputMorC.setTextAlign(HorizontalAlignment.CENTER);
 
 
 
                comboBoxIDEAChangeDataFillType.
setBackColor(new Color(204, 
255, 
51)); 
                comboBoxIDEAChangeDataFillType.
setFont(new Font("宋体", 9.0f, FontSize.
POINTS, FontWeight.
NORMAL, 
false, 
false, 
false, CharacterSet.
DEFAULT, 
0)); 
                comboBoxIDEAChangeDataFillType.
setLocation(new Point(16, 
472)); 
                comboBoxIDEAChangeDataFillType.
setSize(new Point(192, 
20)); 
                comboBoxIDEAChangeDataFillType.setTabIndex(10);
 
                comboBoxIDEAChangeDataFillType.setText("");
 
                comboBoxIDEAChangeDataFillType.setVisible(false);
 
                comboBoxIDEAChangeDataFillType.setStyle(ComboBoxStyle.DROPDOWNLIST);
 
                comboBoxIDEAChangeDataFillType.
setItems(new Object[] { 
                                                                                                "填充 0 (默认)", 
 
                                                                                                "填充 1", 
 
                                                                                                "填充0和1(先0后1)", 
 
                                                                                                "填充1和0(先1后0)"});
 
                comboBoxIDEAChangeDataFillType.addOnSelectedIndexChanged(new EventHandler(this.comboBoxIDEAChangeDataFillType_selectedIndexChanged));
 
 
 
                buttonIDEAChangeDataFillType.
setFont(new Font("宋体", 9.0f, FontSize.
POINTS, FontWeight.
NORMAL, 
false, 
false, 
false, CharacterSet.
DEFAULT, 
0)); 
                buttonIDEAChangeDataFillType.
setLocation(new Point(216, 
448)); 
                buttonIDEAChangeDataFillType.
setSize(new Point(32, 
24)); 
                buttonIDEAChangeDataFillType.setTabIndex(9);
 
                buttonIDEAChangeDataFillType.setText("更改");
 
                buttonIDEAChangeDataFillType.setVisible(false);
 
                buttonIDEAChangeDataFillType.addOnClick(new EventHandler(this.buttonIDEAChangeDataFillType_click));
 
 
 
                labelIDEAChangeDataFillType.
setFont(new Font("宋体", 12.0f, FontSize.
POINTS, FontWeight.
NORMAL, 
true, 
false, 
false, CharacterSet.
DEFAULT, 
0)); 
                labelIDEAChangeDataFillType.
setForeColor(new Color(224, 
224, 
224)); 
                labelIDEAChangeDataFillType.
setLocation(new Point(16, 
448)); 
                labelIDEAChangeDataFillType.
setSize(new Point(192, 
16)); 
                labelIDEAChangeDataFillType.setTabIndex(8);
 
                labelIDEAChangeDataFillType.setTabStop(false);
 
                labelIDEAChangeDataFillType.setText("改变默认的数据填充类型");
 
                labelIDEAChangeDataFillType.setVisible(false);
 
                labelIDEAChangeDataFillType.setTextAlign(HorizontalAlignment.CENTER);
 
 
 
                labelIDEAInputMorC.
setFont(new Font("宋体", 12.0f, FontSize.
POINTS, FontWeight.
BOLD, 
false, 
false, 
false, CharacterSet.
DEFAULT, 
0)); 
                labelIDEAInputMorC.
setForeColor(Color.
BLACK); 
                labelIDEAInputMorC.
setLocation(new Point(8, 
88)); 
                labelIDEAInputMorC.
setSize(new Point(152, 
23)); 
                labelIDEAInputMorC.setTabIndex(1);
 
                labelIDEAInputMorC.setTabStop(false);
 
                labelIDEAInputMorC.setText("");
 
                labelIDEAInputMorC.setVisible(false);
 
 
 
                labelIDEADataFillType.
setFont(new Font("宋体", 12.0f, FontSize.
POINTS, FontWeight.
NORMAL, 
true, 
false, 
false, CharacterSet.
DEFAULT, 
0)); 
                labelIDEADataFillType.
setForeColor(new Color(224, 
224, 
224)); 
                labelIDEADataFillType.
setLocation(new Point(16, 
424)); 
                labelIDEADataFillType.
setSize(new Point(248, 
16)); 
                labelIDEADataFillType.setTabIndex(7);
 
                labelIDEADataFillType.setTabStop(false);
 
                labelIDEADataFillType.setText("数据填充类型:填充 0 (默认)");
 
                labelIDEADataFillType.setVisible(false);
 
                labelIDEADataFillType.setTextAlign(HorizontalAlignment.CENTER);
 
 
 
                richEditIDEAInputK.
setBackColor(new Color(204, 
255, 
51)); 
                richEditIDEAInputK.
setFont(new Font("宋体", 14.0f, FontSize.
POINTS, FontWeight.
NORMAL, 
false, 
false, 
false, CharacterSet.
DEFAULT, 
0)); 
                richEditIDEAInputK.
setForeColor(Color.
WINDOWTEXT); 
                richEditIDEAInputK.
setLocation(new Point(8, 
248)); 
                richEditIDEAInputK.
setSize(new Point(328, 
80)); 
                richEditIDEAInputK.setTabIndex(6);
 
                richEditIDEAInputK.setText("");
 
                richEditIDEAInputK.setVisible(false);
 
                richEditIDEAInputK.setScrollBars(RichEditScrollBars.VERTICAL);
 
                richEditIDEAInputK.addOnTextChanged(new EventHandler(this.richEditIDEAInputK_textChanged));
 
 
 
                labelIDEAKlength.
setFont(new Font("宋体", 12.0f, FontSize.
POINTS, FontWeight.
BOLD, 
false, 
false, 
false, CharacterSet.
DEFAULT, 
0)); 
                labelIDEAKlength.
setForeColor(Color.
BLACK); 
                labelIDEAKlength.
setLocation(new Point(168, 
216)); 
                labelIDEAKlength.
setSize(new Point(192, 
23)); 
                labelIDEAKlength.setTabIndex(5);
 
                labelIDEAKlength.setTabStop(false);
 
                labelIDEAKlength.setText("");
 
 
 
                labelIDEAMorClength.
setFont(new Font("宋体", 12.0f, FontSize.
POINTS, FontWeight.
BOLD, 
false, 
false, 
false, CharacterSet.
DEFAULT, 
0)); 
                labelIDEAMorClength.
setForeColor(Color.
BLACK); 
                labelIDEAMorClength.
setLocation(new Point(168, 
88)); 
                labelIDEAMorClength.
setSize(new Point(192, 
23)); 
                labelIDEAMorClength.setTabIndex(4);
 
                labelIDEAMorClength.setTabStop(false);
 
                labelIDEAMorClength.setText("");
 
 
 
                richEditIDEAInputMorC.
setBackColor(new Color(204, 
255, 
51)); 
                richEditIDEAInputMorC.
setFont(new Font("宋体", 14.0f, FontSize.
POINTS, FontWeight.
NORMAL, 
false, 
false, 
false, CharacterSet.
DEFAULT, 
0)); 
                richEditIDEAInputMorC.
setForeColor(Color.
WINDOWTEXT); 
                richEditIDEAInputMorC.
setLocation(new Point(8, 
120)); 
                richEditIDEAInputMorC.
setSize(new Point(328, 
80)); 
                richEditIDEAInputMorC.setTabIndex(3);
 
                richEditIDEAInputMorC.setText("");
 
                richEditIDEAInputMorC.setVisible(false);
 
                richEditIDEAInputMorC.setScrollBars(RichEditScrollBars.VERTICAL);
 
                richEditIDEAInputMorC.addOnTextChanged(new EventHandler(this.richEditIDEAInputMorC_textChanged));
 
 
 
                labelIDEAInputK.
setFont(new Font("宋体", 12.0f, FontSize.
POINTS, FontWeight.
BOLD, 
false, 
false, 
false, CharacterSet.
DEFAULT, 
0)); 
                labelIDEAInputK.
setForeColor(Color.
BLACK); 
                labelIDEAInputK.
setLocation(new Point(8, 
216)); 
                labelIDEAInputK.
setSize(new Point(152, 
23)); 
                labelIDEAInputK.setTabIndex(2);
 
                labelIDEAInputK.setTabStop(false);
 
                labelIDEAInputK.setText("");
 
                labelIDEAInputK.setVisible(false);
 
 
 
                labelIDEACheckInputK.
setFont(new Font("宋体", 14.0f, FontSize.
POINTS, FontWeight.
BOLD, 
false, 
false, 
false, CharacterSet.
DEFAULT, 
0)); 
                labelIDEACheckInputK.
setLocation(new Point(16, 
360)); 
                labelIDEACheckInputK.
setSize(new Point(320, 
20)); 
                labelIDEACheckInputK.setTabIndex(14);
 
                labelIDEACheckInputK.setTabStop(false);
 
                labelIDEACheckInputK.setText("");
 
                labelIDEACheckInputK.setVisible(false);
 
                labelIDEACheckInputK.setTextAlign(HorizontalAlignment.CENTER);
 
 
 
                richEditIDEAKResult.
setBackColor(new Color(204, 
255, 
51)); 
                richEditIDEAKResult.
setFont(new Font("宋体", 14.0f, FontSize.
POINTS, FontWeight.
NORMAL, 
false, 
false, 
false, CharacterSet.
DEFAULT, 
0)); 
                richEditIDEAKResult.
setForeColor(Color.
WINDOWTEXT); 
                richEditIDEAKResult.
setLocation(new Point(376, 
56)); 
                richEditIDEAKResult.
setSize(new Point(400, 
88)); 
                richEditIDEAKResult.setTabIndex(15);
 
                richEditIDEAKResult.setText("");
 
                richEditIDEAKResult.setVisible(false);
 
                richEditIDEAKResult.setReadOnly(true);
 
                richEditIDEAKResult.setScrollBars(RichEditScrollBars.FORCED_VERTICAL);
 
 
 
                labelIDEAKResult.
setFont(new Font("宋体", 15.0f, FontSize.
POINTS, FontWeight.
BOLD, 
false, 
false, 
false, CharacterSet.
DEFAULT, 
0)); 
                labelIDEAKResult.
setLocation(new Point(384, 
32)); 
                labelIDEAKResult.
setSize(new Point(240, 
23)); 
                labelIDEAKResult.setTabIndex(16);
 
                labelIDEAKResult.setTabStop(false);
 
                labelIDEAKResult.setText("");
 
                labelIDEAKResult.setVisible(false);
 
 
 
                labelIDEAResult.
setFont(new Font("宋体", 15.0f, FontSize.
POINTS, FontWeight.
BOLD, 
false, 
false, 
false, CharacterSet.
DEFAULT, 
0)); 
                labelIDEAResult.
setLocation(new Point(384, 
160)); 
                labelIDEAResult.
setSize(new Point(240, 
23)); 
                labelIDEAResult.setTabIndex(17);
 
                labelIDEAResult.setTabStop(false);
 
                labelIDEAResult.setText("");
 
                labelIDEAResult.setVisible(false);
 
 
 
                menuItemHelp.setText("帮助");
 
                menuItemHelp.addOnClick(new EventHandler(this.menuItemHelp_click));
 
 
 
                mainMenuIDEA.
setMenuItems(new MenuItem[] { 
                                                                  menuItemIDEABegin, 
 
                                                                  menuItemIDEABack, 
 
                                                                  menuItemIDEAExit, 
 
                                                                  menuItemHelp});
 
                /* @designTimeOnly mainMenuIDEA.setLocation(new Point(112, -32)); */
 
 
 
                this.
setBackColor(new Color(153, 
77, 
0));  
                this.
setForeColor(Color.
BLACK);  
                this.setText("密码学-IDEA算法");
 
                this.
setAutoScaleBaseSize(new Point(6, 
12));  
                this.setBorderStyle(FormBorderStyle.FIXED_3D);
 
                this.
setClientSize(new Point(790, 
531));  
                this.setMaximizeBox(false);
 
                this.setMenu(mainMenuIDEA);
 
                this.setStartPosition(FormStartPosition.CENTER_SCREEN);
 
 
 
                panelIDEA.
setSize(new Point(792, 
536)); 
                panelIDEA.setTabIndex(19);
 
                panelIDEA.setText("panel1");
 
 
 
                pictureBoxIDEA.
setLocation(new Point(112, 
0)); 
                pictureBoxIDEA.
setSize(new Point(680, 
536)); 
                pictureBoxIDEA.setTabIndex(0);
 
                pictureBoxIDEA.setTabStop(false);
 
                pictureBoxIDEA.setText("pictureBox1");
 
                pictureBoxIDEA.setImage((Bitmap)resources.getObject("pictureBoxIDEA_image"));
 
 
 
                richEditBegin.
setBackColor(new Color(153, 
77, 
0)); 
                richEditBegin.setEnabled(false);
 
                richEditBegin.
setFont(new Font("宋体", 16.0f
)); 
                richEditBegin.
setForeColor(new Color(204, 
255, 
51)); 
                richEditBegin.
setLocation(new Point(8, 
0)); 
                richEditBegin.
setSize(new Point(32, 
200)); 
                richEditBegin.setTabIndex(1);
 
                richEditBegin.setText("请点击开始按钮");
 
                richEditBegin.setBorderStyle(BorderStyle.NONE);
 
 
 
                richEditzhuyi.
setBackColor(new Color(153, 
77, 
0)); 
                richEditzhuyi.setEnabled(false);
 
                richEditzhuyi.
setFont(new Font("宋体", 9.0f, FontSize.
POINTS, FontWeight.
NORMAL, 
false, 
false, 
false, CharacterSet.
DEFAULT, 
0)); 
                richEditzhuyi.
setForeColor(new Color(204, 
255, 
51)); 
                richEditzhuyi.
setLocation(new Point(8, 
208)); 
                richEditzhuyi.
setSize(new Point(96, 
304)); 
                richEditzhuyi.setTabIndex(2);
 
                richEditzhuyi.setText("注意:      输入框内只能输入数字0到9和字母A到F,字母为大写。输入其余不符合上述条件的字符本软件均报错误。输入完毕后请点击右边的加脱密按钮即可开始运算。务必不要使用按下回车键来代替按下按钮,如使用了回车键,请将因为按下回车键产生的最后两位字符删去。");
 
                richEditzhuyi.setBorderStyle(BorderStyle.NONE);
 
 
 
                this.
setNewControls(new Control[] {  
                                                        panelIDEA, 
 
                                                        labelIDEAResult, 
 
                                                        labelIDEAKResult, 
 
                                                        richEditIDEAKResult, 
 
                                                        labelIDEACheckInputK, 
 
                                                        richEditIDEAResult, 
 
                                                        buttonIDEACalculate, 
 
                                                        labelIDEACheckInputMorC, 
 
                                                        comboBoxIDEAChangeDataFillType, 
 
                                                        buttonIDEAChangeDataFillType, 
 
                                                        labelIDEAChangeDataFillType, 
 
                                                        labelIDEADataFillType, 
 
                                                        richEditIDEAInputK, 
 
                                                        labelIDEAKlength, 
 
                                                        labelIDEAMorClength, 
 
                                                        richEditIDEAInputMorC, 
 
                                                        labelIDEAInputK, 
 
                                                        labelIDEAInputMorC, 
 
                                                        labelIDEAInstruction});
 
                panelIDEA.
setNewControls(new Control[] { 
                                                                 richEditzhuyi, 
 
                                                                 richEditBegin, 
 
                                                                 pictureBoxIDEA});
 
        }
 
 
 
        /**
 
         * The main entry point for the application. 
 
         *
 
         * @param args Array of parameters passed to the application
 
         * via the command line.
 
         */
 
        public static void main
(String args
[])  
        {
 
                Application.run(new FormIDEAwindow());
 
        }
 
}