维吉尼亚密码java代码实现根据密钥长度计算IC值过程

package cn.longxuzi;

import java.util.Scanner;

import org.junit.Test;

public class ICUtils {

      /**

       * @author龙须子(XuziLong)

       * @param null

       * @return String [][]devideCipherText

       * @Date 2013-11-20 PM 19:00

       */

      public String[][] devideCipherText() {

           // 根据密钥长度将密文分解成密钥长度个小组

           String[][] str;

           System.out.println("请输入密文字符串(以回车键结束)");

           Scanner sc = new Scanner(System.in);

           String ciphertext = sc.nextLine().toUpperCase().trim();

           System.out.println("请输入密钥长度(以回车键结束)");

           int keyLength = sc.nextInt();

           // 计算每一组最多有多少个字母

           int amount = 0;

           if (ciphertext.length() % keyLength == 0) {

                 amount = ciphertext.length() / keyLength;

           } else {

                 amount = (ciphertext.length() / keyLength) + 1;

           }

           // 初始化存储分开组的密文的字符串数组

           str = new String[keyLength][amount];

           int flag = 0, i = 0;

           for (int j = 0; j < keyLength; j++) {

                 for (int k = 0; k < amount; k++) {

                      if (i + 1 > ciphertext.length()) {

                            break;

                      }

                      str[j][k] = ciphertext.substring(i, i + 1);

                      i = i + keyLength;

                 }

                 i = flag + 1;

                 flag++;

           }

           return str;

      }

 

      /**

       * @author龙须子(XuziLong)

       * @param String

       *            [][]

       * @return double Every[]IC value

       * @Date 2013-11-20 PM 19:23

       */

      public double[] getIC(String[][] str) {

           // 计算每一小组密文的IC值

           double[] IC = new double[str.length];

           char[] letter = { 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,

                      78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90 };// 创建字母表数组

           int[][] sum = new int[str.length][letter.length];// 创建存放每个密文小组中每个字母出现次数的数组

           int count = 0;// 计数器

           for (int i = 0; i < str.length; i++) {

                 for (int j = 0; j < letter.length; j++) {

                      for (int k = 0; k < str[0].length; k++) {

                            if (String.valueOf(letter[j]).toUpperCase()

                                       .equals(str[i][k])) {

                                  count++;

                            }

                      }

                      sum[i][j] = count;

                      count = 0;

                 }

           }

           double[] result = new double[IC.length];

           for (int j = 0; j < str.length; j++) {

                 for (int k = 0; k < letter.length; k++) {

                      if (sum[j][k] != 0) {

                            result[j] += sum[j][k] * (sum[j][k] - 1);

                      }

                 }

           }

           double N = (double) (str.length * str[0].length);

           for (int j = 0; j < IC.length; j++) {

                 IC[j] = (double) (result[j] / (N * (N - 1)));

           }

           return IC;

      }

 

      /**

       * @author龙须子(XuziLong)

       * @param double[]IC

       * @return double average []IC

       * @Date 2013-11-21 PM 19:23

       */

      public double getAverageIC(double[] IC) {

           // 计算所有密文小组IC的平均值

           double result = 0;

           for (int i = 0; i < IC.length; i++) {

                 result += IC[i];

           }

           return result / (double) (IC.length);

      }

    //以下是求每一个密文小组IC值及分组情况的测试代码

     

      @Test

      public void tests() {

           while (true) {

                 ICUtils tes = new ICUtils();

                 String[][] str = tes.devideCipherText();

                 for (int i = 0; i < str.length; i++) {

                      System.out.print("第" + (i + 1) + "小组的密文字母串为:");

                      for (int k = 0; k < str[0].length; k++) {

                            if (str[i][k] == null) {

                                  str[i][k] = "";

                            }

                            System.out.print(str[i][k]);

                      }

                      System.out.println();

                 }

                 double[] ic = tes.getIC(str);

                 for (int j = 0; j < ic.length; j++) {

                      System.out.println("该小组密文的IC值为:" + ic[j]);

                 }

                 System.out.println("本次分组中IC的平均值为:"

                            + tes.getAverageIC(tes.getIC(str)));

           }

      }

     

}

posted @ 2013-11-24 16:30  龙须子  阅读(1256)  评论(0编辑  收藏  举报