您的位置:首页 > 其它

(4)简单置换

2016-03-28 10:31 99 查看
置换技术



密钥即为置换和逆置换。

置换为:[2,7,4,6,1,3,5](2表示当前位置用第2个字母置换,其他类推)

逆置换为:[5,1,6,3,7,4,2]

import java.util.ArrayList;
import java.util.List;

/**
* 置换加密技术,密钥为置换和逆置换
* 通过根据置换表改变明文字符串的排列顺序
* @author Angela
*/
public class Displace {

/**
* 得到逆置换
* @param K 置换表
* @return 逆置换表
*/
public static int[] reverseK(int[] K){
int len=K.length;
int[] key=new int[len];
List<Integer> list=new ArrayList<Integer>();
for(int k: K){
list.add(k);
}
for(int i=0;i<len;i++){
key[i]=list.indexOf(i+1)+1;//List第一个下标是0
}
return key;
}

/**打印密钥**/
public static void printK(int[] K){
for(int i=0;i<K.length;i++)
System.out.print(K[i]+" ");
System.out.println();
}

/**
* 根据密钥,改变字符串的排列顺序,
* 可以对明文进行加密(K为置换表),
* 或对密文进行解密(K为逆置换表)
* @param str 字符串
* @param keys 密钥
* @return
*/
public static String displace(String str,int[] keys){
str=str.replaceAll(" ","").toLowerCase();//去除空格,并转换成小写
StringBuilder sb=new StringBuilder();
for(int key: keys){
sb.append(str.charAt(key-1));//字符串第一个下标是0
}
return sb.toString();
}

/**测试**/
public static void main(String args[]){
//String P="number2";
String P="I am very glad";
//2表示当前位置用第2个字母置换,其他类推
//int[] K={2,7,4,6,1,3,5};
int[] K={2,5,6,10,4,1,9,3,11,8,7};
String C=displace(P,K);
System.out.println("密文:"+C);
int[] rkey=reverseK(K);
System.out.print("逆置换:");
printK(rkey);
System.out.println("明文:"+displace(C,rkey));
}
}


运行结果:

密文:aeravilmdgy

逆置换:6 1 8 5 2 3 11 10 7 4 9

明文:iamveryglad
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: