【Java代码】古典密码算法——矩阵换位密码(PermutationCipher)

贴代码记录一下,也欢迎学习参考~

一、算法背景

· 置换密码
       置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密。置换密码也叫换位密码。
       本例实现的是矩阵换位密码。它的加密方法是将明文中的字母按照给定的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中的字母,形成密文。例如,明文为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中的实现
有不正确之处,欢迎指正~

  • 6
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值