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)));

}

}

}

维吉尼亚密码java代码实现根据密钥长度计算IC值过程的更多相关文章

  1. 维吉尼亚密码java完整版

    package cn.longxuzi; import org.junit.Test; public class Chi_SquareUtils { private static final ICUt ...

  2. 维吉尼亚密码-攻防世界(shanghai)

    维吉尼亚密码 维吉尼亚密码是使用一系列 凯撒密码 组成密码字母表的加密算法,属于多表密码的一种简单形式. 加密原理 维吉尼亚密码的前身,是我们熟悉的凯撒密码. 凯撒密码的加密方式是依靠一张字母表中的每 ...

  3. [CTF]维吉尼亚密码(维基利亚密码)

    [CTF]维吉尼亚密码(维基利亚密码) ----------------------百度百科 https://baike.baidu.com/item/维吉尼亚密码/4905472?fr=aladdi ...

  4. Vigenère Cipher 维吉尼亚加解密算法

    维吉尼亚的加解密有两种方法. 第一种是查表:第一行为明文,第一列为密钥,剩余的为对应的密文 第二种方法是转化计算法:逐个将字符转化为从零开始的数字,对数字进行加密/解密后,再转化为字符. 本文要用c+ ...

  5. [加密]C#实现维吉尼亚加密与解密(解密前提为已知密匙)

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. 随机练习:C#实现维吉尼亚加密与解密(解密前提为已知密匙)

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  7. python 维吉尼亚

    加密key='COMPUTER' plaintext='BLOCKCIPHERDESIGNPRINCIPLE' ascii='abcdefghijklmnopqrstuvwxyz'.upper() k ...

  8. python实现维吉尼亚解密

    # -*-coding:UTF-8-*- from sys import stdout miwen = "KCCPKBGUFDPHQTYAVINRRTMVGRKDNBVFDETDGILTXR ...

  9. JAVA代码根据经纬度范围计算WGS84与谷歌全球墨卡托包含的切片数目与拼接图像像素尺寸

    根据项目需求编写的代码. 适用场景:在网络地图上,比如天地图与谷歌地图,用户用鼠标在地图上拉一个矩形框,希望下载该矩形框内某一层级的瓦片数据,并将所有瓦片拼接成一个完整的,包含地理坐标的tif图像. ...

随机推荐

  1. mysql utf8mb4与emoji表情

    一 什么是Emoji emoji就是表情符号:词义来自日语(えもじ,e-moji,moji在日语中的含义是字符) 表情符号现已普遍应用于手机短信和网络聊天软件. emoji表情符号,在外国的手机短信里 ...

  2. Android接口测试-JUnit入门

    1.下载:http://www.junit.org 2.配置AndroidManifest.xml,在application节点加入 <!--使用单元测试库-->        <u ...

  3. POJ 3624 Charm Bracelet 背包问题的解决方案

    最简单的背包问题,标题应该是除了背包测试中心:您无法打开二维数组.我还没有开的二维.光看数据是不可能的. 太大. 有两种方法来提高全省内存DP: 1 所谓卷的阵列 2 反向表 久没做背包DP,突然认为 ...

  4. 大数据时代:基于微软案例数据库数据挖掘知识点总结(Microsoft 聚类分析算法)

    原文:(原创)大数据时代:基于微软案例数据库数据挖掘知识点总结(Microsoft 聚类分析算法) 本篇文章主要是继续上一篇Microsoft决策树分析算法后,采用另外一种分析算法对目标顾客群体的挖掘 ...

  5. android application简要类(一)

    每次应用程序执行.应用application保持实例化的阶级地位.推而广之applicaiton类别,能够完成以下3长期工作: 1.至android应用级事件,如广播的实现中低声回应. 2.传递应用程 ...

  6. Android项目--获取系统通讯录列表

    ----------------- 通讯录列表 ----------------- 按常理来说,获取系统通讯录列表,无非就是将通讯录的数据库打开获取数据,适配,添加即可. Cursor cursor; ...

  7. Android项目--tabhost

    所有牵扯到自定义布局的layout中尽量用RelativeLayout 在通讯录中如果像小米手机的UI那就是viewpager,在这里,我们做成静态的.通过tabhost来做. 1.布局 a) 直接用 ...

  8. bash下几个替换运算符的区分

    bash下几个替换运算符的区分 2012-03-21 22:20:54 分类: Python/Ruby 一直对四个替换运算符比较的迷惑,分布太清楚,记下来避免再次遗忘:   ${name:-word} ...

  9. knockout同时绑定多个实体demo

    1.我们会遇到一种情景:一个页面实现复杂的功能时,我们往往会使用部分页(.netmvc中的@renderaction,java中ajax请求jsp页面). 如果子页面也使用knockout绑定数据会不 ...

  10. Domain Model(领域模型) 和 EntityFramework 如何正确进行对象关系映射?

    Domain Model(领域模型) 和 EntityFramework 如何正确进行对象关系映射? 写在前面 阅读目录: 设计误区 数据库已死 枚举映射 关联映射 后记 在上一篇<一缕阳光:D ...