维吉尼亚密码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)));
}
}
}
维吉尼亚密码java代码实现根据密钥长度计算IC值过程的更多相关文章
- 维吉尼亚密码java完整版
package cn.longxuzi; import org.junit.Test; public class Chi_SquareUtils { private static final ICUt ...
- 维吉尼亚密码-攻防世界(shanghai)
维吉尼亚密码 维吉尼亚密码是使用一系列 凯撒密码 组成密码字母表的加密算法,属于多表密码的一种简单形式. 加密原理 维吉尼亚密码的前身,是我们熟悉的凯撒密码. 凯撒密码的加密方式是依靠一张字母表中的每 ...
- [CTF]维吉尼亚密码(维基利亚密码)
[CTF]维吉尼亚密码(维基利亚密码) ----------------------百度百科 https://baike.baidu.com/item/维吉尼亚密码/4905472?fr=aladdi ...
- Vigenère Cipher 维吉尼亚加解密算法
维吉尼亚的加解密有两种方法. 第一种是查表:第一行为明文,第一列为密钥,剩余的为对应的密文 第二种方法是转化计算法:逐个将字符转化为从零开始的数字,对数字进行加密/解密后,再转化为字符. 本文要用c+ ...
- [加密]C#实现维吉尼亚加密与解密(解密前提为已知密匙)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 随机练习:C#实现维吉尼亚加密与解密(解密前提为已知密匙)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- python 维吉尼亚
加密key='COMPUTER' plaintext='BLOCKCIPHERDESIGNPRINCIPLE' ascii='abcdefghijklmnopqrstuvwxyz'.upper() k ...
- python实现维吉尼亚解密
# -*-coding:UTF-8-*- from sys import stdout miwen = "KCCPKBGUFDPHQTYAVINRRTMVGRKDNBVFDETDGILTXR ...
- JAVA代码根据经纬度范围计算WGS84与谷歌全球墨卡托包含的切片数目与拼接图像像素尺寸
根据项目需求编写的代码. 适用场景:在网络地图上,比如天地图与谷歌地图,用户用鼠标在地图上拉一个矩形框,希望下载该矩形框内某一层级的瓦片数据,并将所有瓦片拼接成一个完整的,包含地理坐标的tif图像. ...
随机推荐
- php——SoapClient访问webservice
原文:php--SoapClient访问webservice 通过SoapClient调用天气预报 <?phpheader ( "Content-Type: text/html; ch ...
- SQL Server 2008 R2中,变表的右键弹出菜单中的“选择前1000行”为“选择所有行”
原文:SQL Server 2008 R2中,变表的右键弹出菜单中的"选择前1000行"为"选择所有行" 从SQL Server 2008开始,微软为了提高查询 ...
- C#-利用ZPL语言完毕条形码的生成和打印
近期由于公司项目的须要,研究了一项对我来说算是新的技术-条形码的生成和打印.由于之前没有接触过这方面的知识,所以刚開始还有点小迷茫和小兴奋,只是一步一步来,问题总会解决的.如今来总结一下做条形码 ...
- 轻量级IOC框架Guice
java轻量级IOC框架Guice Guice是由Google大牛Bob lee开发的一款绝对轻量级的java IoC容器.其优势在于: 速度快,号称比spring快100倍. 无外部配置(如需要使用 ...
- Node.js连接MySQL数据库及构造JSON的正确姿势
做一下整理,以前也很随意的引入包链接数据库,后来发现常常连接出问题,异常退出,后来使用在网上一个方法解决问题,网址由于书签丢失,抱歉不能引用了.再有就是简单的模块化下,使得目录合理点,再有就是说明一下 ...
- APUE学习笔记(2):lseek()练习与文件洞
对于lseek函数早在大一的C语言课上就有接触,但是几乎没有使用过,只记得是和文件偏移操作相关的 看了APUE上的示例,又使用od工具查看了内容,果然很神奇,很新鲜 figure3.2.c [c] # ...
- LINQ TO SQL ——Group by
原文:LINQ TO SQL --Group by 分组在SQL中应用的十分普遍,在查询,统计时都有可能会用到它.LINQ TO SQL中同样具备group的功能,这篇我来讲下LINQ TO SQL中 ...
- rem测试用实现移动端自适应页面
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 【转】GitHub 优秀的 Android 开源项目
转自:http://blog.csdn.net/shulianghan/article/details/18046021 主要介绍那些不错个性化的View,包括ListView.ActionBar.M ...
- AngularJs ng-repeat 必须注意的性能问题
AngularJs 的 ng-repeat 让我们非常方便的遍历数组生成 Dom 元素,但是使用不当也会有性能问题. 在项目中我们使用 ng-repeat 加载完一个列表后,如果再次请求数据,然后过滤 ...