首页 > 编程语言 >[连载]Java程序设计(05)---任务驱动方式:简单的加密/解密系统

[连载]Java程序设计(05)---任务驱动方式:简单的加密/解密系统

时间:2023-06-22 22:05:56浏览次数:41  
标签:Java String 05 plainText 接口 --- 密码 异或 public


任务:还是上一家公司,现在该公司在全国各地都设立了自己的分公司以拓展其核心业务,那么就需要利用互联网在全国各地的公司之间传递信息(我们假定这些信息就是文字信息),这些信息可能涉及一些商业机密,为此公司需要一套简单的加密和解密系统来避免直接在互联网上传递明文信息。目前拟定了两种方案,一种是用使用凯撒密码,另一种是使用简单异或密码。设计并实现该系统。

我们还是先对凯撒密码和异或密码做一个简单的解释。

凯撒密码是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。这个加密方法是以恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。

[连载]Java程序设计(05)---任务驱动方式:简单的加密/解密系统_接口优于抽象类

简单异或密码是密码学中一种简单的加密算法,它按照如下原则进行运算:


A 
 0 = A
A 
 A = 0
(A 
 B) 
 C = A 
 (B 
 C)
(B 
 A) 
 A = B 
 0 = B

其中

为逻辑异或(XOR)运算的符号。按这种逻辑,文本串行的每个字符可以通过与给定的密钥进行按位异或运算来加密。如果要解密,只需要将加密后的结果与密钥再次进行按位异或运算即可。

由于系统中存在两套加密和解密的方法,我们可以先为这两套方案设计一个公共的接口,这样在需要进行加密或解密时,只需要将接口类型实例化成具体的凯撒密码系统或简单异或密码系统就可以进行加密和解密了。也就是说,我们的密码系统有两种服务的方式,一种使用了凯撒密码另一种使用了简单异或密码,但是对调用者来说只需知道我们的系统中有加密和解密的方法,调用者并不关心具体的实现,这就是我们在上一章中提到的用服务的观点来审视多态。

在Java中可以使用interface关键字来定义接口,接口中的方法都是抽象方法,也就意味着实现了接口的类必须重写所有的抽象方法,否则该类仍然是抽象类。我们可以将接口视为一种约定,实现了接口的类必须实现接口中的方法;我们也可以将接口视为一种能力,实现了接口的类由于重写了接口中的方法就具备了接口所描述的能力;我们还可以将接口视为角色,一个类可以实现很多个接口,一个接口也可以被很多类实现,这就好比一个演员可以扮演多种角色,一个角色也可以由多个演员扮演。

该系统的代码如下:


package com.lovo.endec;

/**
 * 加解密系统的接口
 * @author 骆昊
 *
 */
public interface CipherSystem {

	/**
	 * 加密
	 * @param plainText 明文
	 * @return 密文
	 */
	public String encode(String plainText);
	
	/**
	 * 解密
	 * @param cipherText 密文
	 * @return 明文
	 */
	public String decode(String cipherText);
	
}



package com.lovo.endec;

/**
 * 凯撒密码系统
 * @author 骆昊
 *
 */
public class CaesarCipher implements CipherSystem {
	private int shift;	// 位移
	
	public CaesarCipher(int shift) {
		this.shift = shift;
	}
	
	@Override
	public String encode(String plainText) {
		plainText = plainText.toUpperCase();
		StringBuilder sb = new StringBuilder();
		for(int i = 0; i < plainText.length(); i++) {
			char currentChar = plainText.charAt(i);
			if(currentChar >= 'A' && currentChar <= 'Z') {
				sb.append((char)('A' + ((currentChar - 'A') + shift) % 26));
			}
			else {
				sb.append(currentChar);
			}
		}
		return sb.toString();
	}

	@Override
	public String decode(String cipherText) {
		cipherText = cipherText.toUpperCase();
		StringBuilder sb = new StringBuilder();
		for(int i = 0; i < cipherText.length(); i++) {
			char currentChar = cipherText.charAt(i);
			if(currentChar >= 'A' && currentChar <= 'Z') {
				sb.append((char)('A' + ((currentChar - 'A') - shift + 26) % 26));
			}
			else {
				sb.append(currentChar);
			}
		}
		return sb.toString();
	}

}



package com.lovo.endec;

/**
 * 简单异或密码系统
 * @author 骆昊
 *
 */
public class SimpleXORCipher implements CipherSystem {
	private int key;	// 秘钥
	
	public SimpleXORCipher(int key) {
		this.key = key;
	}

	@Override
	public String encode(String plainText) {
		StringBuilder cipherText = new StringBuilder();
		for(int i = 0; i < plainText.length(); i++) {
			cipherText.append((char)(plainText.charAt(i) ^ key));
		}
		return cipherText.toString();
	}

	@Override
	public String decode(String cipherText) {
		return encode(cipherText);
	}

}



package com.lovo.endec;

class CipherSystemTest {

	public static void showPlainText(CipherSystem sys, String text) {
		System.out.println(sys.decode(text));
	}
	
	public static void showCipherText(CipherSystem sys, String text) {
		System.out.println(sys.encode(text));
	}
	
	public static void main(String[] args) {
		String str1 = "I love you!";
		CipherSystem cs = new CaesarCipher(3);  // 使用凯撒密码
		showCipherText(cs, str1);
		String str2 = "L ORYH BRX!";
		showPlainText(cs, str2);
	}
}



package com.lovo.endec;

class CipherSystemTest {

	public static void showPlainText(CipherSystem sys, String text) {
		System.out.println(sys.decode(text));
	}
	
	public static void showCipherText(CipherSystem sys, String text) {
		System.out.println(sys.encode(text));
	}
	
	public static void main(String[] args) {
		String str1 = "I love you!";
		CipherSystem cs = new SimpleXORCipher(3);  // 使用简单异或密码
		showCipherText(cs, str1);
		String str2 = "J#oluf#zlv\"";
		showPlainText(cs, str2);
	}
}


大家可能已经注意到了,接口比抽象类更加抽象,接口本身也是不能实例化的,但是接口的使用却比抽象类更加灵活。在Java领域的经典著作《Effective Java》上讲到一条规则就是:接口优于抽象类。同时,该书还提到常量接口(定义一个接口来放置常量)是对接口不正确的使用方式。Java中的接口大致可以分为:单方法接口(接口中只有一个回调方法,例如:Runnable接口、ActionListener接口等)、标识接口(接口中没有任何方法,但是实现该接口却具备了某种能力,例如:Serializable接口、Cloneable接口等)、普通接口和常量接口。对接口的使用是Java程序设计中很有特点也是很有魅力的地方。

标签:Java,String,05,plainText,接口,---,密码,异或,public
From: https://blog.51cto.com/u_16166070/6535786

相关文章

  • PaLM 2全面反超反超GPT-4,谷歌官宣AI重构搜索,朝着ChatGPT微软开炮
    现在,谷歌搜索终于要加入AI对话功能了,排队通道已经开放。当然这还只是第一步。大的还在后面:全新大语言模型PaLM2正式亮相,谷歌声称它在部分任务超越GPT-4。Bard能力大更新,不用再排队等候,并支持新语言。谷歌版AI办公助手也一并推出,将在Gmail中抢先亮相。谷歌云也上线多个基础大模型,为......
  • 历史最全Java资源大全中文版整理分享
       很多程序员应该记得GitHub上有一个Awesome-XXX系列的资源整理。本资源对Java相关的资源列表进行翻译和整理,内容包括:构建工具、数据库、框架、模板、安全、代码分析、日志、第三方库、书籍、Java站点等。分享给需要的朋友。目录内容截图......
  • 文心一言 VS 讯飞星火 VS chatgpt (44)-- 算法导论6.1 1题
    一、在高度为h的堆中,元素个数最多和最少分别是多少?文心一言:在高度为h的二叉搜索树(BST)中,元素个数最多和最少的情况分别如下:1.最多情况:当每个节点都包含两个子节点时,BST中的元素个数最多。此时,BST中的元素个数为2^(h+1)-1。2.最少情况:当BST是一棵满二叉树时,BST中的元......
  • 2023-06-22:一所学校里有一些班级,每个班级里有一些学生,现在每个班都会进行一场期末考试
    2023-06-22:一所学校里有一些班级,每个班级里有一些学生,现在每个班都会进行一场期末考试给你一个二维数组classes,其中classes[i]=[passi,totali]表示你提前知道了第i个班级总共有totali个学生,其中只有passi个学生可以通过考试给你一个整数extraStudents,表示额外有......
  • 学习笔记-第12天-命令合集11
    1.passwd给用户设置密码用户自己给自己设置密码直接:passwd.[root@localhost~]#passwdChangingpasswordforuserroot.Newpassword:BADPASSWORD:Thepasswordisshorterthan8charactersRetypenewpassword:passwd:allauthenticationtokensupdatedsuccessfu......
  • 学生信息管理系统-C语言版
    环境操作系统:Windows11编译器:GCC源代码函数较多,自定义头文件,主文件引入即可头文件:functions.h头文件所对应的源文件:functions.c主文件:学生信息管理系统.cfunctions.h#ifndef_FUNCTINOS_H_#define_FUNCTINOS_H_#defineMAX_STU100typedefstructStudents{ cha......
  • 第三次java博客
    在Java编程领域中,掌握如何读取和处理用户输入数据是非常基础和重要的一步。我们需要从用户那里获取输入数据,并根据输入数据进行相应的操作或计算。在这篇博客中,我们将会探讨如何在Java程序中读取和处理用户输入数据,以及如何利用这些数据来完成一些常见的任务,比如计算平均分和总成......
  • 鸾书精华(7)--修道过程等
    鸾书善书下载地址:https://www.cnblogs.com/zping/p/17496750.html 对待鸾文态度:    1,《理天游记》----第廿二回 师徒论扶鸾方便度众莫执着济佛曰:由此可知扶鸾之法可用,但是用得必须恰当,因为用之恰当即是度人的法宝,用之不恰当即是恼人的法器,所以看扶鸾的鸾文,也必须以平......
  • java Condition类的详细介绍
    一、condition介绍及demoCondition是在java1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、notify(),使用Condition的await()、signal()这种方式实现线程间协作更加安全和高效。因此通常来说比较推荐使用Condition,阻塞队列......
  • Linux之CentOS 7 安装-最小
    感谢原博主:https://blog.csdn.net/qq_44737094/article/details/1166517901.安装vmware安装很简单这里提供安装包常用编程安装包阿里云盘2.下载centos7镜像链接:https://pan.baidu.com/s/1L0SPwYxmYwFjogRPbhXHSw提取码:50j43.在vmware中安装(最小化)centos71.文件–>......