java实现列置换密码

package Demo_01;

public class Cipher_Main {
	public static void main(String[] args) {

	//明文
	String p = "Beijing2008OlympicGames";
	//秘钥
	int[][] key = {{1,4,3},{5,6}};	

	String cip =permutationCipher.run(p, key);
	System.out.println(cip);

	int[][] rekey = decryptKey.run(key);

	String cy =permutationCipher.run(cip, rekey);

	System.out.println(cy);

	}

}

package Demo_01;

public class permutationCipher {
	public static String run(String p,int[][] key) {

//		//明文
//		String p = "Beijing2008OlympicGames";
//
//		//秘钥
//		int[][] key = {{1,4,3},{5,6}};

		//得到最大列
		int column = key[key.length-1][(key[key.length-1].length)-1];

		//得到最大行
		int row = calcRow(p,column);

		//通过key得到一维加密数组,方便后续加密
		int[] keyArry = calcKeyArry(key);

		//生成明文p矩阵
		char[][]Mp = calcMp(p,column,row);

		//生成密文矩阵
		char[][]Mk = transposition(Mp,keyArry);

		//密文
		String cip = "";
				for(char[] xd :Mk){
					for(char xc :xd){
						cip+=xc;
					}
				}
		return cip;
	}

	//生成密文矩阵
	private static char[][] transposition(char[][] mp, int[] keyArry) {
		char[][] newmp = new char[mp.length][mp[0].length];
		for (int i = 1; i < keyArry.length; i++) {
			for (int j = 0; j < mp.length; j++) {
				newmp[j][i-1]=mp[j][(keyArry[i])-1];
			}
		}
		return newmp;
	}

	//生成明文矩阵
	private static char[][] calcMp(String p, int column, int row) {
		char[][] Mp = new char [row][column];
		char[] c = p.toCharArray();
		for(int i=0, j=0, k=0; i<c.length ;i++){
			Mp[j][k] = c[i];
			k++;
			if(k==column){
				j++;
				k=0;
			}
		}
		return Mp;
	}

	//为rekey赋值 , rekey下标为被置换的列 ,值为要置换到的列,rekey[0]=0
	private static int[] calcKeyArry(int[][] key) {
		int[] rekey = new int[key[key.length-1][(key[key.length-1].length)-1]+1];

		//两层循环遍历key
		for(int a[]: key){
			for(int i = 0 ; i<=a.length-1; i++){

					//判断是否为最后一个,若是值为第一个,否为下一个
					if(i==a.length-1){
						rekey[a[i]] = a[0];
					}else{
						rekey[a[i]]=a[i+1];
					}
			}
		}

		//不用置换的
		for(int i = 0 ; i<=rekey.length-1; i++){
			if(rekey[i]==0){
				rekey[i] = i;
			}
		}
		return rekey;
	}

	//计算最大列
	private static int calcRow(String p, int column) {
		char[] a = p.toCharArray();
		int b = a.length;
		int c;
		if(b%column==0){
			c = b/column;
		}else{
			c = (b/column)+1;

		}
		return c;
	}

}

package Demo_01;

public class decryptKey {
	public static int[][] run(int[][] key){

		//待续...........
		int[][] rekey = new int[key.length][];
		return rekey;

	}
}
时间: 2024-10-13 12:32:39

java实现列置换密码的相关文章

java 散列与散列码探讨 ,简单HashMap实现散列映射表执行各种操作示列

package org.rui.collection2.maps; /** * 散列与散列码 * 将土拔鼠对象与预报对象联系起来, * @author lenovo * */ //土拨鼠 public class Groundhog { protected int number; public Groundhog(int n) { number=n; } @Override public String toString() { return "Groundhog #" + number

JAVA双列集合HashMap

HashMap 双列集合HashMap是属于java集合框架3大类接口的Map类,   Map接口储存一组成对的键-值对象,提供key(键)到value(值)的映射.Map中的key不要求有序,不允许重复.value同样不要求有序,但允许重复. Iterator接口是负责定义访问和遍历元素的接口 1. 使用Iterator迭代器缺点: 1. ListIterator有add()方法,可以向List中添加对象,而Iterator不能 2. ListIterator和Iterator都有hasNex

java 散列与散列码探讨 ,简单HashMap实现散列映射表运行各种操作示列

package org.rui.collection2.maps; /** * 散列与散列码 * 将土拔鼠对象与预报对象联系起来, * @author lenovo * */ //土拨鼠 public class Groundhog { protected int number; public Groundhog(int n) { number=n; } @Override public String toString() { return "Groundhog #" + number

Java散列和散列码的实现

转自:https://blog.csdn.net/al_assad/article/details/52989525 散列和散列码 ※正确的equals方法应该满足的的条件: ①自反性:x.equals(x) 一定返回true: ②对称性:y.euqlas(x)为true,那么x.equals(y)一定为true: ③传递性:x.equals(y)为true,y.euqlas(z)为true,则z.equals(x)为true: ④一致性:如果x,y中用于等价比较的信息没有变化,那么无论调用y.

java 散列运算浅分析 hash()

        文章部分代码图片和总结来自参考资料 哈希和常用的方法 散列,从中文字面意思就很好理解了,分散排列,我们知道数组地址空间连续,查找快,增删慢,而链表,查找慢,增删快,两者结合起来形成散列表.如下图. 常见的hash 散列方法有 : 直接定址法:直接以关键字k或者k加上某个常数(k+c)作为哈希地址. 数字分析法:提取关键字中取值比较均匀的数字作为哈希地址.(ThreadLocalMap中取的斐波那契数列数 0x61c88647 ) 除留余数法:用关键字k除以某个不大于哈希表长度m的

数据结构与算法分析java——散列

1. 散列的概念 散列方法的主要思想是根据结点的关键码值来确定其存储地址:以关键码值K为自变量,通过一定的函数关系h(K)(称为散列函数),计算出对应的函数值来,把这个值解释为结点的存储地址,将结点存入到此存储单元中.检索时,用同样的方法计算地址,然后到相应的单元里去取要找的结点.通过散列方法可以对结点进行快速检索.散列(hash,也称“哈希”)是一种重要的存储方式,也是一种常见的检索方法. 按散列存储方式构造的存储结构称为散列表(hash table).散列表中的一个位置称为槽(slot).散

Java实列 酒店订房管理系统

======思路====== 查看 ======实现======查看 ======代码====== import java.util.Scanner; public class Reception { public static void main(String[] args) { //首先来一条友善的系统名称 System.out.println("********************东方国际大酒店管理系统*************************"+"\t\n

浅析Java web程序之客户端和应用服务器端交互原理

最近一直在思考一个问题,为什么在用struts框架开发的时候FormBean都需要序列化,即实现java.io.Serializable接口,本着勤学好问的精神我Google了下对象序列化方面的文章,虽然大体了解了怎么做,但是还是没有搞清楚为什么要这样做:最后我想解决一个问题要找问题的根源和本质,于是从web程序客户端和服务器端交互的原理入手,终于找到了我要的答案. 1. 对象序列化是什么东东? 简单地说,Java对象列化就是要把内存中的Java对象保存下来(持久化),以便可以在网络上传输或今后

Java 理论与实践: 哈希

有效和正确定义hashCode()和equals() 每个Java对象都有 hashCode() 和 equals() 方法.许多类 Override 这些方法的缺省实施,以在对象实例之间提供更深层次的语义可比性.在 Java理念和实践这一部分,Java开发人员Brian Goetz向您介绍在创建Java类以有效和准确定义 hashCode() 和 equals() 时应遵循的规则和指南. 虽然Java语言不直接支持关联数组 -- 可以使用任何对象作为一个索引的数组 -- 但在根 Object