热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java实现凯撒密码的简易加解密程序

本文介绍了如何使用Java编程语言实现凯撒密码的加密与解密功能。凯撒密码是一种替换式密码,通过将字母表中的每个字母向前或向后移动固定数量的位置来实现加密。
Java实现凯撒密码的简易加解密程序

1. 凯撒密码简介

凯撒密码源于古罗马时期的军事通信,由当时的军事统帅朱利叶斯·凯撒发明,用于保护信息不被敌方截获。该密码的工作原理是通过将原文中的每个字母按固定的位数向前或向后移动,形成新的字母,以此达到加密的效果。例如,若设定偏移量为3,则字母A会变成D,B变成E,以此类推。

2. 程序需求分析

为了实现凯撒密码的加解密功能,需要用户输入待加密的文本和一个作为密钥的数字。程序根据这个数字对文本中的每个字符进行相应的位移操作,完成加密过程。解密则是加密的逆过程,使用相同的密钥对加密后的文本进行反向位移,恢复原始文本。

3. 技术原理

  • 在Java中,可以通过ASCII码对字符进行数学运算来实现字符的位移。对于大写字母和小写字母,它们的ASCII码范围分别是65-90和97-122。当字符经过位移后超出了这些范围时,需要通过取模运算来调整回正确的范围内。
  • 具体来说,如果字符是小写字母且位移后超过了'z',则应减去26使其回到小写字母的起始位置;如果是大写字母且位移后超过了'Z',同样减去26。相反地,如果位移导致字符低于'a'或'A',则应加上26。

4. 示例代码

import java.util.Scanner;

public class CaesarCipher {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请选择操作:[E] 加密 [D] 解密");
String choice = scanner.nextLine();
if (choice.equalsIgnoreCase("E")) {
encrypt(scanner);
} else if (choice.equalsIgnoreCase("D")) {
decrypt(scanner);
}
}

private static void encrypt(Scanner scanner) {
System.out.println("请输入明文:");
String plainText = scanner.nextLine();
System.out.println("请输入密钥:");
int key = scanner.nextInt();
String encryptedText = shiftText(plainText, key);
System.out.println("加密后的文本为:" + encryptedText);
}

private static void decrypt(Scanner scanner) {
System.out.println("请输入密文:");
String cipherText = scanner.nextLine();
System.out.println("请输入密钥:");
int key = scanner.nextInt();
String decryptedText = shiftText(cipherText, -key);
System.out.println("解密后的文本为:" + decryptedText);
}

private static String shiftText(String text, int key) {
StringBuilder result = new StringBuilder();
for (char character : text.toCharArray()) {
if (Character.isLetter(character)) {
char base = Character.isUpperCase(character) ? 'A' : 'a';
char shiftedChar = (char) (((character + key - base) % 26) + base);
result.append(shiftedChar);
} else {
result.append(character);
}
}
return result.toString();
}
}

5. 运行结果

以下是程序运行的结果示例,展示了如何对文本进行加密和解密:

加密示例:
加密示例

解密示例:
解密示例


推荐阅读
  • Lua字符串1.字符串常见形式字符串或串(String)是由数字、字母、下划线组成的一串字符。Lua语言中字符串可以使用以下三种方式来表示:•单引号间的一串字符。 ... [详细]
  • java datarow_DataSet  DataTable DataRow 深入浅出
    本篇文章适合有一定的基础的人去查看,最好学习过一定net编程基础在来查看此文章。1.概念DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据 ... [详细]
  • Hadoop MapReduce 实战案例:手机流量使用统计分析
    本文通过一个具体的Hadoop MapReduce案例,详细介绍了如何利用MapReduce框架来统计和分析手机用户的流量使用情况,包括上行和下行流量的计算以及总流量的汇总。 ... [详细]
  • 本文探讨了Linux环境下线程私有数据(Thread-Specific Data, TSD)的概念及其重要性,介绍了如何通过TSD技术避免多线程间全局变量冲突的问题,并提供了具体的实现方法和示例代码。 ... [详细]
  • 本报告记录了嵌入式软件设计课程中的第二次实验,主要探讨了使用KEIL V5开发环境和ST固件库进行GPIO控制及按键响应编程的方法。通过实际操作,加深了对嵌入式系统硬件接口编程的理解。 ... [详细]
  • 个人博客:打开链接依赖倒置原则定义依赖倒置原则(DependenceInversionPrinciple,DIP)定义如下:Highlevelmo ... [详细]
  • 如何使用Maven将依赖插件一并打包进JAR文件
    本文详细介绍了在使用Maven构建项目时,如何将所需的依赖插件一同打包进最终的JAR文件中,以避免手动部署依赖库的麻烦。 ... [详细]
  • 使用Java计算两个日期之间的月份数
    本文详细介绍了利用Java编程语言计算两个指定日期之间月份数的方法。文章通过实例代码讲解了如何使用Joda-Time库来简化日期处理过程,旨在为开发者提供一个高效且易于理解的解决方案。 ... [详细]
  • 本文总结了 #define 在 C/C++ 编程中的多种用途和技巧,包括定义常量、函数、宏以及条件编译等,并提供了详细的示例和注意事项。 ... [详细]
  • 本文旨在探讨Swift中的Closure与Objective-C中的Block之间的区别与联系,通过定义、使用方式以及外部变量捕获等方面的比较,帮助开发者更好地理解这两种机制的特点及应用场景。 ... [详细]
  • 本文探讨了如何使用Scrapy框架构建高效的数据采集系统,以及如何通过异步处理技术提升数据存储的效率。同时,文章还介绍了针对不同网站采用的不同采集策略。 ... [详细]
  • Gradle 是 Android Studio 中默认的构建工具,了解其基本配置对于开发效率的提升至关重要。本文将详细介绍如何在 Gradle 中定义和使用共享变量,以确保项目的一致性和可维护性。 ... [详细]
  • 设计一个算法,用于计算给定字符串中出现的不同ASCII字符数量。该任务将重点考察字符串处理、集合操作以及基础的输入输出技术。 ... [详细]
  • 编码unicode解决了语言不通的问题.但是.unicode又有一个新问题.由于unicode是万国码.把所有国家的文字都编进去了.这就导致一个unicode占用的空间会很大.原来 ... [详细]
  • 本文基于Java官方文档进行了适当修改,旨在介绍如何实现一个能够同时处理多个客户端请求的服务端程序。在前文中,我们探讨了单客户端访问的服务端实现,而本篇将深入讲解多客户端环境下的服务端设计与实现。 ... [详细]
author-avatar
痴情小猪噜噜1907181048
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有