`

Java对称加密编码:IDEA

阅读更多
  1. 原作者:http://jatula.iteye.com/blog/315449
  2. package  cn.lake.util;  
  3.   
  4. /**  
  5.  * Java对称加密编码:IDEA  
  6.  *   
  7.  * @author lake_xie  
  8.  *   
  9.  */   
  10. class  IDEADemo {  
  11.   
  12.     /* 源数据 */   
  13.     private   byte  m_string[];  
  14.     /* 目标数据 */   
  15.     private   byte  c_string[];  
  16.     /* 密钥 */   
  17.     private   byte  k_string[];  
  18.     /* 数据块 1, 2, 3, 4 */   
  19.     private   char  X1, X2, X3, X4;  
  20.     /* 加密子密钥 */   
  21.     private   char  Z[];  
  22.     /* 解密子密钥 */   
  23.     private   char  Z_1[];  
  24.     /*   */   
  25.     private   char  temp1, temp2, temp3, temp4, temp5;  
  26.     private   char  temp6, temp7, temp8, temp9, temp10;  
  27.   
  28.     /* 初始化 */   
  29.     IDEADemo() {  
  30.         m_string = new   byte [ 8 ];  
  31.         c_string = new   byte [ 8 ];  
  32.         k_string = new   byte [ 16 ];  
  33.         Z = new   char [ 53 ];  
  34.         Z_1 = new   char [ 53 ];  
  35.     }  
  36.   
  37.     /*   */   
  38.     private   char  inv( char  x) {  
  39.         char  t0, t1, q, y;  
  40.         if  (x <=  1 )  
  41.             return  x;  /* 0 and 1 are self-inverse */   
  42.         t1 = (char ) ( 0x10001  / x);  
  43.         /* Since x >= 2, this fits into 16 bits */   
  44.         y = (char ) ( 0x10001  % x);  
  45.         if  (y ==  1 )  
  46.             return  ( char ) ( 1  - t1);  
  47.         t0 = 1 ;  
  48.         do  {  
  49.             q = (char ) (x / y);  
  50.             x = (char ) (x % y);  
  51.             t0 += (char ) (q * t1);  
  52.             if  (x ==  1 )  
  53.                 return  t0;  
  54.             q = (char ) (y / x);  
  55.             y = (char ) (y % x);  
  56.             t1 += (char ) (q * t0);  
  57.         } while  (y !=  1 );  
  58.         return  ( char ) ( 1  - t1);  
  59.     }  
  60.   
  61.     /*   */   
  62.     private   char  multiply( char  input1,  char  input2) {  
  63.         long  p = input1 * input2;  
  64.         if  (p ==  0 )  
  65.             input2 = (char ) ( 65537  - input1 - input2);  
  66.         else  {  
  67.             input1 = (char ) (p >>  16 );  
  68.             input2 = (char ) p;  
  69.             input1 = (char ) (input2 - input1);  
  70.   
  71.             if  (input2 < input1)  
  72.                 input1 += 65537 ;  
  73.         }  
  74.         return  input1;  
  75.     }  
  76.   
  77.     /*   */   
  78.     private   void  Separate_m_2_X() {  
  79.         // 本函数的目的是从m string中得到X1,X2,X3,X4   
  80.         // get X1,X2,X3,X4 from m string   
  81.         char  temp;  
  82.   
  83.         X1 = (char ) m_string[ 0 ];  
  84.         X1 <<= 8 ;  
  85.         temp = (char ) m_string[ 1 ];  
  86.         temp &= 0xFF ;  
  87.         X1 |= temp;  
  88.   
  89.         X2 = (char ) m_string[ 2 ];  
  90.         X2 <<= 8 ;  
  91.         temp = (char ) m_string[ 3 ];  
  92.         temp &= 0xFF ;  
  93.         X2 |= temp;  
  94.   
  95.         X3 = (char ) m_string[ 4 ];  
  96.         X3 <<= 8 ;  
  97.         temp = (char ) m_string[ 5 ];  
  98.         temp &= 0xFF ;  
  99.         X3 |= temp;  
  100.   
  101.         X4 = (char ) m_string[ 6 ];  
  102.         X4 <<= 8 ;  
  103.         temp = (char ) m_string[ 7 ];  
  104.         temp &= 0xFF ;  
  105.         X4 |= temp;  
  106.     }  
  107.   
  108.     /**  
  109.      * 设置密钥  
  110.      *   
  111.      * @param input_k_string  
  112.      *            input the 128bit key(16 byte)  
  113.      * @return No return value  
  114.      */   
  115.     void  Set_k( byte [] input_k_string) {  
  116.         // 本函数的目的是设置密钥   
  117.         for  ( int  i =  0 ; i <=  15 ; i++)  
  118.             k_string[i] = input_k_string[i];  
  119.     }  
  120.   
  121.     /**  
  122.      * 加密用子密钥运算  
  123.      *   
  124.      * @param No  
  125.      *            param  
  126.      * @return No return value  
  127.      */   
  128.     void  Creat_encrypt_sub_k() {  
  129.         // 本函数的目的是生成加密子密钥   
  130.         // creat encrypt sub key and store to Z[57]   
  131.         char  temp;  
  132.         byte  temp1, temp2, temp3;  
  133.         int  i;  
  134.         int  num;  
  135.         for  (num =  0 ; num <=  6 ; num++) {  
  136.             Z[1  + num *  8 ] = ( char ) k_string[ 0 ];  
  137.             Z[1  + num *  8 ] <<=  8 ;  
  138.             temp = (char ) k_string[ 1 ];  
  139.             temp = (char ) (temp &  0x00FF );  
  140.             Z[1  + num *  8 ] |= temp;  
  141.   
  142.             Z[2  + num *  8 ] = ( char ) k_string[ 2 ];  
  143.             Z[2  + num *  8 ] <<=  8 ;  
  144.             temp = (char ) k_string[ 3 ];  
  145.             temp = (char ) (temp &  0x00FF );  
  146.             Z[2  + num *  8 ] |= temp;  
  147.   
  148.             Z[3  + num *  8 ] = ( char ) k_string[ 4 ];  
  149.             Z[3  + num *  8 ] <<=  8 ;  
  150.             temp = (char ) k_string[ 5 ];  
  151.             temp = (char ) (temp &  0x00FF );  
  152.             Z[3  + num *  8 ] |= temp;  
  153.   
  154.             Z[4  + num *  8 ] = ( char ) k_string[ 6 ];  
  155.             Z[4  + num *  8 ] <<=  8 ;  
  156.             temp = (char ) k_string[ 7 ];  
  157.             temp = (char ) (temp &  0x00FF );  
  158.             Z[4  + num *  8 ] |= temp;  
  159.             if  (num !=  6 ) {  
  160.                 Z[5  + num *  8 ] = ( char ) k_string[ 8 ];  
  161.                 Z[5  + num *  8 ] <<=  8 ;  
  162.                 temp = (char ) k_string[ 9 ];  
  163.                 temp = (char ) (temp &  0x00FF );  
  164.                 Z[5  + num *  8 ] |= temp;  
  165.             }  
  166.             if  (num !=  6 ) {  
  167.                 Z[6  + num *  8 ] = ( char ) k_string[ 10 ];  
  168.                 Z[6  + num *  8 ] <<=  8 ;  
  169.                 temp = (char ) k_string[ 11 ];  
  170.                 temp = (char ) (temp &  0x00FF );  
  171.                 Z[6  + num *  8 ] |= temp;  
  172.             }  
  173.             if  (num !=  6 ) {  
  174.                 Z[7  + num *  8 ] = ( char ) k_string[ 12 ];  
  175.                 Z[7  + num *  8 ] <<=  8 ;  
  176.                 temp = (char ) k_string[ 13 ];  
  177.                 temp = (char ) (temp &  0x00FF );  
  178.                 Z[7  + num *  8 ] |= temp;  
  179.             }  
  180.             if  (num !=  6 ) {  
  181.                 Z[8  + num *  8 ] = ( char ) k_string[ 14 ];  
  182.                 Z[8  + num *  8 ] <<=  8 ;  
  183.                 temp = (char ) k_string[ 15 ];  
  184.                 temp = (char ) (temp &  0x00FF );  
  185.                 Z[8  + num *  8 ] |= temp;  
  186.             }  
  187.   
  188.             // now,start to left move 25 bit   
  189.             // first left move 24 bit   
  190.             temp1 = k_string[0 ];  
  191.             temp2 = k_string[1 ];  
  192.             temp3 = k_string[2 ];  
  193.             for  (i =  0 ; i <=  12 ; i++)  
  194.                 k_string[i] = k_string[i + 3 ];  
  195.             k_string[13 ] = temp1;  
  196.             k_string[14 ] = temp2;  
  197.             k_string[15 ] = temp3;  
  198.   
  199.             // then left move 1 bit,sum 25 bit   
  200.             byte  store_bit[] =  new   byte [ 16 ];  // store k_strings first bit.   
  201.             for  (i =  15 ; i >=  0 ; i--) {  
  202.                 // from high bit to low   
  203.                 store_bit[i] = (byte ) (k_string[i] >>  7 );  
  204.                 store_bit[i] &= 0x01 ;  
  205.                 k_string[i] <<= 1 ;  
  206.                 if  (i !=  15 )  
  207.                     k_string[i] += store_bit[i + 1 ];  
  208.             }  
  209.             k_string[15 ] += store_bit[ 0 ];  
  210.             // complete to left move 25 bit   
  211.         } // All encrypt sub key created   
  212.     }  
  213.   
  214.     /**  
  215.      * 解密子密钥计算  
  216.      *   
  217.      * @param No  
  218.      *            param  
  219.      * @return No return value  
  220.      */   
  221.     void  Creat_decrypt_sub_k() {  
  222.         // 本函数的目的是生成解密子密钥   
  223.         Z_1[1 ] = inv(Z[ 49 ]);  
  224.         Z_1[2 ] = ( char ) ( 0  - Z[ 50 ]);  
  225.         Z_1[3 ] = ( char ) ( 0  - Z[ 51 ]);  
  226.         Z_1[4 ] = inv(Z[ 52 ]);  
  227.         Z_1[5 ] = ( char ) (Z[ 47 ]);  
  228.         Z_1[6 ] = Z[ 48 ];  
  229.   
  230.         for  ( int  i =  1 ; i <=  7 ; i++) {  
  231.             Z_1[1  + i *  6 ] = inv(Z[ 49  - i *  6 ]);  
  232.             Z_1[2  + i *  6 ] = ( char ) ( 0  - Z[ 51  - i *  6 ]);  
  233.             Z_1[3  + i *  6 ] = ( char ) ( 0  - Z[ 50  - i *  6 ]);  
  234.             Z_1[4  + i *  6 ] = inv(Z[ 52  - i *  6 ]);  
  235.             Z_1[5  + i *  6 ] = Z[ 47  - i *  6 ];  
  236.             Z_1[6  + i *  6 ] = Z[ 48  - i *  6 ];  
  237.         }  
  238.         Z_1[49 ] = inv(Z[ 1 ]);  
  239.         Z_1[50 ] = ( char ) ( 0  - Z[ 2 ]);  
  240.         Z_1[51 ] = ( char ) ( 0  - Z[ 3 ]);  
  241.         Z_1[52 ] = inv(Z[ 4 ]);  
  242.     }  
  243.   
  244.     /**  
  245.      * 设置源数据  
  246.      *   
  247.      * @param input_m_string  
  248.      *            input the source data to be processed  
  249.      * @return No return value  
  250.      */   
  251.     void  Set_m( byte [] input_m_string) {  
  252.         // 本函数的目的是设置源数据   
  253.         for  ( int  i =  0 ; i <=  7 ; i++)  
  254.             m_string[i] = input_m_string[i];  
  255.     }  
  256.   
  257.     /**  
  258.      * 加密运算  
  259.      *   
  260.      * @param No  
  261.      *            param  
  262.      * @return No return value  
  263.      */   
  264.     void  Encrypt() {  
  265.         // 本函数的目的是加密   
  266.   
  267.         // 把m分成X1,X2,X3,X4   
  268.         Separate_m_2_X();  
  269.   
  270.         // 下面做8圈叠代   
  271.         for  ( int  num =  0 ; num <=  7 ; num++) {  
  272.             temp1 = multiply(Z[1  + num *  6 ], X1);  // 1   
  273.             temp2 = (char ) (X2 + Z[ 2  + num *  6 ]);  // 2   
  274.             temp3 = (char ) (X3 + Z[ 3  + num *  6 ]);  // 3   
  275.             temp4 = multiply(Z[4  + num *  6 ], X4);  // 4   
  276.             temp5 = (char ) (temp1 ^ temp3);  // 5   
  277.             temp6 = (char ) (temp2 ^ temp4);  // 6   
  278.             temp7 = multiply(Z[5  + num *  6 ], temp5);  // 7   
  279.             temp8 = (char ) (temp7 + temp6);  
  280.             temp10 = multiply(Z[6  + num *  6 ], temp8);  
  281.             temp9 = (char ) (temp7 + temp10);  
  282.   
  283.             X1 = (char ) (temp1 ^ temp10);  
  284.             if  (num !=  7 ) {  
  285.                 X2 = (char ) (temp3 ^ temp10);  
  286.                 X3 = (char ) (temp2 ^ temp9);  
  287.             } else  {  
  288.                 X2 = (char ) (temp2 ^ temp9);  
  289.                 X3 = (char ) (temp3 ^ temp10);  
  290.             }  
  291.             X4 = (char ) (temp4 ^ temp9);  
  292.         } // end of 8 times   
  293.   
  294.         // 输出变换   
  295.         X1 = multiply(Z[49 ], X1);  
  296.         X2 += Z[50 ];  
  297.         X3 += Z[51 ];  
  298.         X4 = multiply(Z[52 ], X4);  
  299.   
  300.         // 把X1,X2,X3,X4复制到c_string中。   
  301.         // now,creat c_string from X1..X4;   
  302.         c_string[1 ] = ( byte ) X1;  
  303.         c_string[0 ] = ( byte ) (X1 >>  8 );  
  304.         c_string[3 ] = ( byte ) X2;  
  305.         c_string[2 ] = ( byte ) (X2 >>  8 );  
  306.         c_string[5 ] = ( byte ) X3;  
  307.         c_string[4 ] = ( byte ) (X3 >>  8 );  
  308.         c_string[7 ] = ( byte ) X4;  
  309.         c_string[6 ] = ( byte ) (X4 >>  8 );  
  310.   
  311.         // end of encryption   
  312.     }  
  313.   
  314.     /**  
  315.      * 解密运算  
  316.      *   
  317.      * @param No  
  318.      *            param  
  319.      * @return No return value  
  320.      */   
  321.     void  Decrypt() {  // 本函数的目的是解密   
  322.   
  323.         // 把m分成X1,X2,X3,X4   
  324.         Separate_m_2_X();  
  325.   
  326.         // 下面做8圈叠代   
  327.         for  ( int  num =  0 ; num <=  7 ; num++) {  
  328.             temp1 = multiply(Z_1[1  + num *  6 ], X1);  // 1   
  329.             temp2 = (char ) (X2 + Z_1[ 2  + num *  6 ]);  // 2   
  330.             temp3 = (char ) (X3 + Z_1[ 3  + num *  6 ]);  // 3   
  331.             temp4 = multiply(Z_1[4  + num *  6 ], X4);  // 4   
  332.             temp5 = (char ) (temp1 ^ temp3);  // 5   
  333.             temp6 = (char ) (temp2 ^ temp4);  // 6   
  334.             temp7 = multiply(Z_1[5  + num *  6 ], temp5);  // 7   
  335.             temp8 = (char ) (temp7 + temp6);  
  336.             temp10 = multiply(Z_1[6  + num *  6 ], temp8);  
  337.             temp9 = (char ) (temp7 + temp10);  
  338.   
  339.             X1 = (char ) (temp1 ^ temp10);  
  340.             if  (num !=  7 ) {  
  341.                 X2 = (char ) (temp3 ^ temp10);  
  342.                 X3 = (char ) (temp2 ^ temp9);  
  343.             } else  {  
  344.                 X2 = (char ) (temp2 ^ temp9);  
  345.                 X3 = (char ) (temp3 ^ temp10);  
  346.             }  
  347.             X4 = (char ) (temp4 ^ temp9);  
  348.         } // end of 8 times   
  349.   
  350.         // 输出变换   
  351.         X1 = multiply(Z_1[49 ], X1);  
  352.         X2 += Z_1[50 ];  
  353.         X3 += Z_1[51 ];  
  354.         X4 = multiply(Z_1[52 ], X4);  
  355.   
  356.         // 把X1,X2,X3,X4复制到c_string中。   
  357.         // now,creat c_string from X1..X4;   
  358.         c_string[1 ] = ( byte ) X1;  
  359.         c_string[0 ] = ( byte ) (X1 >>  8 );  
  360.         c_string[3 ] = ( byte ) X2;  
  361.         c_string[2 ] = ( byte ) (X2 >>  8 );  
  362.         c_string[5 ] = ( byte ) X3;  
  363.         c_string[4 ] = ( byte ) (X3 >>  8 );  
  364.         c_string[7 ] = ( byte ) X4;  
  365.         c_string[6 ] = ( byte ) (X4 >>  8 );  
  366.         // end of decryption   
  367.     }  
  368.   
  369.     /**  
  370.      * 结果输出  
  371.      *   
  372.      * @param output_c_string  
  373.      *            output the result  
  374.      * @return No return value  
  375.      */   
  376.     void  Get_c( byte [] output_c_string) {  
  377.         // 本函数的目的是获得目标数据   
  378.         for  ( int  i =  0 ; i <=  7 ; i++)  
  379.             output_c_string[i] = c_string[i];  
  380.     }  
  381.   
  382.     public   static   void  main(String[] args) {  
  383.         int  i;  
  384.         IDEADemo demoTest = new  IDEADemo();  
  385.         byte [] m = {  1 2 3 4 5 6 7 8 9  };  
  386.         byte [] k = {  9 8 7 6 5 4 3 2 1 0 1 2 3 4 5 6  };  
  387.         byte [] c =  new   byte [ 8 ];  
  388.         demoTest.Set_k(k);  
  389.         demoTest.Creat_encrypt_sub_k();  
  390.         demoTest.Creat_decrypt_sub_k();  
  391.         System.out.println("密钥:" );  
  392.         for  (i =  0 ; i <=  15 ; i++)  
  393.             System.out.print(k[i]);  
  394.         System.out.println("" );  
  395.   
  396.         demoTest.Set_m(m);  
  397.         System.out.println("明文:" );  
  398.         for  (i =  0 ; i <=  7 ; i++)  
  399.             System.out.print(m[i]);  
  400.         System.out.println("" );  
  401.   
  402.         demoTest.Encrypt();  
  403.         demoTest.Get_c(c);  
  404.         System.out.println("密文:" );  
  405.         for  (i =  0 ; i <=  7 ; i++)  
  406.             System.out.print((int ) (c[i]) +  "   " );  
  407.         System.out.println("" );  
  408.   
  409.         demoTest.Set_m(c);  
  410.         demoTest.Decrypt();  
  411.         demoTest.Get_c(c);  
  412.         System.out.println("解密后明文:" );  
  413.         for  (i =  0 ; i <=  7 ; i++)  
  414.             System.out.print(c[i]);  
  415.         System.out.println("" );  
  416.   
  417.         System.out.println("hello!" );  
  418.     }  

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics