【Java代码】古典密码算法——凯撒密码(CaesarCipher)

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

一、算法背景

· 替代密码
       替代密码算法的原理是使用替代法进行加密,就是对明文中的字符用其他字符替代后形成密文。例如,明文字母a, b, c, d, 用d, e, f , g 做对应替换后形成密文。替代密码包括多种类型,如单表替代密码,多表替代密码,多字母替代密码等
       本例实现的凯撒(Caesar)密码是一种典型的单表替代密码,其加密方法是将明文中的每个字母用此字符在字母表中后面的第k 个字母替代。它的加密过程可以表示为下面的函数:

E(k)=(m+k)modn

       其中,m 为明文字母在字母表中的位置数,n 为字母表中的字母个数,k 为密钥,E(k)
为密文字母在字母表中对应的位置数。


二、参考代码

import java.io.IOException;
import java.util.Scanner;

public class Caesar {
	static int ASCII;
	static char[] messageArray=null;
	static int i = 0;
	static int key=0;
	public static void main(String[] args) throws IOException {
		int choice=-1;
		int flag=0;
		while(flag==0) {
			menu();
			Scanner in2=new Scanner(System.in);
			choice=in2.nextInt();
			switch (choice) {
				case 1:
					go(choice);
					break;
				case 2:
					go(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("*************CaesarCipher*************");
		System.out.println("    "+"1.明文加密"+"      "+"2.密文解密"+"        "+"3.退出");
		System.out.println("**************************************");	
		System.out.print("请选择菜单功能:");
	}
	public static void go(int choice) {
		boolean flag=false;
		do {
			flag=false;
			if(choice==1)
				System.out.print("请输入明文:");
			else
				System.out.print("请输入密文:");
			Scanner in1=new Scanner(System.in);
			String message=in1.nextLine();
			System.out.print("请输入密钥:");
			Scanner in2=new Scanner(System.in);
			message=message.replaceAll("\\s*", "");
			try
			{
				key=in2.nextInt();
			}catch (Exception e) {
				flag=true;
				System.out.println("密钥必须为数字!请重新输入...");
			}
			if(flag!=true) {
				messageArray=message.toCharArray();
				for(i=0; i < messageArray.length; i++) {
					ASCII=Integer.valueOf(messageArray[i]);
					if(ASCII<65||(ASCII>90&&ASCII<97)||ASCII>122) {
						flag=true;
						System.out.println("请输入英文!请再次尝试...");
						break;
					}
					else
						switch (choice) {
						case 1:
							encode();
							break;
						case 2:
							decode();
							break;
						default:
							System.out.println("出错!");
							break;
						}
				}
			}
		}while(flag);
		System.out.print("密文为:");
		for(int i = 0; i < messageArray.length; i++)
			System.out.print(messageArray[i]);
	}
	public static void encode() {
		if(ASCII>=97&&ASCII<=122)//小写字母
			messageArray[i]=(char) ((ASCII+key-97)%26+97);
		else //大写字母
			messageArray[i]=(char) ((ASCII+key-65)%26+65);
	}
	public static void decode() {
		if(ASCII>=97&&ASCII<=122)//小写字母
			messageArray[i]=(char) ((ASCII-97+26-key)%26+97);
		else //大写字母
			messageArray[i]=(char) ((ASCII-65+26-key)%26+65);
	}
}

三、参考结果

在这里插入图片描述

有错误的地方欢迎指正~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值