贴代码记录一下,也欢迎学习参考~
一、算法背景
· 置换密码
置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密。置换密码也叫换位密码。
本例实现的是矩阵换位密码。它的加密方法是将明文中的字母按照给定的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中的字母,形成密文。例如,明文为attack begins at five,密钥为cipher,将明文按照每行6 个字母的形式排在矩阵中,如下形式:
根据密钥cipher 中各字母在字母表中出现的先后顺序,给定一个置换:
根据上面的置换,将原有矩阵中的字母按照第1、4、5、3、2、6 的顺序排列,则有下列形式:
从而得到密文:aacttkbingesaivfte。
二、参考代码
import java.util.Arrays;
import java.util.Scanner;
public class permutationCipher {
static String key=null;
static String message=null;
static char[] messageArray=null;
static char[] keyArray=null;
static char[] keyArrayInOrder=null;
public static void main(String[] args) {
int choice=-1;
int flag=0;
while(flag==0) {
menu();
Scanner in2=new Scanner(System.in);
choice=in2.nextInt();
switch (choice) {
case 1:
code(choice);
break;
case 2:
code(choice);
break;
case 3:
flag++;
break;
default:
System.out.println("输入出错!");
break;
}
}
System.out.println("谢谢您的使用!");
}
public static void menu() {
System.out.println();
System.out.println();
System.out.println("***********PermutationCipher**********");
System.out.println(" "+"1.明文加密"+" "+"2.密文解密"+" "+"3.退出");
System.out.println("**************************************");
System.out.print("请选择菜单功能:");
}
public static void code(int choice){
int base=0;
int group;//矩阵行数(组数)
if(choice==1)
System.out.print("请输入明文:");
else
System.out.print("请输入密文:");
Scanner in1=new Scanner(System.in);
message=in1.nextLine();
System.out.print("请输入密钥:");
Scanner in2=new Scanner(System.in);
key=in2.nextLine();
keyArrayInOrder=key.toCharArray();
Arrays.sort(keyArrayInOrder);
keyArray=key.toCharArray();
for (int i=0;i<keyArray.length;i++) {//将输入的密钥转化为数字序号
for (int j=0;j<keyArrayInOrder.length;j++) {
if(keyArray[i]==keyArrayInOrder[j]) {
keyArray[i]=(char)(j+'0');
break;
}
}
}
message=message.replaceAll("\\s*", "");//清除message中的空格
message=message.toLowerCase();//转换为小写字母
group=(int)(Math.ceil(message.length()/(double)key.length()));//group为组数
messageArray=message.toCharArray();//将输入的信息转为字符数组保存
if(choice==1)
for (int i=0;i<group;i++) {
for (int j=0;j<keyArray.length;j++) {
if (base+Integer.parseInt(String.valueOf(keyArray[j]))<messageArray.length)
System.out.print(messageArray[base+Integer.parseInt(String.valueOf(keyArray[j]))]);
else
System.out.print("#");
}
base+=key.length();
}
if(choice==2) {
for(int i=0;i<group;i++) {
for(int j=0;j<keyArray.length;j++) {
for(int k=0;k<keyArray.length;k++) {
if(Integer.parseInt(String.valueOf(keyArray[k]))==j && messageArray[k+base]!='#'){
System.out.print(messageArray[k+base]);
break;
}
}
}
base+=key.length();
}
}
}
}
三、结果
以上就是矩阵换位密码在Java中的实现
有不正确之处,欢迎指正~