zoukankan      html  css  js  c++  java
  • 维吉尼亚密码java完整版

    package cn.longxuzi;

    import org.junit.Test;

    public class Chi_SquareUtils {

          private static final ICUtils icUtils = new ICUtils();

          /**

           * @author信息111李继华(LiJiHua)

           * @param String

           *            [][]ciphertext

           * @return null

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

           * @copyright李继华所有

           */

          @Test

          public void chi_square() {

               String[][] ciphertext = icUtils.devideCipherText();// 获取密文划分以后的每一小组的密文数组

               String[] freList = { "A=8.167", "B=1.492", "C=2.782", "D=4.253",

                          "E=12.702", "F=2.228", "G=2.015", "H=6.049", "I=6.996",

                          "J=0.153", "K=0.772", "L=4.025", "M=2.406", "N=6.749",

                          "O=7.507", "P=1.929", "Q=0.095", "R=5.987", "S=6.327",

                          "T=9.056", "U=2.758", "V=0.978", "W=2.360", "X=0.150",

                          "Y=1.974", "Z=0.074" };// 频率分布表构成的字符串数组

               int count = 0;// 计数器(计算每一个英文字母出现的次数)

               double index = 0;// 临时存储每一组密文的X^2得到的值

               double[] x = new double[ciphertext.length];// 创建存储每一组密文X值的double型数组容器

               int[][] sum1 = new int[ciphertext.length][freList.length];// 创建用来存储每一组每个英文字母出现的次数的整形数组容器

               double[][] sum2 = new double[ciphertext.length][freList.length];// 创建存储每一组每个密文字母的(C-E)/E值

               for (int i = 0; i < ciphertext.length; i++) {// 第一层循环遍历根据密钥长度分成的每一小组密文

                     for (int j = 0; j < freList.length; j++) {// 第二层循环遍历频率分布表中每个字母在每一小组密文中是否出现以及它们的频率

                          String flag = freList[j].substring(0, 1);// 临时存储取到的第J个英文字母

                          double E = Double.parseDouble(freList[j].substring(2,

                                      freList[j].length()));// 临时存储取到的第J个字母对应的频率值

                          for (int k = 0; k < ciphertext[0].length; k++) {// 第三层循环遍历每一个密文小组中每一个密文字母

                                if (flag.equals(ciphertext[i][k])) {// 根据字母表顺序依次判断每一个英文字母是否在密文小组中出现了

                                      count++;// 如果出现,开始计数每一个英文字母在小组密文字母表中总共出现的次数

                                }

                          }

                          sum1[i][j] = count;// 赋值给用来存储字母出现次数的数组容器

                          count = 0;// 计数器清零

                          double dis = (double) (sum1[i][j] - E);

                          sum2[i][j] = (dis * dis) / E;

                     }

               }

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

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

                          index += sum2[i][j];

                     }

                     x[i] = index;

                     index = 0;

                     System.out.println("第" + (i + 1) + "小组的X值为" + Math.sqrt(x[i]));

               }

          }

          // 以下是计算每一个密文小组X值的测试代码

          public static void main(String[] args) {

               while (true) {

                     Chi_SquareUtils ch = new Chi_SquareUtils();

                     ch.chi_square();

               }

          }

    }

  • 相关阅读:
    单例模式
    工厂方法模式
    简单工厂模式
    LoadRunner11.0下载及安装链接~(By网络)
    lombok 介绍及基本使用方法
    360浏览器拦截弹窗,window.open方式打不开新页面
    js生成二维码
    Filter过滤器的写法
    JavaScript获取浏览器类型与版本
    如何截取date类型的年月日部分?
  • 原文地址:https://www.cnblogs.com/ljhoracle/p/longxuzi.html
Copyright © 2011-2022 走看看